Stop feeding blind data to Smart Bidding.
Ad blockers kill the request & Safari caps click ID cookies at 24 hours

Server-Side Tracking is Not Enough.
Add Offline Conversion Tracking to Achieve 100% Data Accuracy.

Server-side tracking recovers some data, but it still leaves massive gaps when browsers block the request or users decline consent. Combine server-side tracking with offline conversion tracking to feed GA4, Google Ads, and Meta the absolute truth from your backend.

Free, recorded Loom audit of your setup. Delivered in 48 hours. No sales call.

// Recorded on a live store with server-side GTM already running

100% FREE
12 free audit slots left this week
// Tracking Architecture Review

Find the conversions you are missing.

We map your pipeline and send the findings within 48 hours.

// Tap all that apply

// No spam · No sales call · Loom video in 48h

2,500+
Projects Done
48h
Turnaround
★ 5.0
Rating

"Bipin found 4 critical errors we had no idea about. Our Facebook ROAS went from 1.4x to 3.6x in 6 weeks."

— Sarah M., Shopify Store Owner

Request received!

Your audit is in the queue. We'll compare what your backend knows against what your ad platforms report, and send a personal Loom video within 48 hours.

What happens next
  1. Within 48 hours: You'll receive an email from support@incisiveranking.com
  2. Inside the email: A private Loom video showing every conversion that never reaches Google and Meta, and what it takes to recover it
  3. Heads up: Check your spam / promotions tab if you don't see it
While you wait

Watch the 7 minute test where ad blockers kill a live server-side request, and the backend recovers the same purchase with UTM and GCLID intact.

Proof From a Live Account

Don't Take Our Word For It.
Read the Account.

One live store. Three conversion actions running in parallel over the same three days: server-side only, offline only, and both combined. Same traffic, same orders. Here is the raw Google Ads report.

ads.google.com  ›  Goals  ›  Summary 26–28 Aug 2026

// Tap the image to enlarge

1
223.36 conversionsServer-side + offline, deduplicated into one action
2
160.76 conversionsServer-side only. What most stores think is the truth
3
153.00 conversionsOffline import only, straight from the backend
What you are looking at: three rows of the same store's purchases. The only difference between them is which data source feeds the conversion action. Turning on offline conversion tracking alongside server-side moved the reported number from 160.76 to 223.36 orders, without changing a single ad, keyword or budget.

The Three Rows, Side by Side

// Row 2

Server-side only

160.76
Conversions
Conv. value 1,355,474.65

A fully working server-side GTM setup. This is the number most stores believe is the truth.

// Row 3

Offline import only

153.00
Conversions
Conv. value 1,133,659.90

Orders pushed from the backend through the Data Manager API. On its own it already sees almost as much as the full server-side setup.

The full picture
// Row 1

Server-side + offline

223.36
Conversions
Conv. value 1,862,467.23

Both sources feeding one conversion action, deduplicated by transaction ID. This is what the bidding algorithm should be learning from.

+62.60
extra conversions the server-side tag never recorded — 38.9% more than server-side alone.
+506,992
in recovered conversion value across three days — 37.4% more revenue visible to Smart Bidding.
// And no, it is not double counting
160.76+153.00=313.76 raw 223.36 recorded

90.40 conversions were deduplicated away because the tag and the backend upload carried the same transaction ID. Google kept one record per order and used the backend value. What is left over — the 62.60 — are orders that only the backend ever knew about.

// Reported conversions keep rising after the fact. How to read these windows correctly →

And Google Rates the Setup Itself

Data source: Excellent
Google's diagnostics panel: the offline data source is healthy and the combined conversion action is active and sending data. Zero items needing attention, zero urgent.
One action, both sources
Note the wording: one conversion action, fully optimised using tag data and imported data together. Not two actions running side by side. That is the whole reason the numbers deduplicate.
100% of events imported
2,081 of 2,088 events accepted on the last upload, uploading every day through the Data Manager API. No silent failures, no stale data.

// Live client account. Account name and value currency removed. Google Ads reports fractional conversions under data-driven attribution, and records them against the original click date, so recent windows continue to fill in.

Your gap will be a different number. It is never zero, and you cannot see it from inside Google Ads — it only shows up when backend orders are compared against what the platforms reported.

Show Me My Gap

The Problem

Why Server-Side Tracking
Still Leaves Gaps

