Lock in $67
Method

Meta purchases vs Shopify orders: a cross-check in Claude

Shopify says one number, Claude reading your ad account says another. Neither is lying, and the gap between them is really two gaps.

Espen Opdahl Published 6 min read
The short answer

Compare three numbers, not two: the orders Shopify recorded, the Purchase events Meta received, and the purchases Meta attributed to your ads. A gap between the first two is a tracking problem. A gap between the last two is attribution, and some of it is expected. Through Meta’s official ads connector the check works on totals only — there is no order ID to join on — and the reader has no option to date purchases by the day they happened, so compare by week or month, never by day.

Shopify says one number for last week. Claude, reading your ad account, says another. The tempting move is to decide which one is lying and stop trusting it.

Neither is lying. They are counting different things, on different dates, under different rules. The useful question is not which number is right, but where between the checkout and the report the orders went missing — and that has an answer you can find in about ten minutes, if you split the gap in two.

Two gaps, not one

A Shopify order becomes a Meta purchase in two steps. First the event has to reach Meta, from the pixel in the shopper’s browser, from Shopify’s server, or both. Then Meta has to credit it to an ad the shopper saw or clicked inside the attribution window. Anything lost in step one is tracking. Anything lost in step two is attribution.

A reply in a Shopify Community thread (started 3 January 2026, on a store where Ads Manager showed fewer purchases than Shopify) put it in one line: “Events Manager shows raw events received by Meta. Ads Manager only shows purchases that Meta can attribute to an ad.” The connector has a separate tool for each of those, and that is what makes the split possible from one chat.

  • Events received: ads_get_dataset_stats returns event volume for a pixel or dataset, filterable to a single event such as Purchase and to WEB_ONLY (browser) or SERVER_ONLY (Conversions API). Its default window is the last 7 days and its schema caps the look-back at four weeks.
  • Purchases attributed: omni_purchase from the entity reader, which the field catalogue describes as “the number of purchase events attributed to your ads”. The narrower offsite_conversion_fb_pixel_purchase counts only purchases tracked on your website by the pixel or Conversions API.

If you only sell through your own store, the website field is the closer match to Shopify’s online store orders. omni_purchase also includes purchases that happen directly on Meta’s own surfaces.

Checking a number against its source before acting on it is part of the weekly routine the Claude Ads Operator course teaches, alongside the habits in catching wrong numbers in Claude’s reports.

worth knowing Meta’s API can date a purchase by the day it happened. The connector’s reader cannot ask for that.

Meta’s Insights API reference has an action_report_time parameter: someone who saw an ad on one day and bought the next shows up on the first day under impression and on the second under conversion. Shopify reports by order date. The connector’s entity reader takes a date preset or range, a time increment and breakdowns, and has no report-time or attribution-window parameter; asked for action_report_time and use_unified_attribution_setting, the field catalogue returned both as unknown fields (checked 2026-09-13). Daily figures will not line up, and nothing in the chat can make them.

What each side counts

Shopify ordersPurchase events receivedPurchases attributed
Where it comes fromShopify admin or Shopify’s own connectorads_get_dataset_statsads_get_ad_entities
CountsEvery completed orderEvery Purchase event that reached Meta, ad or no adOnly purchases credited to an ad inside the window
Dated byOrder dateWhen the event was receivedMeta’s reporting default; not selectable here
Look-backWhatever you chooseFour weeks at mostDate preset or range
Order-level joinYesNoNo — order_id is an unknown field

Two traps sit in the defaults. The entity reader measures the last four weeks when you name no dates, while the analytics examples in the Shopify connector’s tool description use a thirty-day window, so two “last month” answers can cover different days. And value is not revenue by another name: Shopify’s data sharing page says events that carry an order value use the order’s total price, “including duties, taxes, and discounts.” Compare that to Shopify’s total sales, not net sales.

