Opens in a new tab
Home/Blog/Why Meta, Google and GA4 never match your WooCommerce orders

Why Meta, Google and GA4 never match your WooCommerce orders

Product Updates & Use CasesPhillip StemannOctober 30, 2026

Last updated: October 6, 2026

Title card: Why Meta, Google and GA4 never match your WooCommerce orders
In this article
Key takeaways
  • Meta, Google Ads, GA4 and WooCommerce count different things, on different clocks, with different credit rules. A gap is normal. An unexplained gap is the thing to chase.
  • Work one day at a time: same day, same time zone, paid orders only. Then split the gap into duplicates, window and date effects, and lost events until nothing is left unexplained.
  • If a platform shows more than WooCommerce, check duplicates first, then non-paid or test orders, then windows and view-through. If it shows less, check delivery first, then lost events, consent and modeling, then whether the platform was credited at all.
  • Google Ads files conversions against the ad interaction by default; “by conv. time” columns line up with your own sales dates. Meta’s standard setting can credit clicks for up to 7 days and views for 1 day.
  • A worksheet beats a theory. Write the counts down, label each reason, and stop when the unexplained line is zero.

On Monday your WooCommerce dashboard says 19 orders. Meta says 24 purchases. Google Ads says 21. GA4 says 17. Everyone has a favourite number and a theory about whose fault it is.

Most of the time nobody is lying. Each tool answers a slightly different question. This guide gives you a one-day reconciliation, a worksheet to record it, and a decision tree for the two directions a mismatch can go.

Why the numbers differ: they measure different things

WooCommerce counts orders: rows in your database with a status, a total and a timestamp in your store’s time zone. An ad platform counts attributed conversions: events it received, which it then decided to credit to an ad, under rules you may not have read. GA4 counts key events in its own reports, with its own attribution settings and its own processing delay.

So “the platform says 24, the shop says 19” is not a contradiction until you have lined up the day, the time zone, the order status, the revenue definition and the attribution rules. Only then is a remaining gap a bug.

If you send purchases from the server, WooCommerce server-side tracking: purchases, refunds, subscriptions covers how the events are produced. This post starts after that: the events exist, and the numbers disagree.

Step 0: line up the comparison before you compare

Many mismatches disappear here. Fix these four things first.

  1. One day. Pick a single, complete, recent day. Not a month. One day lets you list every order.
  2. One time zone. Your store has a time zone (WordPress, Settings, General). Your Google Ads account has one: Google states that reports segmented by time follow it and that it can no longer be changed in standard accounts (Google Ads Help, time zone setting). Your GA4 property has one too; Google describes daily data as usually ready around 3:30 PM in the property’s time zone (Analytics Help, data freshness). If your store runs on Copenhagen time and your ad account on Pacific time, an evening order lands on different days.
  3. Paid orders only. WooCommerce documents Processing as “payment has been received,” On hold as awaiting payment confirmation, and Failed, Cancelled and Refunded as separate states (WooCommerce, Order statuses). Decide which statuses count as a sale and filter the same way every time. Remove admin and test orders.
  4. One revenue definition. Does your number include tax? Shipping? Which currency? GA4’s purchase event needs a currency alongside the value (GA4 ecommerce setup), and Meta’s Purchase event lists both value and currency as required (Meta Pixel reference). Pick one definition and make the shop report and the events agree.

Then wait. Google says GA4 data processing can take 24 to 48 hours, and that attribution credit for key events can change for up to 12 days after the event as modeling improves (Analytics Help, data freshness). Reconcile a day that is at least two days old.

The attribution clocks: what each platform credits, and for how long

An attribution window is how long after an ad interaction a conversion can still be credited to that ad. The three platforms use different windows and different defaults, and each is changed in a different place.

Table comparing click, view and credit-model settings in Meta Ads, Google Ads and GA4
Windows differ by platform and by setting. Sources: Meta Business Help, Google Ads Help, GA4 Admin API; checked October 2026.

Meta

