{{img:hero}}When analytics looks “off,” the fastest path is a consistent workflow: check a few facts in the same order, then only dig deeper if you have to.
This guide is a reusable decision tree you can run in Chrome in 10–20 minutes, with examples for the most common “numbers don’t make sense” situations.
Save it, reuse it, and resist the urge to change three things at once.
Before you start: write down (1) what changed, (2) what metric looks wrong, (3) when it started. That one minute often halves your troubleshooting time.
Step 0: Pick your symptom (so you don’t debug the wrong thing)
Choose the closest match. Then follow that branch.
- A. Traffic dropped suddenly (sessions/users down)
- B. Conversions dropped, but traffic is steady
- C. Traffic is steady, but channel/source looks wrong (Direct spiked, Paid vanished, Referral weird)
- D. Events are missing/doubled (or a key event stopped firing)
- E. Numbers differ a lot between tools (analytics vs ad platform vs backend)
{{img:tree-map}}Treat the tree like a map: you’re trying to rule things out, not prove a favorite theory.
A) If traffic dropped suddenly: is it “tracking broke” or “real demand changed”?
A1. Did it drop everywhere or only for some pages?
- If all pages dropped at the same time: go to A2.
- If only some pages dropped: check those pages for redirects, 404s, noindex, or a new consent banner behavior. Then go to A3.
A2. Is there evidence tracking stopped loading? (quick Chrome checks)
- Open the site in an Incognito window in Chrome.
- Right-click → Inspect → Network, reload the page.
- Filter for collect, g/collect, or your analytics endpoint domain.
- If you see no requests at all, tracking may not be loading (tag removed, container not injected, script blocked, consent defaulting to “deny”).
Example: a site redesign shipped with a new header include, and the analytics snippet was accidentally left out. Traffic “dropped” overnight, but only in analytics—server logs didn’t change.
A3. If requests exist, is attribution breaking instead?
- If sessions are down but pageviews look oddly stable (or the opposite), check whether your SPA routing changed and you’re missing virtual pageviews.
- If only organic dropped: look for robots/noindex changes or a canonical/redirect change.
- If only paid dropped: check landing page redirects and whether UTM parameters are being preserved.
Example: marketing links started going through a new shortener that strips query parameters. UTMs vanish, and traffic appears to “drop” in Paid while Direct spikes.
B) If conversions dropped but traffic is steady: validate the conversion path first
B1. Did the site behavior change on the conversion steps?
- Test the conversion path yourself in Chrome (Incognito), slowly.
- Note the exact step where it diverges: button disabled, form validation, redirect, third-party checkout.
One sentence that helps: “Can a real user still complete this today?” If not, it’s a product/checkout issue, not an analytics one.
B2. If the path works, did the tracking definition change?
- Check whether the “conversion” is an event, a thank-you page view, or a server-side callback.
- If it’s an event: go to section D (events missing/doubled).
- If it’s a thank-you page: check if the URL changed, now redirects, or is blocked by auth.
{{img:funnel-break}}Example: the thank-you page URL changed from /thanks to /thank-you. The conversion still happens, but your conversion rule still listens for the old path, so conversions “drop.”
B3. If definitions didn’t change, consider consent/blocked contexts
- If the drop is concentrated on Safari/iOS or certain regions, consent settings or ITP-like limitations may be involved.
- If the drop is concentrated on a specific browser version, look for new extensions/ad blockers affecting the flow.
C) If channels/sources look wrong: find where attribution is being lost
C1. Did “Direct” spike? That’s often “attribution broke,” not “people typed your URL.”
- Check whether UTMs are present on your campaign links.
- Check whether your landing pages preserve query strings through redirects.
- Check whether cross-domain hops were added (payment provider, helpdesk, booking tool).
C2. If you have cross-domain flows, verify referral exclusion/cross-domain linking
- If users move from domainA.com to checkout-domain.com and back, you can accidentally start a new session and lose the original source.
- Symptom: new sessions appear mid-funnel, and conversions attribute to the payment domain or to Direct.
Example: you added a new checkout subdomain and didn’t configure cross-domain measurement. Conversions still happen, but attribution shifts dramatically.
C3. If Paid looks wrong, confirm auto-tagging vs manual UTMs aren’t fighting
- Avoid mixing different tagging schemes on the same links without a plan.
- Check for inconsistent utm_source/utm_medium casing and spelling (Email vs email can split reports).
D) If events are missing or doubled: isolate whether it’s firing, sending, or being counted
D1. First question: is the event firing in the browser?
- Perform the action (click, submit, view) while DevTools is open.
- If you have a data layer, check whether the expected data appears when the action happens.
- If nothing changes, the trigger may not be running (selector changed, JS error, SPA route change).
D2. If it fires, is it being sent?
- In Network, filter for your analytics endpoint.
- Click the request and confirm the event name/parameters look like you expect.
- If requests are blocked, look for CSP issues, consent defaults, ad blocker behavior, or endpoint domain changes.
D3. If it’s sent, is it being counted once?
- Doubles often come from duplicate tags (same tag in two places), SPA re-mounts, or firing on both “click” and “submit.”
- Compare timestamps: true duplicates are usually milliseconds apart with identical parameters.
{{img:devtools-network}}Example: a form event fires on button click, then again on form submit. It looks fine in isolation—until you segment by that event and everything is inflated.
E) If numbers differ between tools: decide whether you’re comparing the same thing
This is where a lot of teams waste hours. Use a quick equivalence check.
- Time zone: are both tools using the same reporting timezone?
- Counting unit: users vs sessions vs events vs orders.
- Attribution model: last-click vs data-driven vs view-through.
- Deduping: are purchases deduped by order ID in one system but not the other?
- Filters: bot filtering, internal traffic filters, consent mode modeling.
Example: your backend counts orders when paid; analytics counts purchase when the thank-you page loads. If a payment succeeds but the user closes the tab early, backend goes up while analytics undercounts.
One-page checklist: the “10-minute reuse” workflow
- 1) Write the symptom + exact start time.
- 2) Check if the issue is global or limited (pages, device, geo, channel).
- 3) In Chrome Incognito: confirm tracking requests exist.
- 4) If conversions are impacted: test the funnel manually.
- 5) If attribution is weird: verify UTMs + redirects + cross-domain hops.
- 6) If events are weird: verify firing → sending → counting (in that order).
- 7) Only then change one thing, and note it.
Takeaway: treat analytics like a chain, and check links in order
Most “mystery drops” come down to a small set of failures: tags not loading, consent blocking, redirects stripping parameters, cross-domain resets, or event triggers changing during a release.
Run the same decision tree every time, keep notes, and you’ll fix issues faster—and with fewer accidental side effects.