The cross-check, in order

  1. Fix one closed window and state it first

    Pick a full past week that ended a few days ago, so late conversions have landed. Give both connectors the same explicit dates. Never let either one default.

  2. Shopify orders against Purchase events received the tracking gap

    Ask for the Purchase count from the dataset, then again with SERVER_ONLY and WEB_ONLY. Shopify says its Enhanced and Maximum sharing levels send the purchase event server to server through the Conversions API. If the server-only count is zero on either level, the integration is not doing what the setting says, and no amount of attribution analysis will fix that. Whether the stats count events before or after deduplication is not stated in the tool’s schema, so do not read a browser and server count of similar size as proof of double counting.

  3. Events received against purchases attributed the attribution gap

    This gap is supposed to exist: organic orders, email orders and purchases outside the window all reach Meta and are never credited. Read the ad set’s attribution_setting before judging its size — it is an ad set field only, and a one-day-click ad set will credit less than a seven-day-click one.

    The trade: without an order ID you cannot say which orders are in the gap, only how big it is.

  4. Compare the value last, against total sales if counts line up

    Once the counts make sense, check value. A value gap with matching counts is usually a definition problem — taxes, shipping, currency — rather than missing orders.

A vendor blog from TrackBee (Frank de Vos, 27 June 2026) tells readers that “a gap of 20–35% is normal with the default 7-day click + 1-day view window”. A single normal range blends the two gaps. A modest total can hide a broken server integration that attribution happens to paper over, and a large one can be entirely organic orders. Split it before deciding whether it is normal. The same thinking applies to the step after this one — attributed is still not caused, which is a separate question with its own tool.

The gap between Shopify and Meta is two gaps. Only one of them is a problem.

  • Comparing yesterday to yesterday. The two sides date purchases differently, and the connector cannot switch Meta to purchase date. Daily mismatches are noise you cannot remove.
  • Letting each tool pick its own window. Four weeks on one side and thirty days on the other produces a gap made of calendar.
  • Asking Claude to match orders to ads. There is no order identifier on the Meta side of the connector. An answer that names which orders came from which ad is invented.
  • Fixing attribution when tracking is broken. If events never arrive, changing windows only changes which missing numbers you look at. Check the dataset’s match quality once volume looks right.

Try this tonight Take last full week. Write down Shopify’s order count, then ask Claude, with the connector set up, for the Purchase events your dataset received in the same dates, split server and browser. If the server count is zero, open Shopify’s Facebook & Instagram app and check the data sharing level before touching anything in Ads Manager. If both arrive and the attributed count is far lower, that is attribution — note the ad sets’ attribution setting and leave it alone for now.

Should I trust Shopify or Meta?

Shopify for how many orders happened and what they were worth. Meta for which ads it credits. They answer different questions, so a disagreement is not a verdict on either one.

Can Claude tell me which orders came from Meta ads?

Not through the ads connector. Its field catalogue has no order identifier, so it can compare totals but cannot join an order to an ad. Shopify’s own referrer reports are a separate view with their own rules.

Why can’t the daily numbers ever match?

Meta’s API lets a caller choose whether a purchase is dated by the ad impression or by the purchase, but the connector’s reader exposes no such choice. Shopify dates by order. Weekly totals absorb most of that shift.

Meta shows more purchases than Shopify. Is that duplication?

It can be. Meta deduplicates browser and server events that share an event ID and event name sent within two days, per its deduplication guide. Purchases made on Meta’s own surfaces are counted in omni_purchase and never appear in your store, which also pushes Meta’s count up. Check the event source split before assuming either.

Checking numbers is part of the weekly routine

The course covers what to ask, in what order, and what to check against the source before you believe the answer.

See what's inside — $67 founding price

Pre-sale: the modules are still being recorded and founding members get the checkout link first. No charge today. Public price $97.

Espen Opdahl Writes The Claude Ads Operator. I run Meta ad accounts through Claude and Meta's official ads connector, and I write down what actually happens — including the parts that don't work. Not affiliated with Meta or Anthropic.