Meta’s standard attribution setting lets you credit click-through events within 1 or 7 days of a link click, view-through events within 1 day of an impression, and engage-through events within 1 day of a non-link click action (for video, a play of 5 seconds counts). The setting is chosen per ad set, and Meta warns that results cannot be compared across ad sets with different attribution models, because each uses different counting mechanisms (Meta Business Help, About attribution models and attribution settings).

Google Ads

Google Ads sets windows per conversion action. The click-through default is 30 days (1 to 30, or 60 or 90 for Search and Display), the engaged-view default is 3 days, and the view-through default is 1 day (Google Ads Help, conversion windows). Changing a window only applies to conversions recorded from then on; history is not recounted. For credit, Google Ads currently offers last-click and data-driven attribution; the other rule-based models are no longer supported. Data-driven attribution looks at interactions across Search, Shopping, YouTube, Display and Demand Gen, and Google recommends at least 200 conversions and 2,000 ad interactions in a 30-day period for it to work well (Google Ads Help, data-driven attribution).

GA4

GA4 has its own lookback settings: acquisition events default to 30 days (7 or 30 selectable) and all other conversion events default to 90 days (30, 60 or 90). The reporting attribution model can be data-driven, paid and organic last click, or Google paid channels last click, and changing it applies to historical and future data (GA4 Admin API, AttributionSettings; Analytics Help, attribution). All three models exclude direct visits from credit unless the whole path is direct, which is one reason GA4 and an ad platform can put the same order in different channels.

Which day does a conversion belong to?

This one catches experienced marketers. A platform can file a conversion under the day of the ad interaction or under the day the conversion happened.

Google documents this directly: its Campaigns page records the time of the ad query preceding the click that led to the conversion, and you can add “by conv. time” columns to align with the day the conversion occurred (Google Ads Help, attribution reports). A customer who clicked an ad on Monday and bought on Thursday is a Monday conversion in the standard column and a Thursday conversion in the “by conv. time” column.

For Meta, which date its reporting files a conversion under could not be confirmed from Meta’s own help pages, so check it in your account rather than assume.

Reasons a platform shows MORE than WooCommerce

1. The same order is counted twice

The classic. Browser and server both send a purchase and nothing links them, or two plugins fire the same Pixel event. Meta only merges a Pixel event and a server event when the Pixel’s eventID equals the server’s event_id and the event names match, within 48 hours (Meta, Deduplicate Pixel and Server Events). The full rules are in Meta CAPI deduplication and event_id explained, and the setup in Meta Conversions API for WordPress.

GA4 has a similar mechanism: it deduplicates purchase events that share a transaction ID, for web streams only. An empty-string ID collapses every purchase into one, and the same ID reused across different transactions undercounts (Analytics Help, transaction IDs). The WooCommerce order number is the natural value for both, as long as it is unique per order.

How to tell: count distinct order IDs in the platform’s events, not rows. If distinct IDs match WooCommerce and rows are higher, you have duplicates, not attribution.

2. Non-sales were sent as sales

If the purchase event fires when the order is created rather than when it is paid, Pending payment, Failed and Cancelled orders become “purchases”. Test orders and staff orders do the same. Compare the platform’s order IDs against WooCommerce’s list and look at the statuses of the extras.

3. Credit that WooCommerce never sees

Not every extra conversion is an error. A view-through conversion is a purchase credited to an ad someone saw but did not click, inside the view window you set. A platform can also credit a purchase that WooCommerce, correctly, files under another channel. Neither adds an order: they are the same orders credited in more than one place, so adding up Meta’s, Google’s and GA4’s attributed purchases can exceed your real total. That is expected.

4. Per click versus per order

Google Ads lets you count “every” conversion after an ad interaction or only “one” per click; “every” suits sales and “one” suits leads (Google Ads Help, counting settings). With “every”, Google notes conversion rate can exceed 100% (Google Ads Help). In GA4, a key event can be counted once per event (recommended) or once per session, and events migrated from Universal Analytics goals default to once per session (Analytics Help, counting method). With “once per event”, a thank-you page that reloads can count an order twice unless the transaction ID rescues you.

