Attribution Data Reconciliation: A Process for When GA4, Shopify, and Ad Platforms All Disagree
Attribution data from four systems will never match, and the goal of reconciling it is not to make them agree.
It is to explain every gap with a named reason, so that when a client or a CFO asks why Meta says 412 purchases, Google Ads says 380, GA4 says 291, and Shopify says 350, you have an answer that survives the follow-up question.
This post lays out a repeatable process for doing that monthly, built around what each system actually counts, with the 2026 changes that quietly moved the numbers on every store this year.
What is attribution data reconciliation?
Attribution data reconciliation is the practice of taking one closed period, pulling the conversion and revenue figures from every system that reports on it, anchoring them to a single financial record, and assigning a reason to each difference.
Done well, it produces a bridge: start at Shopify orders, add and subtract named adjustments, and arrive at each platform's number. Done badly, it produces a spreadsheet of four columns and a shrug.
The reason it matters more in 2026 than it did a year ago is that the systems keep changing what they count without telling you. A reconciliation run monthly catches that. A reconciliation run once, when someone complains, doesn't.
What each system actually counts
The gaps are explainable only if you know what each number is a count of, and none of the four are counting the same thing.
- Shopify counts orders placed, on the order date, server-side, with refunds netted automatically and sessions reset at midnight. It is the closest thing to a financial record and it knows nothing about ads beyond the last UTM. Accurate and isolated, as we've put it before.
- GA4 counts purchase events that fired in the browser, dated to the conversion, with no automatic refund handling, attributed by its own data-driven model, and delivered 24 to 48 hours late. It typically misses 10 to 30% of purchases to blocking and consent, per Blue Frog Analytics' comparison, and its sessions are cut differently from Shopify's, so even traffic won't match.
- Google Ads counts conversions attributed to a Google click, dated to the click rather than the purchase, under data-driven or last-click attribution, with consent-modeled conversions filled in where consent was denied. Against GA4 alone, a 10 to 30% gap is normal, as Nice Looking Data's breakdown of the seven causes lays out.
- Meta counts purchases attributed to a Meta interaction inside its window, including 1-day view-through and 1-day engagement credit, dated to the interaction, with no deduplication against any other platform.
Four systems, four date bases, four eligibility rules, and each ad platform crediting itself for orders the others also claim. They will never agree. The process below makes that a feature.
Click date vs conversion date: why last month's ROAS keeps changing
Every reconciliation has a TIMING gap, and most of it comes from one decision each system makes quietly: whether a sale belongs to the day someone clicked the ad or the day they bought. Google Ads and Meta book a purchase to the click or interaction date. GA4 and Shopify book it to the day the order happened. When a shopper clicks in one month and buys in the next, the same sale lands in two different months depending on which report you open.
One sale, four systems
Take one $120 order. The shopper clicks a Google Shopping ad and a Meta ad on September 28, comes back, and buys on October 3.
| System | Date basis | Month the $120 lands in | When it shows up |
|---|---|---|---|
| Google Ads | Click date | September | Oct 3 or later, added to September after the month has closed |
| Meta | Interaction date | September | Oct 3 or later, added to September after the month has closed |
| GA4 | Conversion date | October | Oct 4 to 5, after the 24 to 48 hour processing lag |
| Shopify | Order date | October | Oct 3, immediately |
Same order, same $120. Two systems say September, two say October, and none of them is wrong.
AdBeacon matches click-based attribution to your Shopify orders, so you can see which month a sale belongs to in each view without rebuilding the report by hand.
The restatement nobody warns you about
Here's where it gets uncomfortable. Pull the September Google Ads report on October 1 and this sale isn't in it, so September shows $0 for it. Pull the same September report on October 5 and it shows $120. September's ROAS went up after September ended.
Google calls this conversion lag, and its own help documentation notes it can make ROAS look deflated and CPA look inflated until late conversions arrive. Multiply one order by every shopper who clicks late in a month and buys early in the next, and the month-end report you sent the client was always going to change. During BFCM, when clicks pile up in late November and purchases spill into December, the restatement can be large.
Cash view vs accrual view
The cleanest way to think about it is the distinction accountants already use. Northbeam's accounting-modes guide calls them Cash Snapshot and Accrual Performance. In plain terms:
- Click-date (accrual) views answer "was this campaign worth it?" They tie every sale back to the spend that produced it, so a campaign gets credit for orders that arrive days after its budget ran.
- Order-date (cash) views answer "what did we earn this month?" They match revenue to the period it hit the bank, which is what finance closes the books on.
Neither is wrong. Mixing them in one report is. A slide that puts Google Ads' click-dated revenue next to Shopify's order-dated revenue for the same month is comparing two different calendars and labeling the gap as performance.
What to do about it
- Add the conversion-time columns in Google Ads. "Conversions (by conv. time)" and "Conv. value (by conv. time)" re-date conversions to when they happened. Most accounts never add them, and they make Google Ads line up with Shopify and GA4 on the calendar.
- Exclude the last 7 days from campaign judgments. Recent click-dated numbers are still filling in. A campaign that looks weak on Monday can look fine by Friday without anything changing.
- Reconcile closed months only. This is why step 1 below says to pick a closed month and wait two weeks: by then the late conversions have landed and the TIMING gap has stopped moving.
- Label every report with its date basis. One line under the table, "click date" or "order date," prevents most of the meetings this problem causes.
The reconciliation process, step by step
- Pick a closed month and wait two weeks. Google Ads dates conversions to the click, so a purchase on the 3rd can land in the prior month. GA4 shifts attribution for up to twelve days. Meta's 7-day window needs to close. Reconciling the current month is reconciling a moving target.
- Set the anchor: Shopify paid orders, net of refunds, in the store time zone. Exclude tests, cancellations, draft orders, POS, and subscription renewals. Write the exclusion rule down, because next month's reconciliation has to use the same one.
- Pull three numbers from every ad platform, not one. Received events (Meta Events Manager Purchase count, Google conversion action count), attributed purchases (the Purchases column in each Ads Manager), and attributed revenue. Received minus anchor is your delivery gap. Attributed minus received is your credit gap. Mixing the two is how reconciliations fail.
- Pull GA4 separately, as a fifth column. Purchases and revenue from the same window, attributed under the model the property is set to. Note the model. GA4 is not an ad platform and doesn't belong in the same comparison as one.
- Build the bridge with reason codes. Start at the anchor and account for each platform's number with named adjustments. A practical set: DELIVERY (events the platform never received), TIMING (click-date versus order-date), SCOPE (orders you excluded that the platform counted, or vice versa), CREDIT (view-through, engagement, and modeled conversions above the click-verified count), DEDUP (double-counted events), and RESIDUAL (what's left). Bily's reconciliation method uses a similar structure and is worth reading for the worked example.
- Set tolerances and act on the ones that break. A stable 15 percent DELIVERY gap on Meta is a fact of life. A DELIVERY gap that jumped from 15 to 40 percent in one month is a broken pixel. A CREDIT gap that grew after March is Meta's engage-through change. A RESIDUAL above a few percent means you're missing a reason. The reconciliation is finished when every gap has a code and every code has a size you expected.
The 2026 changes that moved the numbers without anyone touching a setting
Three things changed this year that show up in a reconciliation as unexplained movement, and each one has a reason code.
- June 15, 2026: Consent Mode became the sole gate for Google Ads data flowing through GA4. The Google Signals toggle no longer controls it. Per WeltPixel's audit guide, a banner that denies ad_storage by default and never updates now blacks out remarketing and conversion signals silently, and a banner that grants by default over-collects. Either way, GA4's and Google Ads' numbers moved in June with no error and no announcement in your account. Code: DELIVERY, and check the gcs parameter.
- July 2026: Google started routing Shopify purchases into GA4 server-side. For stores with the Google and YouTube app, purchases now reach GA4 through the Data Manager API, bypassing the browser, as PPC Land reported. GA4's purchase count rose toward Shopify's. Its attribution didn't get better, because as the article notes, cleaner event capture "doesn't fix the attribution model underneath it." Expect GA4's DELIVERY gap to shrink and its CREDIT gap to stay.
- March 3, 2026: Meta redefined click-through and created engage-through. Meta's attributed purchases shifted between buckets and, on video-heavy accounts, rose. Code: CREDIT, and don't compare Meta's pre-March and post-March click numbers as if they measure the same thing.
Two Shopify changes add to that.
- January 13, 2026: app pixels switched to Optimized by default. Instead of always passing data to a third-party app's pixel, Shopify now decides when to share it. Shopify's app pixel documentation lists Optimized as the default, and WeltPixel's explainer notes it can pause a pixel it judges low-value with no alert to the merchant. Code: DELIVERY, and switch the app pixels you rely on to Always on under Settings, Customer Events.
- August 26, 2026: Shopify auto-upgraded the Thank you and Order status pages. Every store that hadn't upgraded was moved automatically, per Shopify's upgrade guide, and tracking tags pasted into Additional Scripts on those pages stopped firing. Orders kept coming in while purchase events stopped reaching the ad platforms. Code: DELIVERY, and confirm purchases are tracked through a web pixel or server-side.
That makes five reasons a 2026 reconciliation looks different from a 2025 one, none of which involved anyone on your team changing anything. Google's attribution gaps covers the Google side in more depth.
What to actually do
- Run the six-step process on last month, this week. The first pass takes an afternoon. The second takes an hour, because the exclusion rules and reason codes already exist.
- Report the bridge, not the columns. For attribution reporting to a client or a leadership team, a table of four disagreeing numbers invites the wrong conversation. A bridge from Shopify orders to each platform's claim, with reasons, invites the right one. Our list of attribution reports for CMOs has a place for it.
- Track the reason codes over time. This is the attribution analytics that matters: the size of each gap month over month is more useful than the size in any single month. A code that trends is a change you didn't make.
- Audit the June consent change if you haven't. Ten minutes in DevTools. If your Google numbers dipped or spiked in June, this is likely why.
- Add a fifth source that makes the bridge shorter. Every platform column above needs DELIVERY, CREDIT, and DEDUP adjustments because the platform both receives the event and grades itself on it. A first-party, click-only attribution record on your own domain starts from the anchor instead: it reads your orders, captures the ad click ID at landing, follows the session, and joins the two. Against Shopify, its bridge is one line: orders with a captured click versus orders without. It won't credit views or engagement, and it undercounts some upper-funnel influence. What it gives you is a number that reconciles to the anchor by construction, which is what you hold every platform's CREDIT gap against.
Reconciliation turns four disagreeing numbers into one explanation, and the explanation is what a client actually pays for. Anchor to orders, pull three numbers per platform, name every gap, and re-run it monthly so the platforms' changes show up as movement in a code rather than a surprise in a meeting.
If you want to see a click-only, first-party attribution record reconciled against your own Shopify orders, side by side with what Meta and Google claim, book a live AdBeacon demo.
FAQ
Why don't GA4, Shopify, Google Ads, and Meta conversion numbers match?
Each counts a different thing on a different date under a different attribution rule. Shopify counts orders placed; GA4 counts browser purchase events; Google Ads dates conversions to the click; Meta includes view-through credit. None deduplicates against the others.
Why did last week's ROAS go up?
Because ad platforms like Google Ads and Meta date conversions to the click or interaction, not the purchase. Sales from shoppers who clicked last week but bought this week get added back to last week's numbers as they arrive, so recent ROAS keeps rising for several days after the period ends.
Does Google Ads report conversions on the click date or the conversion date?
By default, the click date. The standard Conversions and Conv. value columns credit each conversion to the day of the ad click. Google Ads also offers "by conv. time" columns that date conversions to when they actually happened, which lines up better with Shopify and GA4.
What is a normal discrepancy between GA4 and Google Ads conversions?
Around 10 to 30 percent is typical, driven by click-date versus conversion-date, separate data-driven models, consent modeling, view-through conversions, and reporting lag.
How should I reconcile attribution data across platforms?
Anchor to Shopify paid orders net of refunds for a closed month, wait two weeks, pull received events and attributed purchases separately from each platform, and build a bridge from the anchor to each number using named reason codes such as delivery, timing, credit, and dedup.
What changed in GA4 in June 2026?
On June 15, Consent Mode became the sole control for Google Ads data collected through GA4; the Google Signals toggle no longer gates it. A misconfigured banner can now silently over-collect or black out conversion signals.
Which number should I trust for revenue?
Shopify, for financial decisions. It records every order server-side and nets refunds. Use ad platform and GA4 data for channel performance, and reconcile them to Shopify rather than the other way around.
Sources
- Blue Frog Analytics: Shopify Analytics vs GA4, Why the Numbers Don't Match (2026)
- Nice Looking Data: Google Ads vs GA4 Conversions Don't Match, Every Reason in Order
- Bily: Meta vs Shopify Purchases, a Reconciliation Method
- WeltPixel: GA4 June 2026 Consent Change on Shopify, What to Audit Now
- PPC Land: Google Silently Routes Shopify Purchases into GA4, Attribution Gaps Remain
- Shopify Help Center: App Pixels
- Shopify Help Center: Upgrading Your Thank You and Order Status Pages
- WeltPixel: Shopify Can Pause Your Pixel, the Optimized Data Sharing Default Explained
- Google Ads Help: About conversion lag reporting
- Northbeam: Accounting Modes 101, What Marketers Need to Know