All guides

Cookieless visitor statistics in WordPress: install, avoid double counting, verify a form

Last checked:

Three steps. Install the Savri Analytics plugin from the WordPress directory and paste your site ID. Make sure the measurement script appears exactly once in your pages, because a second copy doubles every pageview. Turn on form tracking, send a test message and check that the event arrives, knowing that the automatic event counts the button press, not a delivered message.

We tested each step on 12 October 2026 on a local test site in WordPress Playground, running WordPress 7.1.2, Savri Analytics 1.2.0 and Contact Form 7 6.2.2. Every request the script tried to send was captured in the browser and counted; nothing was sent to a Savri account. Where a statement comes from reading the code rather than from the test, we say so.

What “without cookies” means here

The plugin adds one script tag to your public pages. That script sets no cookies and uses no browser storage. Each pageview is sent to Savri with the page address, the referrer, the browser’s user agent string and the screen width. The visitor count is based on a daily hash, so the same person is counted again on the next day. Details are in the plugin’s directory listing and in our privacy policy.

This describes what the plugin stores. It is not legal advice about your site. Other plugins and embedded services on the same pages may have their own consent requirements.

Step 1: install the plugin and confirm the first visit

Do this: in WordPress, open Plugins, choose to add a new plugin, search for “Savri Analytics”, install and activate it. WordPress documents the plugin screen. Then open Settings, Savri Analytics, paste the site ID from your site’s settings in Savri, choose the domain where you registered (savri.io or besokskollen.se) and save.

What the settings page contains: in our test, the defaults after activation were an empty site ID, savri.io as the domain, outbound links, file downloads, form submissions and scroll depth switched off, AI crawler reporting and site search tracking switched on, and “Exclude Administrators” switched off. Tick “Track form submissions” now if you want to follow step 3.

Check it: in Savri, use “Verify installation” in the site’s settings. It reads the HTML of your start page and reports whether the script is missing, points at another site ID, or appears more than once. It does not check other pages. Then open your site in a browser where you are logged out and look for the visit in the site overview. There is no historical data: measurement starts when the plugin is active.

What we saw: after saving the site ID, the start page and a contact page each contained exactly one script tag, and each page load sent exactly one pageview. The tag sat in the page head, marked with an HTML comment that names the plugin.

Step 2: avoid double counting

Double counting means the same page load is reported twice. In Savri it shows up as pageviews roughly twice the number of visitors, and pages per visitor close to two, while sources and countries look normal. Unique visitors are not doubled, because the visitor ID is the same for both requests. We confirmed in the code that the script has no guard against being loaded twice: every copy sends its own pageview with its own delivery ID.

How it happens

  • Plugin plus a pasted snippet. The installation guide offers four ways to add the script: the plugin, the theme’s header field, a code snippet plugin or functions.php. Use one of them. If you tried a manual method first and later installed the plugin, the manual copy is still there.
  • A staging copy with the same site ID. The script only knows the site ID, so a test copy of your site reports into the same statistics. Deactivate the plugin on the copy, or give the copy its own site in Savri.
  • Your own visits. Logged-in administrators are counted until you tick “Exclude Administrators”. The option covers the administrator role only, which WordPress describes in its roles documentation. Editors, authors and your own logged-out visits are still counted. This is not double counting, but it inflates small sites in the same way.

What we measured

We added the functions.php snippet from our installation guide through the WordPress Theme File Editor while the plugin was active, then removed it again. Then we ticked “Exclude Administrators”, loaded the pages as the logged-in administrator and again after logging out.

Our own test on a local WordPress Playground site, 12 October 2026. One page load per row.
SetupScript tags in the HTMLPageviews sent
Plugin only11
Plugin and the functions.php snippet22
Plugin, administrators excluded, logged in as administrator00
Plugin, administrators excluded, logged out11

We also ran the HTML of the double setup through the same check that “Verify installation” uses. It reported “multiple scripts”. The single setup passed.

How to find and remove it

Open your start page, view the page source and search for script.js. You should find one tag with your site ID. If there are two, remove the manual copy: the header field in the theme customizer, the snippet plugin or the lines in functions.php. Keep the plugin, because it also adds the server-side crawler report and the search events that a pasted snippet cannot. Then run “Verify installation” again and compare visitors and pageviews for a full day before and after.

One related failure comes from reading the code, not from the test: the script reads its site ID from its own tag. An optimisation plugin that merges or rewrites script tags can strip that attribute, and then nothing is sent at all. If visits stop after you enable such a plugin, exclude script.js from it.

Step 3: check that a form submission is recorded

Three things are easy to confuse: a visitor opens the page with the form, a visitor presses the submit button, and the message is actually delivered. The plugin’s “Track form submissions” option listens for the browser’s submit event on any form. It records an event named Form Submit with the form’s id or name and its action address. It does not know whether the form plugin accepted the message.

What we measured: we used Contact Form 7, a free form plugin from the WordPress directory, with its default contact form on a page. Pressing submit with every field empty produced three validation errors in the form and one Form Submit event. Filling in the fields and submitting produced the message “Thank you for your message. It has been sent.” and one more Form Submit event. One delivered message, two events. The form had no id or name, so the event carried unnamed as the form name.

If you need the delivered count: Contact Form 7 fires its own browser event, wpcf7mailsent, only when the message was sent. Its DOM events documentation lists it alongside wpcf7invalid for validation failures. Add this snippet to your site, for example through the same code snippet plugin or functions.php you would use for any script, and it sends a separate event:

document.addEventListener('wpcf7mailsent', function () {
  va('event', 'Contact form sent');
});

In our test, with that listener in place, the empty submission sent Form Submit only, and the successful submission sent Form Submit and Contact form sent. The listener was injected into the page during the test; on a real site it has to be added to the theme or a snippet plugin. Other form plugins have their own events or a thank-you page. A thank-you page can be counted with a pageview goal instead.

Where to see it in Savri: open Goals, create a goal of the event type and enter the exact event name, Form Submit or Contact form sent. “Test match” lists matching events from the last 30 days, so you can confirm that your test arrived before you save. Goals count from the moment they are created. Custom events and goals are included from the Basic plan, see pricing. The plugin option itself has no separate fee.

What the plugin does not do

  • It does not create a cookie banner and it does not remove the need for one that other plugins on your site may require.
  • It does not back-fill statistics from before it was installed.
  • It does not exclude your own logged-out visits, or visits by editors and authors.
  • It does not know whether a form message was delivered, or whether a visitor who submitted a form is a person. Bot filtering happens on the Savri side.
  • Its server-side features, the AI crawler report and the search events, only run when a request reaches WordPress. A full-page cache can serve pages without that. The pageview script is part of the cached HTML and keeps working.
  • It does not track WooCommerce purchases as events. That needs custom events.

Can you do this with another analytics tool?

The checks are the same for any script-based tool. Count the script tags in the page source, exclude your own visits with whatever option the tool offers, and decide what “a form submission” should mean before you create a goal. Whether the tool records a form event automatically, and whether it can be matched to the form plugin’s success signal, depends on that tool’s documentation.

Sources: the Savri Analytics listing in the WordPress plugin directory, version 1.2.0, and the plugin and script code; the Contact Form 7 DOM events documentation; the WordPress documentation pages linked above. All read on 12 October 2026. The test figures are from our own local test on the same day.