Meta Ads Manager, Google Ads, GA4, and Shopify can each be right about the same 30 days and still report four different purchase counts.
Picture the monthly reporting call. Paid social brings the Ads Manager figure, finance brings Shopify orders, and the quickest proposal in the room is to rebuild the Meta pixel before anyone has written down what each number counts.
Start with a worksheet we call the 30-day purchase map. For each system it records what was counted, which date and timezone the export used, and which team may steer from that figure. The pixel rebuild becomes the last row, reached only after the map has checked for a definition mismatch, pending payment, and a consent handoff.
Shopify's analytics discrepancies guidance already lists cookies, JavaScript, browser extensions, reporting time zones, and different recording methods as reasons Shopify and Google Analytics disagree. Meta and Google Ads add attribution on top, because they count the purchases they credit to ads, while Shopify counts every order placed.
Which 30 days should each team export?
Pick one closed window that every team exports, and leave the most recent days out of it. Google Ads can report a conversion up to 90 days after the click and advises allowing 24 to 48 hours of processing before comparing platforms, so a window that ends yesterday will keep moving while the teams compare it.
Align the timezones as well.
Shopify Help names different reporting time zones as a cause of disagreement with Google Analytics. An order placed at 2am on a Monday in London falls on the Sunday in an ad account set to Pacific time, so the same purchase can land on two different dates.
Start the map with four rows before anyone opens a pixel debugger:
| Export | What you record | Pass criterion | Owner |
|---|---|---|---|
| Shopify orders | Order count, payment status breakdown, sales channel, timezone | The window matches the other three exports | Finance |
| Meta purchases | Purchase count, attribution setting, date basis of the export | The ad set attribution setting is written on the map | Paid social |
| Google Ads conversions | Conversion action name, click-date or conversion-time column | The selected action counts purchases | Paid search |
| GA4 purchases | purchase event count, transaction ID presence, consent markets | Each purchase event carries a transaction ID | Analytics |
A campaign-led stack puts these figures in separate tools. The Jordana Ticia rebuild that oContis delivered on Online Store 2.0 with Enchant Digital has Klaviyo wired in for lifecycle campaigns, so a beauty and skincare brand like that can read paid social, lifecycle email, and Shopify orders in three different reports for the same week. The map gives those teams one place to record why the reports differ.
What do Meta, Google Ads, GA4, and Shopify each count?
Each system follows its own counting rule, so the first class on the map is a definition mismatch.
Shopify sales reports count the orders placed on a given date, and gross sales include pending, cancelled, and unpaid orders, while test and deleted orders are excluded. The same help page lists a Total sales by sales channel report, so split the Shopify export by channel and keep draft orders and other channels in their own rows.
Meta credits a Purchase to an ad according to the attribution setting on the ad set, which can count conversions after impressions, clicks, or video plays. Shopify's Facebook data sharing sends Purchase when a visitor completes a purchase and views the thank you page. Events that track order value use the checkout total, including duties, taxes, and discounts, so compare counts before you compare values.
Google Ads counts the conversion action you selected. Its standard Conversions column is dated by the ad click, the by conv. time columns are dated by the conversion, and Google suggests the second set when comparing with Google Analytics or Shopify. The Conversions column may also include modelled conversions, and view-through conversions sit outside it by default.
GA4 counts the purchase events that reached its tag, and Google asks for a transaction ID on every ecommerce event so it can remove duplicate purchases. Google Analytics defaults to data-driven attribution, and Shopify's Performance by marketing channel report defaults to last non-direct click. Adding Meta, Google Ads, and GA4 together will overstate orders, because each of them can credit the same checkout.
| System | What it counts | Date it uses | Common reasons it differs from Shopify orders |
|---|---|---|---|
| Shopify sales reports | Orders placed, including pending, unpaid, and cancelled | Order date | Baseline for the map |
| Meta Ads Manager | Purchases credited to ads under the ad set attribution setting | Record the date basis of the export | View and video play credit, browser blocking, consent |
| Google Ads | The selected conversion action | Click date or conversion time, depending on column | Non-purchase actions, click-dated rows, modelled conversions |
| GA4 | purchase events that reached the tag | Event date | Blocked cookies or JavaScript, missing transaction IDs, consent |
Subscriptions add another row. Kloudy Matcha is a health and wellness storefront that sells subscriptions from the product page through a custom block. Shopify's subscription contract documentation says a renewal order is created when a billing attempt succeeds against the contract, so record renewals separately before anyone counts them as missing ad conversions.
Write the definition row first. When Meta sits higher because view-through credit is switched on, or Google sits lower because the selected action is a form submission, the gap belongs to this class and the pixel can stay as it is.
Is the gap an unpaid order?
Shopify Help is explicit that sales reports do not track money moving between you and your customers. Orders placed with a manual payment method such as cash on delivery or bank transfer are marked pending until you mark them paid, and the payment instructions appear on the order confirmation page after the customer completes checkout.
That timing matters for Meta.
Shopify's Meta integration sends Purchase when a visitor completes a purchase and views the thank you page, so an order that is still unpaid can already have sent a Purchase to Meta. Filter the Shopify export by payment status for the same 30 days, with paid, pending, and cancelled or refunded orders in separate rows.
Refunds and cancellations appear in Shopify sales reports as reversals on the date they are processed. They move net sales in a later period, while the order still counts on the date it was placed, so keep the count job apart from the revenue job.
Finance needs the paid figure.
When the paid filter explains the remaining gap, finance should steer from paid Shopify orders, with Shopify's payments finance reports for cash, and paid social should keep the attributed figure for delivery decisions. Write both definitions on the map so neither team has to defend the other's number.
Did consent stop the purchase event?
Shopify pixels load on the storefront, checkout, Thank you page, and Order status page, and they run in a sandbox. In markets configured to require consent, usually the EEA and the United Kingdom, web pixels run only when visitors have granted the permissions in the pixel configuration, and new pixels require Marketing and Analytics permissions by default.
A declined banner leaves a Shopify order with no event from that web pixel. Record those markets as a consent row, and keep the gap visible on the map once the consent setting matches your privacy policy.
Browser blocking sits in the same class. Shopify Help says browser extensions can block Google Analytics from tracking sessions and purchases, and that a browser-based ad blocker can stop the Meta pixel on Standard data sharing. Enhanced and Maximum add the Conversions API, which Shopify says cannot be blocked by browser-based ad blockers, and both levels share customer name, location, email address, and phone number with Meta for matching.
Treat that as a privacy decision.
Then place one test order with marketing consent granted and another with it declined, and record which events reach Meta, Google Ads, and GA4 for each.
30-day purchase-gap classes
Which app writes the Purchase event?
Look for a broken writer only after the first three classes have failed to explain the gap.
Shopify set 26 August 2026 as the deadline for non-Plus stores to upgrade their Thank you and Order status pages, and stores that had not upgraded were upgraded automatically. Script tags also stopped running on the Order status page for non-Plus stores on that date, with web pixels as Shopify's replacement for conversion tracking. Check whether a Google, Meta, or TikTok purchase tag lived only in Additional Scripts, then confirm which app or custom pixel now writes it.
Two writers of the same Purchase are the other break to check. Shopify's Facebook and Instagram app can already send the pixel event and, on Enhanced or Maximum, the Conversions API event. Meta's deduplication documentation treats a browser event and a server event as duplicates when their event name and event ID match, so a second custom pixel, tag manager container, or server-side tracking app on the same path can double-count when the IDs differ.
List every app and custom pixel that sends Purchase or checkout_completed, then keep one path per ad platform and repeat the two consent test orders.
One more check sits outside the map. Shopify's session measurement rollout ran from 21 to 23 September 2026, and Shopify says sessions and conversion rate might change without any change in orders. Send anyone comparing conversion rate back to the order export, because the map compares purchase counts.
Which figure does each team use?
The last column on the map names the figure each team may steer from.
Finance uses paid Shopify orders, with the payments finance reports for cash. Paid social uses the attributed Meta or Google Ads figure for delivery and creative decisions, with the attribution setting written beside it. Analytics uses GA4 purchase events for on-site behaviour and expects them to sit below Shopify wherever cookies, blockers, or consent remove events.
Those figures can stay different. Trouble starts when one figure is used to disprove another before its class has been written down.
Write the owner on each row. Paid social keeps the attribution setting fixed for the window, finance keeps its payment-status filter, and analytics records the consent gaps that policy requires.
Then take the four figures back to the reporting call with their classes attached, and leave the pixel rebuild as the last row on the 30-day purchase map.
If two apps write Purchase, a purchase tag lived only in Additional Scripts, or consent settings leave a market without purchase events, book a stack assessment and bring the four exports. An integrations and system optimisation review can list every writer of the purchase event and give finance and paid social labelled figures they can share.



