◆ 11 checks · nothing is stored · no account connected

Is your analytics actually working?

Most sites are quietly losing data — a dead Universal Analytics snippet, two copies of GA4 firing at once, consent signals missing. This reads the tracking code your pages already serve publicly. No Google login. No account connection. No access granted to anyone.

Enter just the domain. We fetch the public homepage — nothing else.

Try:
0out of 100
—
What this is costing you
Order-of-magnitude estimates only — your own GA4 data is authoritative.
What this tool cannot do Reading published code shows what is installed, not what fires. Server-side container internals, whether a tag actually fires on a given page, and dataLayer runtime state all require your Google login. Confirm those in GTM Preview and GA4 DebugView — this is a first pass, not a replacement.

What we check, and why each one matters

Universal Analytics stopped processing data in July 2023 and all of its history was deleted in July 2024. Millions of sites are still running the old snippet while believing their numbers are real. These checks find that class of problem in about two seconds.

Dead UA code

The snippet still downloads ~45 KB on every page load and collects nothing. It also makes consent scanners report a broken cookie setup.

Duplicate GA4

Two tags double-count every event. Traffic looks plausible while conversions are inflated — and Google Ads learns from the inflated numbers.

Missing consent signals

Consent Mode v2 is required for EEA advertising. Without it, lost conversions get modelled and remarketing audiences shrink.

Client-side only

Ad blockers and privacy settings remove conversions before they are counted. Around 30% of internet users run an ad blocker (GWI, Q2 2025); how much it costs you depends on how privacy-minded your audience is.

Every check we run

Eleven checks, grouped by how much damage a failure causes. Each one links to a page explaining how we detect it, what the broken code actually looks like, and how to fix it — including the cases where our own check will report something that does not match reality.

How the score works

A single number is only useful if you know how it was produced. Ours is deliberately weighted so that silent failures cannot hide behind a healthy-looking average.

Severity weights

Each check carries a severity, and the score is a weighted average rather than a plain one. The reason is specific: a site with two copies of the GA4 tag still reports plausible traffic. Simple averaging would let that configuration score above 60 and read as "mostly fine", when in fact every conversion is inflated and Google Ads is learning from a wrong signal.

SeverityWeightWhat the failure costs you
critical1.6 Numbers are silently wrong. Traffic looks normal, decisions come out wrong.
high1.0 Visible problem with a measurable cost in lost data or page weight.
medium0.5 Indirect effect. Breaks measurement quality or distribution instead of tracking.
optional0.25 An improvement. Depends on your traffic mix and budget, not required to function.

Status values

Within a severity band, every check resolves to one of three states. Pass contributes nothing. Warn counts as 0.4. Fail counts as 1.0.

A warning is not a softer failure. It means "this may be broken and we cannot tell from the code alone" — for example, a Tag Manager container that exists but whose internals we cannot read without a Google login.

Why critical failures cap the score

Every critical failure caps the total at 100 minus 18 per failure. Two critical failures means the score cannot exceed 64, no matter how many optional checks pass.

This is intentional. Some failures are not additive. A site with no analytics at all and a site with analytics that double-counts every conversion are different problems, but neither is "half broken" — and a weighted average alone would let the second one hide behind passing optional checks.

Reading the verdict line

The verdict is generated from the findings, not the score alone. If any critical check fails, it says so explicitly instead of showing "healthy" beside a red failure count — a contradiction that would rightly destroy your trust in the number.

What the score does not tell you

It reflects configuration, not performance. A 100 means nothing is obviously misconfigured. It does not mean your data is correct, your campaigns are profitable, or your tags fire as intended. Those require GTM Preview and GA4 DebugView, both of which need your Google login.

What we key on, and what we deliberately skip

Tracking platforms change their requirements regularly. Each check below is tied to a primary source rather than to a blog post describing it.

Signals we detect

What we refuse to do

No login, no OAuth, no access to your account, no crawling behind authentication, and no storage of the pages you submit. Submitted HTML is analysed in memory and discarded; results are held for five minutes only to avoid refetching the same site.

This is a constraint we chose rather than a limitation we worked around. It is also the reason several checks stop at "installed" and cannot confirm "firing" — a line we keep visible on every result page rather than hiding behind confident phrasing.

Every check we run

Eleven checks, grouped by how much damage a failure causes. Each one links to a page explaining how we detect it, what the broken code actually looks like, and how to fix it — including the cases where our own check will report something that does not match reality.

How the score works

A single number is only useful if you know how it was produced. Ours is deliberately weighted so that silent failures cannot hide behind a healthy-looking average.

Severity weights

Each check carries a severity, and the score is a weighted average rather than a plain one. The reason is specific: a site with two copies of the GA4 tag still reports plausible traffic. Simple averaging would let that configuration score above 60 and read as "mostly fine", when in fact every conversion is inflated and Google Ads is learning from a wrong signal.

SeverityWeightWhat the failure costs you
critical1.6 Numbers are silently wrong. Traffic looks normal, decisions come out wrong.
high1.0 Visible problem with a measurable cost in lost data or page weight.
medium0.5 Indirect effect. Breaks measurement quality or distribution instead of tracking.
optional0.25 An improvement. Depends on your traffic mix and budget, not required to function.

Status values

Within a severity band, every check resolves to one of three states. Pass contributes nothing. Warn counts as 0.4. Fail counts as 1.0.

