The Purchase event on Shopify
Updated
When it fires
On the order confirmation page, and server-side when the order is created.
Purchase is the only event your ROAS is actually built on, and it is the one Shopify makes hardest to capture. It happens inside hosted checkout, where theme code cannot run, and it is the event ad blockers are most aggressive about. Every other problem on this site eventually reduces to a missing Purchase.
What each ad platform calls Purchase
The same shopper action goes by a different name on every network, and sending the wrong one means the event is silently discarded rather than rejected with an error.
Parameters Purchase should carry
value / currency- Order total. Wrong currency here corrupts every ROAS figure.
content_ids- Products purchased, matched to your catalog.
event_id- The deduplication key shared with the server-side copy.
num_items- Total item count on the order.
Why Purchase goes missing on Shopify
- A theme-installed pixel never sees the order confirmation page.
- Ad blockers and iOS tracking prevention drop the browser request on a meaningful share of orders.
- Without a shared event_id, browser and server copies both count, doubling your reported revenue.
Deduplication is what makes server-side tracking safe
Sending Purchase from both the browser and the server sounds like it should double your numbers, and without deduplication it does exactly that. The mechanism that prevents it is a shared event_id: both copies carry the same identifier, derived from the Shopify order, and the platform keeps whichever arrives first while discarding the second.
This is why server-side tracking is additive rather than duplicative. When the browser copy is blocked, the server copy is the only one that arrives and the sale is recorded. When both arrive, they are merged into one. The system degrades gracefully in the direction you want, but only if the event_id is genuinely shared — independently generated IDs on each side produce two events that look unrelated.
Value conventions decide whether ROAS means anything
Whether Purchase value includes tax and shipping is not a question with a correct answer, but it is a question with a correct discipline: pick one convention and apply it to every pixel on the store. Meta reporting net while TikTok reports gross makes cross-channel ROAS comparison meaningless, and the discrepancy is invisible until someone tries to reconcile the two.
Currency deserves the same care. A store selling in multiple currencies that sends the presentment currency to one platform and the shop currency to another will produce ROAS figures that are wrong by the exchange rate and consistent enough to look believable. Both conventions should be checked once, at setup, and then left alone.
How to verify Purchase is firing
Place a real discounted order. Confirm one Purchase in Events Manager with the correct value, and check the deduplication column shows the server copy was merged rather than counted twice.
Purchase questions
- Why does Meta report fewer purchases than Shopify?
- Shopify counts every order. Meta counts orders it received and could attribute. Server-side tracking closes most of the gap; attribution windows explain the rest.
- What causes redundant purchase events?
- Two pixels firing on the same order, or a browser and server event with no shared event_id. Both inflate revenue and both are fixed by deduplication.
- Should value include tax and shipping?
- Pick one convention and hold it. Mixing them across pixels makes ROAS comparisons meaningless.
Go deeper
Getting the Shopify Purchase event right →Why Shopify Purchase events go missing, arrive without a value, or count twice, and how to send AddToCart, InitiateCheckout and Purchase correctly to Meta.