Server-side GTM is a massive upgrade from client-side pixels, but it is not a magic bullet. It is still limited by browser restrictions and user behavior. If you stop at server-side, you are still missing 20 to 25% of your actual conversions.

Consent Declines

If a user rejects advertising cookies, server-side tracking legally cannot fire. The conversion happens on the backend, but the ad platform never sees it.

Safari ITP & iOS

Safari caps JavaScript cookies at 7 days (or 24 hours if a click ID is present). Server-side can't fix a browser-level block that deletes the identifier before the conversion happens.

Ad Blockers

Advanced ad blockers block the server-side endpoints themselves, and strip UTM parameters and click IDs out of the landing page URL. If the request never leaves the browser, your server never processes it.

Cross-Device Journeys

A user clicks an ad on mobile, but buys on desktop a week later. The tracking link is broken, and server-side tracking alone can't stitch that journey together.

Live Proof

Watch a Real Purchase Vanish,
Then Come Back With Attribution

This is not a slide deck. It is a recorded test on a live store that already has server-side GTM running through Stape. Ad blockers and Brave Shields get switched on one at a time until the purchase disappears from both Google and Meta, then the backend feed recovers the same order with the campaign data intact.

// Tap a chapter to jump straight to that moment

What the test shows

01

Server-side is working fine

Page loads with UTM parameters and a GCLID on the URL. The server container receives the event and forwards it to Google and Meta. Nothing is broken yet.

02

Common ad blockers survive

uBlock, AdGuard, and Adblock Plus are enabled one by one. The data still arrives. This is the point where most setups get signed off as healthy.

03

Then the aggressive layer kills it

With an advanced blocker plus Brave Shields, the UTM parameters are removed from the URL, the GCLID is truncated, and the request to the server container never leaves the browser. The server container stays empty.

04

A real order, zero signal

The test order goes through checkout and completes. Revenue is in the store admin. Google and Meta received nothing at all, so bidding never learns from that sale.

05

The backend sends the truth

The store backend fires the purchase as an offline conversion with order data and hashed customer info, using the transaction ID as the event ID so the platforms can deduplicate it.

06

Attribution comes back too

Because backup parameters were written server side before the blocker could strip them, the source, medium, campaign, and GCLID are all restored on the recovered conversion. Not just a sale, a properly attributed sale.

Server-side only, blocker on
0 conversions recorded
Request blocked before it left the browser
Attribution after the block
UTM stripped, GCLID truncated
Sale shows as direct or unassigned
With offline conversion tracking
Order recovered, campaign intact
Deduplicated by transaction ID, no double counting

Every store leaks a different amount. The only way to know yours is to compare backend orders against what Google and Meta actually reported, which is exactly what the free audit does.

The Solution

Fill the Gaps with
Offline Conversion Tracking

Server-side tracking captures what the browser allows. Offline conversion tracking pushes the absolute truth from your CRM or backend directly into GA4, Google Ads, and Meta.

If an ad blocker or consent banner stopped the browser tag from firing, your backend still knows the sale happened. Offline conversion tracking pushes that backend truth to the ad platforms, filling in the missing pieces.

This creates a closed-loop system where Google and Meta learn from actual outcomes (real sales, real leads, real margins) rather than just pixel noise. This is how you achieve 100% data accuracy.

Recover Lost Conversions

Push real outcomes from your CRM/ERP to ad platforms, recovering the 20 to 35% of conversions lost to ITP, consent, and ad blockers.

Smarter Value Bidding

When platforms learn from actual CRM deal values and real margins instead of flat revenue, tROAS and Smart Bidding finally optimize for profit.

Privacy-Safe by Design

Hashed customer data reaches ad platforms without exposing raw PII, keeping you GDPR and CCPA aligned while maintaining accuracy.

The part most setups skip

Backup attribution parameters

Recovering the sale is only half the job. If the click ID and campaign data were stripped from the URL, the recovered conversion lands as unattributed and your reports still lie. We write a mirrored copy of the click ID, source, medium, and campaign at the first server-side touch, before the blocker can remove them, then attach that copy to the offline upload. That is why the recovered order in the video still carries its full campaign path.

No Double Counting

How Deduplication Works

A common fear of running both server-side and offline tracking is inflating conversions. Don't worry. Google and Meta have built-in deduplication logic to ensure a single purchase is never counted twice.

The rule everything else depends on

Both sources must feed the same conversion action