A warning is not a softer failure. It means "this may be broken and we cannot tell from the code alone" — for example, a Tag Manager container that exists but whose internals we cannot read without a Google login.

Why critical failures cap the score

Every critical failure caps the total at 100 minus 18 per failure. Two critical failures means the score cannot exceed 64, no matter how many optional checks pass.

This is intentional. Some failures are not additive. A site with no analytics at all and a site with analytics that double-counts every conversion are different problems, but neither is "half broken" — and a weighted average alone would let the second one hide behind passing optional checks.

Reading the verdict line

The verdict is generated from the findings, not the score alone. If any critical check fails, it says so explicitly instead of showing "healthy" beside a red failure count — a contradiction that would rightly destroy your trust in the number.

What the score does not tell you

It reflects configuration, not performance. A 100 means nothing is obviously misconfigured. It does not mean your data is correct, your campaigns are profitable, or your tags fire as intended. Those require GTM Preview and GA4 DebugView, both of which need your Google login.

What we key on, and what we deliberately skip

Tracking platforms change their requirements regularly. Each check below is tied to a primary source rather than to a blog post describing it.

Signals we detect

What we refuse to do

No login, no OAuth, no access to your account, no crawling behind authentication, and no storage of the pages you submit. Submitted HTML is analysed in memory and discarded; results are held for five minutes only to avoid refetching the same site.

This is a constraint we chose rather than a limitation we worked around. It is also the reason several checks stop at "installed" and cannot confirm "firing" — a line we keep visible on every result page rather than hiding behind confident phrasing.

Every check we run

Eleven checks, grouped by how much damage a failure causes. Each one links to a page explaining how we detect it, what the broken code actually looks like, and how to fix it — including the cases where our own check will report something that does not match reality.

How the score works

A single number is only useful if you know how it was produced. Ours is deliberately weighted so that silent failures cannot hide behind a healthy-looking average.

Severity weights

Each check carries a severity, and the score is a weighted average rather than a plain one. The reason is specific: a site with two copies of the GA4 tag still reports plausible traffic. Simple averaging would let that configuration score above 60 and read as "mostly fine", when in fact every conversion is inflated and Google Ads is learning from a wrong signal.

SeverityWeightWhat the failure costs you
critical1.6 Numbers are silently wrong. Traffic looks normal, decisions come out wrong.
high1.0 Visible problem with a measurable cost in lost data or page weight.
medium0.5 Indirect effect. Breaks measurement quality or distribution instead of tracking.
optional0.25 An improvement. Depends on your traffic mix and budget, not required to function.

Status values

Within a severity band, every check resolves to one of three states. Pass contributes nothing. Warn counts as 0.4. Fail counts as 1.0.

A warning is not a softer failure. It means "this may be broken and we cannot tell from the code alone" — for example, a Tag Manager container that exists but whose internals we cannot read without a Google login.

Why critical failures cap the score

Every critical failure caps the total at 100 minus 18 per failure. Two critical failures means the score cannot exceed 64, no matter how many optional checks pass.

This is intentional. Some failures are not additive. A site with no analytics at all and a site with analytics that double-counts every conversion are different problems, but neither is "half broken" — and a weighted average alone would let the second one hide behind passing optional checks.

Reading the verdict line

The verdict is generated from the findings, not the score alone. If any critical check fails, it says so explicitly instead of showing "healthy" beside a red failure count — a contradiction that would rightly destroy your trust in the number.

What the score does not tell you

It reflects configuration, not performance. A 100 means nothing is obviously misconfigured. It does not mean your data is correct, your campaigns are profitable, or your tags fire as intended. Those require GTM Preview and GA4 DebugView, both of which need your Google login.

What we key on, and what we deliberately skip

Tracking platforms change their requirements regularly. Each check below is tied to a primary source rather than to a blog post describing it.

Signals we detect

What we refuse to do

No login, no OAuth, no access to your account, no crawling behind authentication, and no storage of the pages you submit. Submitted HTML is analysed in memory and discarded; results are held for five minutes only to avoid refetching the same site.

This is a constraint we chose rather than a limitation we worked around. It is also the reason several checks stop at "installed" and cannot confirm "firing" — a line we keep visible on every result page rather than hiding behind confident phrasing.

Questions

Do I need to sign in or connect my Google account?
No. This reads the same public files a browser would load — gtag.js and the GTM container script. Nothing is authenticated, so nothing is accessed. That is also the limit: anything behind a login cannot be checked here.
Is my data stored?
Pages are fetched, analysed in memory, and discarded. Nothing is written to disk and there is no account system. Results are cached for 5 minutes in memory only to avoid refetching the same site repeatedly.
The fetch failed with 403. What now?
Some sites block automated requests. Open the page, press Ctrl+U (or View Source), select all, copy, and use the "Paste page HTML" tab instead. That path never touches the network at all.
Can this prove my tags are firing correctly?
No, and it would be dishonest to claim otherwise. Static analysis tells you what is installed. To verify firing you need GTM Preview (which shows tags triggering on interaction) and GA4 DebugView (which shows events arriving). Both need your login.
Why is a dead UA snippet a "critical" problem?
Because it fails silently. The page loads fine, the console is clean, and the tag manager shows the snippet present. The only symptom is that the numbers stopped being real two years ago — usually noticed far too late.
Do you work with Google?
No. This is an independent tool with no affiliation. It does not send your data to Google beyond the ordinary fetch of a public page, and it never requests account access.