Chatlytics - Click to Chat Button with Routing & Analytics
A floating WhatsApp chat button with pre-filled message templates, per-page number routing and click analytics. Nothing is loaded from a remote server and no personal data is collected.
Submitted to the WordPress.org plugin directory and awaiting review.
Why it exists
Most chat button plugins put a button on your site and leave you guessing. You can see that traffic arrives and you can see that messages sometimes come in, but nothing connects the two.
Chatlytics shows you the numbers. Every click is recorded in a table on your own site and reported inside wp-admin. There is no third party service to sign up for and nothing to configure in Google Analytics.
For a lot of businesses this is the channel customers actually use. A contact form is a message into a void that may be answered in two days. A chat thread is a conversation that starts now.
What it does
Why it matters
A button you cannot measure is a button you cannot argue about. Without numbers, the decision to move it, reword it or point it at a different person is guesswork, and the usual fallback is to leave it exactly where it is for a year. Clicks per page and per routing rule turn that into a question you can answer in an afternoon: this rule earns its place, that one has never fired, this page is where people actually ask.
How it works
The button builds a standard wa.me link. There is no API and no external service, and there is no account to connect. You enter your number in international format, for example 15551234567, and the plugin strips spaces, plus signs and punctuation before saving.
Clicks are sent to a REST endpoint that carries no nonce, so the plugin keeps working behind a full page cache. A nonce is tied to a session and goes stale in a cached page, which is why plugins that use one quietly stop counting the moment caching is turned on. Device visibility is handled with a CSS breakpoint for the same reason, rather than detecting the device when the page is rendered.
Known campaign parameters such as utm_source, fbclid and gclid are stripped before storing the URL, so one page is one row in the report rather than fifteen. Other query parameters are kept, so the report still works on sites using plain permalinks.
Duplicate clicks from the same visitor are suppressed and the endpoint is rate limited, with no cookies and no stored IP addresses.
Frontend CSS loads only where a button will actually render, and the tracking script only when analytics are turned on. Admin styles load only on the plugin's own screens.
The button stacking order is filterable, for sites that already have something in that corner:
- add_filter( 'chatlytics_button_z_index', function () { return 100; } );
Requirements and limits
- A WhatsApp number in international format
- Licensed GPLv2 or later
What it does not do
Routing covers pages, posts, categories and a default fallback. It does not cover tags, custom taxonomies or custom post types.
There is no scheduling, so you cannot show the button only during business hours. There is no shared team inbox and no conversation history: once the visitor taps through, the conversation lives in WhatsApp, not here.
Analytics count clicks on the button. They cannot tell you whether the conversation converted, because nothing reports that back to your site.
Click analytics are off by default. A site that never turns them on gets the button and an empty report, which is the intended behaviour rather than a fault.
Chatlytics is not affiliated with, endorsed by, or connected to WhatsApp or Meta Platforms, Inc. It builds standard wa.me links, which is a public feature of the WhatsApp service.
Getting the setup right
Turn analytics on first. They are off until you turn them on, which is the right default for privacy and the wrong one for finding out whether any of this works. A week of data before you start changing things is worth more than a week of adjusting the button colour.
The message template is the setting most often left alone and the one that pays back fastest. An empty default message wastes the main advantage the plugin has over a bare link. A pre-filled "Hi, I have a question about {page_title}" removes the friction of deciding what to say and means the enquiry arrives already labelled with the page it came from.
Routing is worth configuring only once you have more than one destination. If everything goes to a single number, leave it on the default and skip the rules. Where it earns its keep is a site with genuinely different enquiry types, such as a pricing page that should reach sales and a documentation section that should reach support. Set the default first, add specific rules second, and remember the first match wins.
Once a few weeks of clicks are in, read the per rule breakdown before adding any more rules. A rule that has never fired is either pointed at a page nobody visits or shadowed by a rule earlier in the order, and both are worth knowing before you write a fifth one.
Frequently asked questions
What format should the WhatsApp number use?
International format as used by wa.me, for example 15551234567. Spaces, plus signs and punctuation are stripped before saving.
Do I need a Google Analytics account?
No. Clicks are stored on your own site and reported inside wp-admin. There is nothing to configure in Google Analytics and no third party service to sign up for.
Does the tracking survive a caching plugin?
Yes. Clicks are sent to a REST endpoint that carries no nonce, so it keeps working behind a full page cache. Device visibility is handled with a CSS breakpoint rather than by detecting the device when the page is rendered, for the same reason.
What exactly is stored for each click?
The page URL, the time, mobile or desktop, the post ID when the click happened on a single post or page, and the routing rule that supplied the number. No IP address, no cookie, no user agent, no personal data.
How do routing rules work?
Page, then post, then category, then default fallback. The first match wins.
Which variables can I use in a message template?
{page_title}, {url} and {site_name}, replaced when the button renders.
Can I place the button inside a post instead of floating it?
Yes. Use the [chatlytics_button] shortcode, which accepts text, number and align, or the Chat Button block in the editor.
Can I move the button so it does not collide with another chat widget?
Yes. Set the distance from the bottom in the settings, or change the stacking order with the chatlytics_button_z_index filter.
Does it slow the site down?
Frontend CSS loads only where a button will actually render, and the tracking script only when analytics are turned on. Nothing is fetched from a remote host.
What happens to my data if I delete the plugin?
Everything is removed on uninstall, on single sites and across a multisite network. There is also a retention setting with a daily cleanup and a one click wipe if you want to clear the table without uninstalling.
How is this different from Zignites Chat?
This is the button and its reporting. Zignites Chat is a WooCommerce integration with order notifications, a chatbot widget and opt-out handling through Twilio or the WhatsApp Cloud API. If you want a link customers can tap and a record of who tapped it, this is the smaller option.
Where do I get support?
The plugin is awaiting review in the WordPress.org directory. Until the listing is approved, contact us through the contact page and we will help directly. Once it is live, the WordPress.org support forum is the place to ask.
Related plugins
Zignites Chat
WhatsApp order notifications and a floating chat widget for WooCommerce. Works with Twilio or the WhatsApp Cloud API, using your own business number.
View WooCommerceZignites Chat Pro
Cart recovery, post-purchase follow-ups, bulk campaigns, analytics and A/B testing on top of the free Zignites Chat.
View UtilitiesCustom Accordion Slider
A lightweight accordion slider widget for Elementor. Responsive tabbed content with smooth transitions.
ViewInterested in Chatlytics?
The directory listing is still queued for review. Tell us about your site and we will send you a build in the meantime.