This is the single detail that decides whether combining server-side and offline tracking gives you accuracy or garbage. Deduplication only happens inside one conversion action. Send the tag to one action and the backend import to a second one, and there is nothing for the platform to match against — it cannot tell a recovered order from a duplicate, because it never compares the two.

Two separate conversion actions
Server-side tag Purchase — Web
Backend import Purchase — Offline
Result: inflated, unusable No matching happens across two different actions. The same order is counted twice, your reported conversions climb for the wrong reason, and Smart Bidding optimises toward revenue that does not exist. Worst of all it looks like a win, so nobody investigates.
One conversion action, two data sources
Server-side tag Purchase
Backend import Purchase  // same action
Result: one record per order The platform matches on transaction ID inside that single action, keeps one record, and overwrites the value with the backend truth. Orders the tag genuinely missed get added. Duplicates never do. This is what “100% data accuracy” actually means in practice.
Google Ads
Import into the existing web conversion action, never a new one. Matching is done on transaction_id (your order ID).
Meta
Same dataset in Events Manager, same event name, same event_id, inside the 48-hour window. A separate offline event set has nothing to deduplicate against.
GA4
Same property, same event name, with transaction_id present on both the tag event and the imported one.

It is also why the report earlier on this page reads 223.36 and not 313.76, and why Google's diagnostic describes it as one conversion action fully optimised using tag and imported data. One action. Two sources. That is the whole trick.

Google Ads Deduplication

Rule: Connect your backend feed to the existing web conversion action, never a new one. Google uses the Transaction ID (Order ID) to match them.