5. Refunds and cancellations are not subtracted

The platform saw the sale, then the order was refunded. Unless something tells the platform, the conversion stays. Google Ads supports conversion adjustments: a retraction removes the conversion and its value, a restatement lowers the value only, and online adjustments require a transaction ID (Google Ads Help, conversion adjustments). WooCommerce also notes that a Refunded status can be administrative only and not return money, so do not treat status as ground truth for cash. Refund events are covered in the WooCommerce server-side tracking guide.

6. Modeled conversions

Google can estimate conversions it cannot observe. GA4 says modeled key events cover cases such as privacy restrictions, device switching and consent requirements, are included only when there is high confidence of quality, and appear in core reports (Analytics Help, modeled key events). Behavioral modeling for consent mode has thresholds, including at least 1,000 events a day with analytics storage denied for 7+ days and 1,000 daily users with it granted on 7 of 28 days (Analytics Help, behavioral modeling). Reporting identity matters too: Blended falls back to modeling when no identifier exists, Observed does not (Analytics Help). A modeled conversion has no order row behind it, so it can never reconcile line by line. Track the modeled share separately; do not chase it.

7. Bots and fake checkouts

GA4 automatically excludes known bots and spiders, and you cannot turn this off or see how much was removed (Analytics Help, known bot-traffic exclusion). Undeclared bots are not covered. A fake checkout that ends as a Failed order is not a sale; if your purchase event fires before payment is confirmed, it can look like one on the platforms.

Decision tree with two branches: platform shows more than WooCommerce, and platform shows less, each with four ordered checks
Work down one branch and stop when the gap is closed.

Reasons a platform shows LESS than WooCommerce

1. The event never arrived

Check delivery first, because it is the cheapest to verify. If you forward events from a server, the delivery log shows whether each one was sent and what the platform replied. A missing order with no log entry means the trigger did not fire. A log entry with an error means the platform rejected it.

2. The browser event was lost

Browser tags miss events: ad and tracker blockers, browser restrictions, closed tabs, and payment gateways that redirect away and never return the customer to your thank-you page. These are the missing-data causes covered in why your WordPress analytics data is missing and client-side vs server-side tracking. For cookie limits specifically, see Safari ITP and WordPress.

3. Consent was denied

If a visitor declines, a tag may send nothing, or send a limited signal that the platform may model. That is a setting you chose, not a bug, but it does lower observed counts. See Consent Mode v2 on WordPress for how the signals work.

4. The order is real but not credited to that platform

This is the one that confuses people most. Meta can only show purchases it attributed to Meta ads. A customer who arrived from email, search or a direct visit is a real order that Meta correctly does not claim. Compare total purchase events received against WooCommerce to test tracking, and compare attributed purchases against WooCommerce only to understand credit. They answer different questions. GA4 behaves the same at channel level: total purchase key events should sit near your orders, while a single channel’s share will be lower by design.

5. Late processing and offline uploads

GA4 data can still be changing for 24 to 48 hours, and attribution credit for up to 12 days (Analytics Help). Data thresholds are a separate matter: GA4 applies them to demographic data and search queries, and the help page does not say they affect event counts (Analytics Help, data thresholds), so do not blame thresholds for a purchase gap without proof. For offline conversions, Google Ads attribution reports skip a conversion uploaded more than 7 days after it happened, while standard reporting still counts it within your window (Google Ads Help, attribution reports). Click IDs and uploads are covered in Google Ads offline conversions for WordPress and GCLID, GBRAID and WBRAID.

