PDS Shop — Closing the 30% Gap Between Shopify and Google Ads with Stape.io
A French online perfumery on Shopify was looking at a 30% gap between the transactions logged in their Shopify admin and the conversions reported by GA4 and Google Ads — every day, growing wider every quarter. We deployed server-side tracking via Stape.io, layered CAPI on top of the existing pixels, and closed the gap to under 5% within three weeks.
Outcomes
The Challenge
PDS Shop runs an online perfumery on Shopify, selling premium fragrances into the French market. Their internal source of truth — the Shopify admin order list — was reporting roughly 30% more transactions every month than GA4 and Google Ads were showing. The gap had been there for as long as anyone could remember, but the team had assumed it was the normal cost of attribution. They had stopped trusting their conversion dashboard and were buying Google Ads on instinct.
The cost of the gap was twofold. First, Smart Bidding was learning from a fictional conversion volume — 70% of the real one — and was being conservative with bids and budgets, leaving demand on the table. Second, the team had no way to evaluate which campaigns actually drove revenue, because the channel mix in GA4 did not match the orders that had actually shipped. Every marketing decision was made with a partial picture.
Our Approach
The diagnosis was straightforward: Shopify is the source of truth for transactions because the order is the conversion, but GA4 and Google Ads were measuring the pixel fire, which had been hammered by Safari ITP, ad blockers, and the privacy extensions that the French market in particular skews toward. The fix was server-side tracking.
We deployed Stape.io as the managed server-side GTM host — a pragmatic choice for a Shopify shop that wanted reliability without standing up infrastructure. The server container sits on a first-party subdomain, receives events from the Shopify storefront and post-purchase webhook, and fans them out to Google Ads (Enhanced Conversions), GA4, and Meta CAPI. Cookies are set server-side with HttpOnly + first-party domain, extending persistence well past Safari's 7-day client-side cap. Within three weeks of go-live, the gap between Shopify orders and Google Ads conversions had closed from ~30% to under 5%.
Inside the engagement
This is a focused engagement — one problem, one solution, three weeks. PDS Shop runs an online perfumery on Shopify selling premium fragrances into the French market, and they had a problem that everyone who runs paid media on Shopify eventually recognises: their conversion dashboards lied. The Shopify admin showed one set of numbers. Google Ads and GA4 showed a different, smaller set. The gap was around 30%, every month, getting wider every quarter.
The 30% gap
The team had grown so used to the gap that they had stopped questioning it. They reconciled the Shopify total against the bank deposits — those matched. They reconciled the Shopify total against the GA4 revenue figure — those didn't, and that was just the way things were.
The practical cost of the gap was visible everywhere. Google Ads Smart Bidding was optimising on roughly 70% of the real conversion volume, which meant it was being systematically too conservative with bids and budgets. The team could not credibly compare channel performance because GA4's channel mix didn't match the orders that had actually shipped. They had stopped trusting their conversion dashboard and were buying Google Ads on instinct — a workable approach when you have years of category experience, but not one that scales as media spend grows.
Why the gap existed
The Shopify admin is the source of truth for transactions because the order is the conversion event. There is no measurement layer between the customer's checkout submission and Shopify's order creation — if Shopify says there's an order, there's an order. GA4 and Google Ads, on the other hand, were measuring the pixel fire on the thank-you page, and the pixel fire was being hammered from multiple angles at once:
- Safari ITP — first-party cookies set via JavaScript are capped at 7 days. The French market has a meaningful Safari share on mobile, and the typical perfume buyer's consideration cycle (research → comparison → purchase) easily exceeds 7 days. Every cross-session conversion was being measured as a brand-new visitor on the conversion touch.
- Ad blockers and privacy extensions — France skews particularly heavily on Ghostery, uBlock, and Brave. Each of those strips the gtag, Meta pixel, and analytics scripts entirely. The transaction completes (because Shopify checkout doesn't depend on gtag), but the pixel never fires.
- Consent banners and cookie rejection — under CNIL guidance, the consent banner has to offer denial with the same weight as acceptance. A meaningful fraction of French users routinely deny analytics cookies, which silences the pixel for those sessions while the order still completes.
- Network conditions on mobile — patchy 3G/4G on a perfume detail page can cause the analytics script to time out before the page transitions to thank-you. The conversion is lost not for a privacy reason but for a network reason.
Add those together and a ~30% loss is unsurprising. It is also recoverable.
Why Stape.io
The fix was server-side tracking. The choice was between standing up a self-hosted server-side GTM endpoint (on the team's own infrastructure or on a Coolify / Hetzner box) and using a managed provider. PDS Shop had no in-house DevOps team and no appetite for managing a server that, if it went down, would silently kill their conversion pipeline. The choice was Stape.io.
Stape is a managed sGTM host. They handle the infrastructure, the first-party subdomain (CNAME) setup, the SSL, and the uptime. The container itself is a standard Google sGTM container — same UI, same tags, same triggers as Google's own offering. The trade-off vs self-hosted is cost (a monthly subscription) for reliability and zero ops overhead. For a Shopify shop running on a single revenue funnel with a small ops team, the trade-off was clearly worth it.
The implementation
The deployment was deliberately straightforward — no schema rebuild, no migration of historical data, just a clean server-side layer on top of the existing setup.
- Stape container provisioned on a first-party subdomain (
data.pds-shop.com), with CNAME pointing to Stape's infrastructure. - Web GTM container updated to send all GA4, Google Ads, and Meta events through the sGTM endpoint. The existing pixels stayed in place — server-side runs alongside, not as a replacement — so the team has belt-and-braces measurement during the cutover and a permanent baseline for diff comparison.
- Shopify webhook wired to the sGTM endpoint for post-purchase events. The webhook fires server-to-server when an order is created in Shopify, which means even if the customer closes the browser tab before the thank-you page renders (or if the gtag is blocked entirely), the conversion event still reaches Google Ads and GA4. This is where the bulk of the recovered 30% came from.
- Google Ads Enhanced Conversions enabled with the hashed customer email forwarded from the Shopify order. Match rates jumped meaningfully — typical lift on Enhanced Conversions for a perfume vertical is 15–20% on attributed conversions.
- Meta CAPI layered on top of the existing Meta Pixel. Server-side and client-side dedupe correctly when the
event_idis shared between the two. - First-party cookies set server-side with HttpOnly and the first-party domain, extending persistence past Safari's 7-day ITP cap.
The results
The gap closed fast. Within the first week after go-live, the daily Shopify-to-Google Ads delta had dropped from ~30% to ~12%. Within three weeks — the time it took for Smart Bidding to digest the new conversion volume and for the Shopify webhook backfill to stabilise — the gap was under 5%. The residual 5% is the legitimate denied-consent fraction and the truly cross-device unmatched cases that no measurement layer can recover. That residual is now visible, labelled, and accepted.
The downstream effects landed within the first month of operating on accurate data. Smart Bidding raised its bid recommendations, budgets were reallocated toward campaigns that had been undervalued in the broken data, and the channel mix in GA4 finally matched the orders shipping out of the Shopify admin. The team stopped buying paid media on instinct.
What we would do again
For a Shopify merchant with a small ops team and no appetite for managing infrastructure, Stape.io is the right call. The deployment is fast, the maintenance overhead is zero, and the conversion recovery pays for the subscription many times over. We would make the same choice again on the same brief.
The structural lesson — and this case illustrates it cleanly — is that on Shopify, the order is the conversion event, not the pixel fire. Any tracking setup that relies on the client-side pixel as its source of truth is leaving 20–40% of conversions on the floor in 2026. Server-side tracking is no longer an optimization; it is the baseline.
More from the field
Hertz Maroc — Rescuing a Botched Server-Side Migration with dbt
A previous agency migrated Hertz Maroc to server-side tracking and Consent Mode V2 — and broke two years of Power BI reporting in the process. The migration renamed every funnel event to Google's recommended schema without accounting for the GA4 → BigQuery → Power BI pipeline, and shipped a consent banner that left dismissed sessions in an undefined state. We rebuilt the foundation with a dbt reconciliation layer and a properly configured consent flow.
Prestigia.com — Rebuilding the Data & Activation Stack of a Premium OTA
A premium online travel agency selling primarily into the US market had a fundamentally broken tracking stack — Firebase reporting wrong conversion values, a 140-tag GTM container firing false data, and no real funnel visibility. We rebuilt the foundation: business-grade datalayer, server-side tracking, BigQuery warehouse, and a Klaviyo-driven retention engine.
