Skip to main content
Case studies

Tracking fixes, measured by the number that moved.

Every case here started with an ad platform reporting one figure and the back-end showing another. We fix the tracking, then publish what the platform reported afterwards. Named clients, reported figures, no composites.

×
reported ROAS in Meta, up from ×

VäxterOnline, days after moving tracking server-side. Same ads, same budget.

× Reported ROAS in Meta after days, up from ×
× Multiple on the starting ROAS, same ads and same budget
Increase in reported return on ad spend
Days from go-live to the after reading in Meta Ads Manager
Case study: VäxterOnline

Meta was reporting × on campaigns the store knew were profitable.

The number was not wrong because the ads were bad. It was wrong because Meta was only seeing part of the purchases. Here is what was breaking, what we changed and what the platform reported days later.

Sector
Online plant shop
Platform
WooCommerce
Market
Sweden
Ad channels
Meta, Google Ads
Delivered in
days

The problem

  • Purchase events fired in the browser only, so ad blockers and iOS privacy features removed a share of them before Meta or GA4 received anything.
  • The consent banner and the tags raced each other on page load. On some sessions the purchase tag fired before consent was read and was dropped.
  • The Klarna checkout redirect meant the thank-you page did not always load in a way the existing tags could rely on.
  • GA4, Google Ads and Meta each counted purchases their own way, so there was no single number the team could trust.
  • Campaign bidding was learning from the incomplete signal, so budget went to the audiences Meta could see rather than the ones that bought.

Reported ROAS in Meta Ads Manager, day 0 vs day

Before
×
After
×
× the starting figure increase days

Same ads, same budget, same store. Server-side GTM, Meta Conversions API with deduplication, consent fix, data layer rebuild.

What we did

  1. Audited the purchase path end to end

    We traced every purchase event from the WooCommerce data layer through GTM to GA4, Google Ads and Meta, including the Klarna redirect, and logged where events were duplicated, blocked or never sent.

  2. Fixed consent before touching the tags

    We found the race condition between the consent banner and tag firing and fixed it, so consented purchases are always sent and non-consented ones are always withheld. Consent Mode v2 signals were set correctly for both states.

  3. Moved collection to a first-party server container

    Server-side GTM now runs on a subdomain of vaxteronline.se that the store controls. Events leave the browser to a first-party endpoint, which is what ad blockers and iOS restrictions were cutting off.

  4. Connected Meta Conversions API with deduplication

    Purchases are sent from the server with the same event ID as the browser pixel, so Meta receives every purchase once, including the ones the pixel never fires for.

  5. Rebuilt the data layer as one source of truth

    GA4, Google Ads and Meta now read from the same purchase object with the same order ID, value and currency. When the three platforms differ, the difference is explainable.

  6. Ran browser and server in parallel, then verified

    We compared browser events, server events and WooCommerce orders before switching bidding over, and handed the store documentation of every tag, trigger and destination.

SourceWooCommerce data layer
GateConsent Mode v2
First-party endpointServer-side GTM
Dedupe and forwardMeta Conversions API
Also receivesGA4, Google Ads

The result

Within days of go-live, Meta's reported ROAS went from × to ×. The difference is that Meta could finally see what was being bought and optimise towards it.

×
Reported ROAS in Meta after days, up from ×
×
Multiple on the starting ROAS, a increase in reported return
1
Purchase number shared by GA4, Google Ads and Meta, instead of three that never matched

How to read this number

"Reported ROAS" is what Meta Ads Manager shows. Part of the increase is purchases Meta was already generating but could not see; part is the algorithm bidding better once it received complete purchase signals. Both are real money for the store, but only the second one is new revenue. We publish the reported figure because it is the number the store's team looks at every morning and the one that decides whether budget scales.

What clients say after the fix

Verified reviews on Trustpilot. We link to the source so you can read every one.

"Expertly helped by Jerry. Fast, critical, a true specialist. Our tracking is back on point. Finally we can see where clients are coming from and steer on real leads and data."
Linda ZwanenburgRead on Trustpilot
"I'd been searching for the right GTM setup for ages. Thanks to Jerry, it's finally falling into place. No fuss, just someone who knows what he's talking about and actually moves you forward."

Want to see what your ad platforms are not seeing?

Book a 30-minute tracking call. We look at your GTM, GA4 and consent setup together and tell you where conversions are being lost, before any proposal.

Privacy Preference Center