All case studies

Shopify retail

47% of revenue with no source

A Shopify store's GA4 showed nearly half its revenue as Unassigned. I traced it to three causes and applied fixes for each.

// symptom
GA4 showed 47% of revenue as Unassigned, so the store couldn't tell which ads were paying off.
// cause
Checkout and payment redirects started new sessions, a page-speed app deferred every tracking pixel until the visitor interacted, and three Google Ads purchase sources overlapped.
// fix
Checkout and payment domains added to unwanted referrals, analytics deferral removed, and the duplicate purchase source demoted to Secondary.
// result
The causes were diagnosed and the listed fixes applied. Script loading was confirmed with a crawler and a tag debugger; an end-to-end test purchase through GA4's DebugView is still recommended to confirm the full chain.
  1. 01 GA4 unassigned revenue 47% ⚠
  2. 02 referral exclusions: 0 entries ✗
  3. 03 checkout redirect → new session ✗
  4. 04 pixels deferred until interaction ✗
  5. ── patch: referrals + deferral + dedup ──
  6. 05 unwanted referrals added: 5 ✓
  7. 06 Primary purchase actions: 2 → 1 ✓
  • Shopify Customer Events
  • GTM
  • GA4
  • Google Ads

The problem

A Shopify gift retailer couldn’t see which ads were driving sales. In GA4, 47% of revenue sat in the “Unassigned” channel. That’s revenue with no source attached.

Three causes, stacked

Checkout broke the session. The referral exclusion list in GA4 was empty. Every time a shopper moved through checkout or a payment provider, GA4 treated the return as a new visit from a new source. The original ad click was gone.

Tracking waited for a click. A page-speed app was deferring every Shopify Customer Events pixel until the visitor interacted with the page. Shoppers who landed and bought fast weren’t tracked the way they should be.

Purchases were counted three ways. Google Ads had three overlapping purchase sources: one from GTM, one imported from GA4, and one from the Shopping app. Two were set as Primary, so both counted toward bidding.

The fix

  • Gave the store the list of checkout, payment, and wallet domains to add to GA4’s unwanted referrals. The store owner added them.
  • Had the page-speed app’s vendor remove the analytics deferral that was blocking every tracking pixel.
  • Demoted the Shopping app purchase to Secondary so bidding sees one purchase per order.
  • Specified the cleanup for the store’s developer, who removed the legacy checkout scripts and paused the old manual purchase triggers.

What I checked

I confirmed script loading with a crawler and a tag debugger after each change. The attribution chain wasn’t live-tested end to end. The next step I recommended was a test purchase walked through GA4’s DebugView to confirm it.

"...did it quickly and surgically, with a ton of expertise and courtesy on top of that."
Shopify store owner, via Upwork · 5 out of 5 stars

Seeing something like this?

Tell me what's not counting