How to Fix Attribution Gaps Between Your Ad Platform and Store
Meta says 40 purchases, Shopify says 26. Here is how to diagnose attribution gaps, fix the tracking underneath them, and pick the number you actually steer by.
Your ad manager reports 40 purchases. Your store reports 26. Nobody is lying — the two systems are answering different questions, one of them is missing events, and somewhere in between is the number you should be making budget decisions on. Most teams respond by picking whichever figure is more flattering, which quietly leads to overspending on channels that look good and starving ones that don't. This tutorial walks the gap end to end: quantify it, separate the part caused by broken tracking from the part caused by attribution methodology, fix what is fixable, and then adopt a single arbiter metric so the weekly budget meeting stops being an argument about whose dashboard is right.
01
Measure the gap before you try to close it
Takes 30 minutes
Pick a 30-day window that is fully closed — no partially attributed days at the edges. Pull purchases and revenue from each ad platform, then pull the same window from your store's analytics filtered to that channel's UTM source. Put both in a sheet with a third column: platform ÷ store. Do this per channel, not in aggregate, because a healthy Meta ratio can hide a badly broken TikTok one.
The ratio, not the raw difference, is what you track over time. In accounts we work with, a platform-to-store ratio somewhere in the 1.1–1.4 range for Meta is normal and mostly methodological — view-through credit, cross-device stitching, and the platform counting a conversion on the day of the click rather than the day of the purchase. A ratio above roughly 1.8, or one that jumps by more than 0.3 between two consecutive months, is a signal that something is actually broken rather than merely different. Below 1.0 usually means the platform is missing events, which is the easier problem to fix.
Record the window and the ratio somewhere permanent — a tab in your reporting sheet is enough. The single most useful artefact here is a trend line of that ratio, because it converts a philosophical argument about attribution into an operational one. When the ratio is stable, you can apply it as a haircut and move on. When it moves, you have a dated change to investigate: a pixel deploy, a theme update, a consent-banner change, an iOS release, a new checkout app.
Pro tip:Compare order counts before revenue. Revenue gaps can be caused by currency, tax and shipping handling, which muddies a diagnosis that order counts make clean.
02
Separate the three causes of a gap
Takes 20 minutes
Every gap is some mix of three things: lost events (the platform never heard about the conversion), attribution model differences (both systems saw it, they credit it differently), and timing (the platform reports on click date, your store on order date). Diagnose in that order. Lost events are a bug you fix; the other two are methodology you account for.
Timing is the fastest to rule out. If you look at a single day in isolation, a click-date-attributed platform will always disagree with an order-date store report, because a purchase made today from a click seven days ago lands in different buckets. Widening the window to 30 days and cutting the edges off makes most of that disappear. If a large gap survives a 30-day closed window, timing was never the main cause.
Attribution model differences are the residue you learn to live with. Ad platforms credit themselves for view-through conversions and stitch users across devices using logged-in identity; your store's analytics typically credits the last click it can see in the browser session. Neither is wrong, but they are not comparable, and no amount of tracking work will make them equal. What you can do is shrink the window the platform is allowed to claim — moving from a 7-day-click/1-day-view setting to 7-day-click only removes a chunk of the softest credit and usually pulls the ratio down noticeably.
03
Audit the browser pixel first
Takes 45 minutes
Open your store in an incognito window with the platform's pixel-debug extension running. Walk the full funnel: product page, add to cart, begin checkout, purchase with a real test order. Confirm each event fires exactly once, with the right value, currency and content IDs. Duplicate events and missing values are the two failures that show up most often, and both distort optimisation as well as reporting.
Duplicate firing is more common than missing events and much more damaging, because the platform optimises toward a conversion count that is inflated. It usually comes from the same pixel being installed twice — once through a native app integration and once hard-coded into the theme, or once in the theme and once through a tag manager. The debug tool will show two events with identical timestamps; the fix is to remove one installation entirely rather than trying to filter it downstream.
Check values, not just event names. A purchase event that fires with a value of 0, or with a currency your account is not set to, gets counted for reporting but is useless for value-based bidding — and it will make your platform ROAS look absurd in one direction or the other. Also test with an item that has a discount code applied and one that ships free, since value calculation bugs frequently only appear on those paths.
Pro tip:Place one real test order at the lowest possible price and refund it. Test-mode events and real orders behave differently often enough that only a real purchase proves the path.
04
Turn on server-side conversion tracking
Takes 1–2 hours
Browser pixels lose events to ad blockers, tracking prevention, consent rejections and slow page unloads. A server-side connection — Meta's Conversions API, TikTok's Events API, or the equivalent — sends the conversion from your backend instead. Enable it through your platform's native app integration if one exists, and pass the same event ID as the browser pixel so the two are deduplicated rather than double-counted.
Deduplication is the part teams get wrong. If the browser and server both report a purchase and they do not share an event ID, the platform counts two. Most native integrations handle this automatically, but if you built the connection yourself, verify it in the platform's event diagnostics — there is normally a deduplication rate shown there, and you want it high, meaning the platform is successfully recognising pairs. A sudden drop in that rate is one of the earliest warnings that a deploy broke something.
Match quality is the other dial. Server-side events can carry hashed email, phone, name, city and IP, and the more identifiers you send, the more conversions the platform can attribute to a click it remembers. Passing email alone versus email plus phone plus address typically moves match quality up a meaningful notch, which recovers real conversions rather than inventing them. Send only what your privacy policy and regional consent rules allow, and make sure hashing happens before anything leaves your server.
Pro tip:After enabling server-side, wait a full week before re-measuring the ratio. The first few days mix old and new attribution and will mislead you.
05
Fix the UTM layer so your store can see the channel
Takes 1 hour
Half of what looks like an attribution gap is really your store analytics dumping paid traffic into 'direct' or 'referral' because UTMs are missing, inconsistent or stripped on redirect. Apply dynamic URL parameters at the ad level on every platform, use one lowercase naming convention across all of them, and confirm the parameters survive from click to landing page to checkout.
Three things break UTMs silently. Redirects — link shorteners, geo-redirects and www-to-apex rules — often drop query strings unless configured to forward them. Case inconsistency splits one channel into several rows, so 'Facebook' and 'facebook' become separate sources. And app-to-browser handoffs on mobile can lose parameters entirely on some platforms. Test each by clicking your own live ad on a phone and inspecting the final URL, not by reasoning about what should happen.
Encode enough detail to be useful later but not so much that the convention rots. Source and medium identify the channel; campaign identifies the campaign; content is where you put the creative identifier — hook, avatar, variant. If you already follow a naming convention for your creative, reuse the exact same string here so a report row can be traced back to a specific video without a lookup table. A companion walkthrough of the convention itself lives at /knowledge-base/en/how-to/how-to-set-up-utm-tracking-for-video-ads.
06
Adopt blended ROAS and MER as the arbiter
Takes 45 minutes
Once tracking is honest, stop trying to make the two dashboards agree and pick a number that cannot be gamed by attribution: total revenue divided by total ad spend across all channels. Blended ROAS, or its inverse MER, comes from your bank and your store, not from any platform's self-reported credit. Track it weekly alongside per-channel platform ROAS, and let blended be the one that decides total budget.
The division of labour is what makes this work. Blended ROAS answers 'is the business making money on marketing this week?' — it is the number for the total budget decision. Per-channel platform ROAS answers 'which creative and which ad set are relatively better?' — it is the number for the within-channel allocation decision, and for that job its bias mostly cancels out because every ad in the account is biased the same way. Problems start when teams use platform ROAS for the first question or blended for the second.
Set a blended target that accounts for your actual margins rather than copying someone else's benchmark. Work it out from contribution margin: if your gross margin after COGS, shipping and payment fees is 55%, then a blended ROAS of roughly 1.8 is breakeven on marketing before overheads, and your growth target needs to sit meaningfully above that. Writing this number down once removes an enormous amount of weekly debate, because 'is this campaign good?' becomes a comparison against a fixed line instead of a judgement call.
Pro tip:Include every marketing cost in MER — creative production, agency retainers, influencer fees — not just media spend. Otherwise the number flatters you by exactly the amount you are ignoring.
07
Run a weekly reconciliation and log the changes
Takes 20 minutes weekly
Put a recurring 20-minute slot in the calendar. Refresh the ratio per channel, compare it to last week, and check the platform's event diagnostics for new warnings. Alongside it, keep a dated change log: pixel edits, theme updates, checkout apps, consent-banner changes, new redirects. When the ratio moves, the log tells you what to look at first.
The change log is the unglamorous part that saves the most time. Attribution breakages are almost never discovered on the day they happen; they are discovered three weeks later when someone notices spend efficiency drifted. Without a log you are archaeology-hunting through deploy history under pressure. With one, you look at the two entries closest to the inflection point and usually find it in minutes. Include non-engineering changes too — a marketing team member switching a campaign's attribution setting is a change that moves the ratio just as surely as a code deploy.
Set thresholds so the review is a check, not an investigation. A ratio inside ±0.15 of last week is noise: note it and move on. Outside that, open the diagnostics. A drop in server-side event volume, a fall in match quality, or a new 'missing parameter' warning are the three findings that explain most sudden movements. If diagnostics are clean and the ratio still moved, look at mix — a shift toward prospecting or toward a placement with more view-through impressions changes the ratio without anything being broken.
Final thoughts
You will never make the two dashboards agree, and chasing that is a waste of a good analyst's week. What you can do is remove the part of the gap that is genuinely broken — duplicate pixels, zero-value events, stripped UTMs, no server-side connection — and then decide, once and in writing, which number governs which decision. Blended ROAS for the total budget, platform metrics for the relative comparison within a channel, and a weekly ratio check to catch the next breakage early. Do that and attribution stops being a monthly argument and becomes a five-minute status line.
Frequently asked questions
1.Which number should I report to my client or leadership?
Blended ROAS or MER, with platform figures shown underneath as context. Leading with platform numbers sets an expectation the bank statement will eventually contradict, and that conversation is much harder later than it is now.
2.Will server-side tracking fix the gap completely?
No. It recovers events lost to blockers and tracking prevention, which typically tightens the ratio, but the remaining difference is methodological — view-through credit and click-date reporting — and no implementation removes that.
3.Should I shorten my attribution window to make the numbers match?
Only if you understand the trade-off. A shorter window reports more conservatively and matches your store more closely, but it also gives the platform's optimisation less signal, which can hurt delivery. Change it once, measure for two weeks, and don't flip back and forth.
4.My store reports more conversions than the platform. Is that a problem?
Usually yes — it points at lost events on the platform side, a missing UTM layer, or a consent configuration blocking the pixel for a large share of visitors. Start with the pixel audit and the server-side connection rather than assuming it is organic overlap.
Ready to put this into practice?
Create your first AI UGC video ad in minutes — no filming, no actors, no editing.