SOURCE A
Server-Side Tag
Fires Purchase (Order #1234)
+
SOURCE B
CRM Upload
Uploads Purchase (Order #1234)
✓ Transaction ID Matches
Counted as 1 Conversion. Value Overwritten by CRM.

If the tag was blocked (no match), Google counts the CRM upload as a new (recovered) conversion.

Meta Deduplication

Rule: Both the browser/server-side tag and the offline CRM feed must send the exact same Event ID and Event Name (e.g., 'Purchase'). Meta matches them within a 48-hour window.

SOURCE A
CAPI / Pixel
Event: Purchase, ID: 1234ABC
+
SOURCE B
Offline Dataset
Event: Purchase, ID: 1234ABC
✓ Event Name + Event ID Match
Deduplicated within 48h. Counted as 1 Conversion.

If the window closes before the CRM uploads, it counts as two. Upload backend data as quickly as possible.

This is the exact behaviour shown at , where the transaction ID is reused as the Meta event ID and the recovered purchase is accepted without duplicating anything.

And it is what the account numbers prove: 160.76 + 153.00 raw conversions became 223.36 recorded, not 313.76. See the account data.

FAQ

Frequently Asked Questions

It depends on your traffic mix, consent rate, and how many buyers use blockers or Safari. On the live account shown on this page, across three days the combined server-side plus offline conversion action recorded 223.36 conversions where the server-side action alone recorded 160.76. That is 38.9% more conversions and 37.4% more conversion value, from the same traffic and the same orders. Stores with heavier mobile, EU, or privacy-conscious traffic usually see a bigger gap. The only way to know your own number is to compare backend orders against reported conversions.
There are two separate waiting periods and they get confused with each other. The first is the import itself: uploaded conversions appear within about three hours on last-click attribution, normally process in under 12 hours, and can take up to 72 hours where certain click identifiers are involved, with modelled conversions taking up to five days to stabilise. The second is the attribution model. Feeding a new data source into a conversion action redistributes credit across your campaigns, ad groups and keywords, so individual campaign numbers move, not just the account total. Google's guidance is to wait until your average days to conversion have passed before evaluating anything, a figure you can find in the Path metrics attribution report under "Avg. days to conversion." Google's own worked example excludes the last 14 days of data from the analysis. On top of both, Google Ads records every conversion against the date of the original ad click rather than the date of the sale or the upload, so recent days keep filling in for a while. Practically: compare a full 30-day window against the same length of period before it, exclude the most recent stretch, and never draw a conclusion from three days. We also upload every day rather than weekly, because offline conversions that arrive more than seven days after the event are skipped by data-driven attribution modelling even though they still appear in your conversion columns.
Yes, and the video on this page shows it happening on a live store. Common blockers like uBlock, AdGuard, and Adblock Plus usually let a properly configured server-side request through. Aggressive filter lists combined with Brave Shields go further: they strip UTM parameters from the URL, truncate the click ID, and block the request to the server container endpoint itself. Server-side tracking cannot help when the browser never sends the request in the first place.
Yes. The backend feed supplements the tag rather than replacing it. Server-side tracking captures real-time signal from visitors who are trackable, and the offline feed fills in what the tag missed and corrects values that changed after checkout. Removing the tag would lose real-time optimization signal and the transaction ID matching that makes deduplication work in the first place. The account data above shows why: offline alone recorded 153.00 conversions, well below the 223.36 the two sources record together.
No, and this is the mistake that quietly ruins most setups. Deduplication only happens inside a single conversion action. If your server-side tag reports into one action and your backend import reports into a second, the platform has nothing to compare them against, so every order that both sources saw is counted twice. Your conversion numbers rise, which looks like the project worked, while Smart Bidding is being trained on revenue that never existed. In Google Ads the backend feed must be attached to the existing web conversion action and matched on transaction ID. In Meta the offline events must reach the same dataset as your pixel and CAPI events, carrying the same event name and event ID. In GA4 it is the same property, same event name, with a transaction ID on both. Get this wrong and everything else on this page is worthless.
Not if you set it up correctly. Google Ads deduplicates using transaction ID within a single conversion action. Meta deduplicates using event name and event ID within a 48-hour window. As long as your website tags and backend uploads share the exact same order ID and event ID, the platforms will automatically merge them into a single conversion. You can see it in the account numbers on this page: 160.76 plus 153.00 raw conversions were recorded as 223.36, not 313.76, because 90.40 overlapping orders were matched and merged.
By capturing a mirrored set of backup parameters at the first trackable touch and persisting them server side, before any blocker or redirect removes them. Source, medium, campaign, and the click ID are stored against the session and the order, then attached to the offline upload. Without this step a recovered conversion still lands as unattributed, which is why so many offline import setups raise conversion counts but do not improve campaign level reporting.
The most common causes are consent declines that produce no click identifier, ad blockers that block the endpoint your tag posts to, Safari ITP capping JavaScript cookies at seven days or twenty four hours, and redirects that strip the click ID before the landing page loads. Offline conversion tracking bypasses all of these by pushing the truth directly from your CRM.
Yes. The capture layer differs per platform, a theme snippet and webhook on Shopify, a plugin on WooCommerce, a module on Magento, but the payload sent to the ad platforms is identical in all three cases. Custom stacks are handled through a direct backend or CRM integration. If your orders live somewhere that can send a webhook, the outcome can be pushed to Google and Meta.
We inspect what is live: your container configuration, whether click IDs are being captured and persisted, whether offline outcomes are reaching Google and Meta, whether consent gates anything, and whether transaction IDs are consistent enough to deduplicate. You get a recorded Loom video walking through the findings in priority order, within 48 hours. No sales call.

Reading Your Numbers After Go-Live

Two clocks are running. Neither of them is finished.
Clock 1 · The import
< 12 hrs
Uploaded conversions normally process in under 12 hours, up to 72 for some click identifiers, and appear within about 3 hours on last-click. Modelled conversions take up to 5 days to stabilise.
Clock 2 · The attribution model
~14 days
Adding a data source shifts credit across campaigns, ad groups and keywords. Google's own worked example excludes the last 14 days from analysis before drawing any conclusion.
Why past days grow
Click date
Google Ads books each conversion against the date of the original click, never the date of the sale or the upload. Yesterday's row keeps rising for days after you read it.
Why we upload daily
7 days
Offline conversions arriving more than 7 days after the event still land in your conversion columns, but are skipped by data-driven attribution modelling. Cadence is not optional.

So do not judge a campaign on last week. The honest read is a 30-day window compared against the same length of period before it, with the most recent stretch excluded — Google's guidance is to wait until your average days to conversion have passed, which you can look up in the Path metrics attribution report under “Avg. days to conversion.” Their example uses 14 days; yours may be shorter or much longer. The three-day window shown earlier on this page was still filling in when the screenshot was taken, which makes +38.9% the conservative reading, not the optimistic one.

// Sources: Google Ads Help — Best practices for managing attribution model changes; Guidelines for importing offline conversions; Fix discrepancies and errors in offline conversion imports; About modelled online conversions; Data discrepancies: factors and troubleshooting.

Free architecture audit Loom video in 48h. No sales call.
Get it free