When Meta Ads, Google Ads, GA4 and Shopify report different purchase numbers, the gap almost always comes from ten things: different attribution windows, view-through credit, different attribution models, click date versus conversion date reporting, cross-device matching, modeled conversions, ad blockers and consent loss, duplicate counting, time zone and currency settings, and refunds that only Shopify subtracts. Shopify is the order ledger and should be your source of truth for revenue; the ad platforms and GA4 are attribution estimates, and you fix the gap by aligning dates, windows and deduplication, not by forcing the numbers to match.
Each system sees a different slice of the same purchase. Shopify records the order when checkout completes, in the store's time zone, and later subtracts returns. The Meta pixel and Conversions API send a Purchase event that Meta credits to an ad if the buyer clicked or saw one inside the ad set's attribution setting. The Google tag sends a purchase conversion that Google Ads credits to a prior ad interaction inside the conversion action's window and model. The GA4 tag sends a purchase event that GA4 credits across every channel, paid and organic. Four rulebooks, one order.
The 10 reasons the numbers differ.
- Attribution windows: Meta's default credits a purchase up to 7 days after a link click, Google Ads defaults to 30 days after a click, and GA4 looks back 90 days for purchase key events, so the same order can fall inside one window and outside another
- View-through credit: Meta's default setting includes purchases 1 day after someone only saw the ad, while Google Ads keeps most view-through conversions in a separate column and GA4 and Shopify never count a view
- Attribution models: Google Ads and GA4 default to data-driven attribution, which splits credit across touchpoints, while Shopify's marketing reports default to last non-direct click, which gives one channel all of it
- Click date versus conversion date: Google Ads' main Conversions column puts the sale on the day of the ad click, while Shopify, GA4 and Meta Ads Manager put website purchases on the day they happened
- Cross-device matching: Meta and Google tie a phone ad click to a laptop purchase through logged-in users and modeling, while GA4 and Shopify usually see two separate visitors
- Modeled conversions: Google Ads fills consent gaps with consent mode modeling and Meta uses statistical modeling where data is missing, so their totals include estimates that Shopify never sees
- Ad blockers and consent loss: when a browser tag is blocked or consent is declined, the pixel or GA4 tag never fires, so platforms without a server-side feed under-report while Shopify still logs the order
- Duplicate counting: every ad platform claims the orders it touched, so the platforms together exceed Shopify, and a missing event or transaction ID can double count inside one platform as well
- Time zones and currency: each account reports days in its own time zone and converts revenue at its own exchange rate, which shifts orders across midnight and changes reported value
- Refunds and cancellations: Shopify records a reversal as a negative on the day it is processed, while ad platforms keep the original purchase unless you send an adjustment
How each platform counts a purchase.
These are the defaults as documented by each platform in October 2026. Every one of them can be changed in settings, so check what your account actually uses before you compare.
| Setting | Meta Ads Manager | Google Ads | GA4 | Shopify |
|---|---|---|---|---|
| What it counts | Purchases it attributes to Meta ads | Conversions it attributes to Google ads | Purchase key events from all channels | Every completed order |
| Default model | Standard attribution, credit to Meta when a qualifying touch exists | Data-driven | Data-driven | Last non-direct click (marketing reports) |
| Default click window | 7 days after a link click | 30 days (1 to 90 allowed) | 90-day lookback for non-acquisition key events | Not applicable to order counts |
| View credit | 1 day after view, plus 1-day engage-through | 1-day view-through window, reported in its own column for most campaign types | None | None |
| Date a sale is reported | Date of the purchase for website conversions | Date of the ad click in Conversions; purchase date in Conversions (by conv. time) | Date of the purchase | Date of the order |
| Modeled conversions | Yes, where data is partial or missing | Yes, consent mode and cross-device | Yes, behavioral modeling with Blended reporting identity | No |
| Refunds | Not subtracted | Not subtracted unless you upload adjustments | Subtracted only if you send a refund event | Subtracted on the day processed |
| Dedupe key | event_id shared by pixel and Conversions API | Transaction ID | transaction_id | Order ID |
Meta changed its click definition in March 2026: click-through attribution now counts only link clicks, and conversions after shares, saves and other non-link engagement moved into engage-through attribution. If your Meta numbers shifted then, that is why.
How to find where the gap comes from.
Three tools, in this order. Start from the ledger and work outward.
Shopify first. Export orders for a closed date range from Orders, and note the store time zone in Settings, General. Exclude test, draft and point of sale orders if your ad tags only see the online store. This is your denominator.
Google Ads second. In Goals, Conversions, Summary, confirm which actions are Primary, their count setting, window and attribution model. Then in the campaign report add the Conversions (by conv. time) and Conv. value (by conv. time) columns so the dates line up with Shopify, and segment by Conversions, Conversion action to see whether two actions are counting the same purchase.
Meta and GA4 third. In Ads Manager, use the Columns menu to compare attribution settings side by side, which shows how much of the result is view-through. In GA4, open Advertising, then Attribution, then Attribution models to compare data-driven with paid and organic last click, and check Admin, Data display, Reporting identity to see whether modeled data is included.
Reconcile top to bottom.
Each step removes one source of difference. Stop when the remaining gap is explained.
| Symptom | Likely cause | Fix |
|---|---|---|
| Meta and Google together claim more sales than Shopify | Both platforms credit the same orders | Normal; never sum platforms, use Shopify for totals |
| One platform alone reports more purchases than Shopify | Duplicate tags or no dedupe ID | Keep one Primary action; share event_id or transaction ID |
| GA4 purchases well below Shopify orders | Ad blockers, declined consent, or a missing purchase tag | Add server-side events; check the thank-you page tag |
| Google Ads last week keeps rising | Conversions reported on click date | Use the Conversions (by conv. time) column |
| Meta reports far more than GA4 credits to Meta | View-through and engage-through credit, cross-device | Compare 7-day click only; accept the rest as view credit |
| Daily totals off but weekly totals close | Different account time zones | Align time zones or report weekly |
| Platform revenue above Shopify net sales | Refunds not sent to ad platforms | Compare gross to gross; upload adjustments if bidding on value |
| Google Ads jumps after enabling consent mode | Consent mode modeling added estimates | Expected; note the change date in reporting |
Which number to use for which decision.
- Total revenue, profit and overall marketing efficiency: Shopify net sales divided by total ad spend
- Shifting budget between campaigns or ad sets inside Meta: Meta Ads Manager, on a consistent attribution setting
- Shifting budget between campaigns inside Google Ads: Google Ads Conversions, since it is the same data the bidding uses
- Comparing channels against each other, including organic and email: GA4 with one model, read consistently over time
- Whether a channel adds sales at all: a holdout or incrementality test, since none of the four reports measures what would have happened without the ads
The bidding systems learn from the events you send them, so the quality of those events matters more than matching reports. Server-side sending through the Meta Conversions API and enhanced conversions in Google Ads closes much of the blocker and cross-device gap. If you are weighing a third-party attribution tool to sit above all of this, our Triple Whale vs Northbeam comparison covers what they add.
What is normal and what is a red flag.
Some gap is built into the defaults. Meta credits a 1-day view by default and none of the other three do. Google Ads keeps counting for 30 days after a click by default, and up to 90 days if you extend the window. GA4 looks back 90 days for purchase key events. GA4 data can change for 24 to 48 hours after the day ends. Google Ads consent mode modeling only switches on once a domain reaches 700 ad clicks over 7 days per country, and GA4 behavioral modeling needs at least 1,000 events per day with analytics storage denied for 7 days plus 1,000 daily consented users on 7 of the last 28 days, so small accounts often see no modeled lift at all.
Red flags: any single platform reporting more purchases than Shopify has orders, GA4 purchases far below Shopify with no consent banner to explain it, a sudden step change on a day nobody touched the ads, or revenue per conversion that does not match your average order value. Those point to broken tags or duplicate actions, and the conversion tracking audit checklist is where we go next. If Meta alone collapses, start with why your Meta pixel is not firing.
Why does Meta show more purchases than Shopify?
Meta's default attribution setting credits purchases up to 7 days after a link click and 1 day after someone only saw the ad, and it matches buyers across devices. Other channels may also claim those same orders. If Meta alone reports more purchases than Shopify has orders in total, check for duplicate pixels or browser and server events without a shared event ID.
Why don't Google Ads conversions match GA4?
Google Ads reports conversions on the date of the ad click and gives credit only to Google ads, while GA4 reports on the date of the purchase and spreads credit across every channel. They can also use different windows and different tags. Compare Google Ads' Conversions (by conv. time) column to GA4's Google Ads traffic over the same closed range.
Which number should I trust for ROAS?
For total business efficiency, divide Shopify revenue by total ad spend. For decisions inside one platform, such as which campaign to scale, use that platform's own conversions on a consistent setting, because that is what its bidding optimizes against. Do not add Meta and Google Ads revenue together.
Why is GA4 lower than Shopify?
GA4 only counts purchases its tag records in the browser. Ad blockers, declined consent, a missing tag on the order status page, and orders created outside the online store all reduce it. Shopify records every order regardless. A gap that suddenly grows usually means a tag broke.
Do refunds reduce conversions in Meta or Google Ads?
Not on their own. Shopify subtracts a refund on the day it is processed, but Meta and Google Ads keep the original purchase. Google Ads accepts conversion adjustments and GA4 accepts a refund event, but you have to send them.