An international skincare brand on Shopify, selling across many markets and currencies. Before me, the tracking had passed through a rotation of freelancers and agencies — nobody ever owned the whole system.
Before I came in, the tracking had been handed to a rotating set of freelancers — each brought in for a single narrow task — and to larger agencies that never managed to get it fully working. Every piece got built. Nobody ever stepped back to own the system as a whole.
The dashboards were live, but they fought the store backend at every turn. Revenue in GA4 was inflated to the point of being meaningless. Conversion rates didn't match Shopify Admin, so each report opened with an argument about which number was "right."
Before changing anything, I audited the entire setup — every tag, trigger, event, conversion, and destination property — documenting where each one fired, where its data went, and whether it should exist at all.
I turned that into one documented map — a keep / pause / delete decision for every tag — then executed the cleanup: one production GA4 property, one global Google Ads tag, one purchase conversion per destination.
The team's working theory: international orders in local currencies were recorded as USD with the original amount lost — unrecoverable. I tested the assumption instead of inheriting it.
Rebuilt on a session basis, following Shopify's own definition, at two levels — store-wide and per product page. Site-wide CR now matches Shopify Admin exactly, ending the "which number do we believe" conversation before it starts.
Cleared duplicate purchase tags at the container level, then confirmed a second firing event was supplementary — and rebuilt a query join pattern that had been multiplying sessions into the tens of millions.
A multi-line catalog where near-identical SKUs are easy to merge by mistake. Each product page mapped to its exact set of item names. Channel noise — click IDs, affiliate strings, the same source spelled five ways — normalized into one clean set.
BigQuery as the warehouse, scheduled queries refreshing automatically into production tables, feeding a documented Looker suite — executive KPIs, retention and cohort analysis, per-product and per-landing-page attribution, upsell performance.
GTM had stopped loading on checkout and thank-you after a Shopify platform change. Rebuilt: a clean dataLayer-driven container for the storefront, the G&Y App carrying checkout data server-side, the full path wired across three ad accounts and external landing-page domains.
GA4 is client-side — it always loses the slice of orders that ad blockers and declined consent drop. I partnered with the brand's developer to build a custom app reading straight from Shopify's APIs — complete by construction. It now carries the brand's repurchase, retention, and lifetime-value analysis.
The revenue fix existed only because I checked an assumption everyone had already accepted as fact.
Every metric sanity-checked against the Shopify backend, with the delta explained — not just polished to look right.
Every report carries its methodology and the known gaps named out loud — refunds GA4 doesn't see, the 5–15% lost to ad blockers.
Self-refreshing dashboards and documented methodology the team can open in a year and trust without me.
Reporting that reconciles to Shopify. A revenue dimension recovered from data that had been written off as garbage. Conversion rates that match the store backend. A documented suite of dashboards anyone in the company can read and trust — and a custom analytics app pulling exact numbers straight from Shopify where GA4 can't.
The outcome isn't a vanity chart. It's a team that can trust the numbers enough to make decisions on them.