All guides

Why your analytics under-reports, and what to do about it

Marketing6 min read

Someone compares the leads in the CRM against the conversions in analytics and the two numbers disagree. Then a fortnight goes into working out which one is broken.

Neither is broken. Analytics under-counts for reasons that are documented and mostly outside your control, and once you know which reasons apply to your site you can stop treating the gap as a bug and start correcting for it.

Safari deletes your measurement after seven days

WebKit’s Intelligent Tracking Prevention caps the expiry of cookies written by JavaScript at seven days. It also deletes a site’s script-writable storage, which covers LocalStorage, IndexedDB, SessionStorage and Service Worker registrations, after seven days of Safari use without interaction on that site.

Read that again in terms of your funnel. A visitor arrives from a Google Ads click on a Monday, browses, leaves. They come back three weeks later and convert. In Safari, that second visit is a brand new user from a direct source, because the identifier that connected the two visits expired.

Any sales cycle longer than a week is affected. B2B is affected badly. If your analytics shows an implausible volume of direct traffic converting, and your actual customers tell you they found you through search or an ad, this is usually why.

If your banner blocks analytics until someone clicks accept, everyone who ignores it, closes it, or leaves before deciding is invisible. That group is not random. It skews toward people who bounce quickly, which means your bounce rate looks better than reality and your average session duration looks longer.

Google’s Consent Mode exists to soften this by sending cookieless pings when consent is denied, letting the platform model the missing conversions rather than dropping them entirely. Modelled data is an estimate. It is better than a hole, and it is worth knowing which of your numbers are measured and which are inferred.

Ad blockers take another slice

A meaningful share of technical audiences run content blockers that stop analytics requests outright. The exact number depends entirely on who visits your site, so anyone quoting you a universal percentage is guessing. A site serving developers loses far more than a site serving retirees.

You can measure your own rate approximately. Compare server-side request logs for a page against client-side pageviews for the same page over the same window. The difference is roughly your blocked share, and it is usually larger than people expect.

First-party and server-side measurement

The common thread across all three problems is that measurement lives in the visitor’s browser, in storage the browser is increasingly willing to throw away. Moving collection server-side changes that. Your server receives the request regardless of what the browser blocks, and cookies set with an HTTP response header rather than JavaScript are not subject to the seven-day cap.

This is not a loophole and it should not be treated as one. Server-side collection makes over-collection easy, which is exactly when privacy obligations get serious. Collect the same things you would have collected client-side, honour the same consent signals, and document what you keep. The point is accuracy on the data you were already entitled to, not a route around consent.

Self-hosted analytics tools solve part of this by being first-party by default. Requests go to your own domain, so blocklists that target known third-party endpoints do not fire. Many run without cookies at all, which reduces the consent burden considerably.

Reconcile against something real

The single most useful habit here is treating analytics as directional and your business systems as authoritative.

Leads in the CRM are countable. Invoices are countable. Analytics is a sample with known biases, and it is very good at telling you that organic search converts visitors at three times the rate of paid social. It is unreliable at telling you exactly how many, and it will misattribute a proportion of long sales cycles to direct traffic no matter how carefully you configure it.

So set the expectation early with whoever reads the reports. Pick one number as the source of truth for revenue, usually the CRM or the accounting system, and use analytics to explain the shape of what happens before that number moves. Getting source data into the CRM at the point of enquiry is what makes this possible, and that is covered in speed to lead.

A short checklist

Check whether your analytics cookie is set by JavaScript or by an HTTP header, because that determines whether Safari caps it. Compare a week of server logs against a week of pageviews to estimate your blocked share. Confirm whether your consent banner blocks measurement entirely or degrades to modelled data. Then pick your authoritative revenue number and write it down somewhere the whole team can see.

None of that requires new tooling. It requires knowing which of your numbers are real.

If the gap between your analytics and your invoices is currently unexplained, that is a solvable problem and a good place for us to start. Read about how we handle marketing, or get in touch.

References