The method: reconcile one day, line by line

  1. Export WooCommerce. One day, store time zone, paid statuses only, no test orders. Columns: order ID, time, total, status, and traffic source if you store it. Count distinct IDs. Call this B.
  2. Get each platform’s number for the same day. Google Ads: use the “by conv. time” columns. GA4: purchase key events for that date in the property’s time zone. Meta: write down the attribution setting behind the number. Call this A.
  3. Get order IDs, not just counts. Where the platform exposes them (the GA4 transaction ID in a report or export, the delivery log for server events), list them. Matching IDs line by line is the only way to see which orders are missing or doubled.
  4. Fill in the worksheet. Gap C is A minus B. Allocate it to duplicates, window and date effects, and lost events. Whatever is left is unexplained.
  5. Chase the unexplained. Repeat on a second day. A cause that repeats is systematic and fixable. A cause that does not repeat is probably timing.
Reconciliation worksheet with illustrative counts for Meta, Google Ads and GA4 against 19 WooCommerce orders
Illustrative numbers, not benchmarks. The point is the structure: every unit of gap gets a label.

There is no “normal” discrepancy percentage here, because the platforms do not publish one. Your goal is an unexplained line of zero on a given day.

If you forward events with a tool that keeps a per-event delivery log, step 3 gets easier. Traculo records the response from each integration for every event and lets you export the log as CSV or JSON, so “which orders did Meta actually receive?” has a document behind it.

A checklist to keep

Eight-item checklist: time zone, paid statuses, revenue definition, order ID, windows, late data, delivery log, refunds
Run it before you open a support ticket with anyone.

What to do with the result

Once the gap is explained, decide which number answers which question.

  • “How many orders did we take?” WooCommerce. It is the system of record.
  • “Are my tags and server events working?” Total purchase events received, by distinct order ID, against WooCommerce.
  • “Which campaign should get more budget?” Platform-attributed numbers, read with their windows in mind and cross-checked against campaign data on your own site. For on-site context see bounce rate vs engagement rate.

Agencies: put the windows and your definition of “conversion” at the top of every client report (client reporting for WordPress agencies).

Frequently asked questions

What is a normal difference between Meta and my WooCommerce orders?

There is no official figure. Meta and WooCommerce count different things, so some gap is expected; what matters is explaining each unit of it on a given day.

Why does Google Ads show conversions on days with no orders?

Because the standard conversion columns follow the ad interaction, not the sale. Add the “by conv. time” columns to see conversions on the day they happened.

Can adding up Meta, Google and GA4 purchases exceed my real orders?

Yes. Each platform credits conversions independently, so one order can be claimed by several of them. Use WooCommerce as the total and the platforms as views of credit.

Do refunds reduce the conversions in my ad platforms?

Not automatically. Google Ads accepts retractions and restatements keyed by transaction ID. Check whether your setup sends them.

Is the gap a sign tracking is broken?

Not by itself. A gap in attributed counts is normal. A gap between total purchase events received and real orders is the signal worth investigating.

Related reading

Want a view of your own funnel that does not depend on any ad platform’s credit rules? Take a look at Traculo’s goals, conversions and funnels.

ShareLinkedInXEmail

About the author

Track what matters, without the guesswork

Traculo gives WordPress sites analytics, funnels and server-side event forwarding in one dashboard. Start on the free plan with 10,000 events a month.

Try Traculo free

Related articles

Title card: WooCommerce server-side tracking: purchases, refunds, subscriptions
Product Updates & Use CasesOctober 28, 2026

WooCommerce server-side tracking: purchases, refunds and subscriptions

Why the thank-you page loses WooCommerce purchases, and how to track purchases, refunds and renewals from order hooks with one shared ID.

Read more
Title card reading LinkedIn Conversions API for WordPress on a dark slate background with an orange glow

LinkedIn Conversions API for WordPress

How to send WordPress lead conversions to LinkedIn with the Conversions API: li_fat_id, hashed email, payloads, limits, timing and API version upkeep.

Read more
Title card reading GCLID, GBRAID and WBRAID: what they are and when each appears, on a dark slate background with an orange glow

GCLID, GBRAID and WBRAID: what they are and when each appears

What Google's click IDs are, when gclid, gbraid and wbraid appear, the upload rules, how WordPress loses them and how to capture them reliably.

Read more