Kamran Arshad
Field Notes  /  Snapchat

Snapchat purchase events not firing: the diagnostic sequence

If your Snap Pixel loads but PURCHASE never appears in Events Manager, the cause is almost always one of six things: a lowercase event name, a missing transaction_id, the pixel being absent from the real confirmation page, an off-site payment redirect breaking the session, a single-page checkout re-initialising the pixel, or events being deduplicated away against a Conversions API feed.

Work through them in that order. The first three account for most of what I find.

Where a Snapchat purchase event dies The customer journey from ad click to Snapchat Events Manager, with the six failure causes marked beneath the stage where each one occurs: pixel re-initialisation at checkout, session loss at the payment gateway, lowercase event name, missing transaction ID and missing pixel at the confirmation page, and deduplication at Snapchat. THE JOURNEY WHERE IT BREAKS Ad click Snapchat Product / cart your site Checkout your site Payment gateway leaves your domain Confirmation event should fire Events Manager Snapchat 05 Pixel re-inits 04 Redirect kills it 01 Lowercase name 02 No transaction_id 03 Pixel not on page 06 Deduplicated away
The confirmation page is where most of it goes wrong. Three of the six causes bite at the final step, which is also the step people test least — because testing it properly means spending real money.

Snapchat tracking gets far less written about than Meta or Google, which means when it breaks you are mostly on your own. The articles that do exist tend to be written by companies selling a tracking product, so they stop at "install our app." This is the sequence I actually run, in the order I run it, and why that order.

First: confirm the event genuinely isn't arriving

Before changing anything, establish whether the event is missing or merely delayed. Two checks, sixty seconds.

Check the network, not the dashboard. Open your confirmation page in Chrome, open DevTools (F12), go to the Network tab, and filter for tr.snapchat.com. Complete a real test purchase. If you see a request fire with your pixel ID and the event name, the browser is doing its job and your problem is downstream — reporting, deduplication, or attribution. If nothing fires, the problem is on the page.

The Snap Pixel Helper browser extension does the same job with a friendlier interface, and will also tell you whether the pixel is installed at all. I use the Network tab because it shows the exact payload, and the payload is usually where the answer is.

What a healthy Snapchat event sequence looks like in the Network tab A DevTools network panel filtered to tr.snapchat.com, showing four requests in order: PAGE_VIEW, VIEW_CONTENT, ADD_CART and PURCHASE, each returning status 200. The PURCHASE row is highlighted as the one that must be present and must carry a transaction ID. Network tr.snapchat.com 4 requests EVENT STATUS FIRED ON PAGE_VIEW 200 every page VIEW_CONTENT 200 product page ADD_CART 200 add to cart PURCHASE 200 confirmation page ← must carry transaction_id
If the first three appear and the fourth doesn't, your problem is on the confirmation page. If none of them appear, the pixel isn't installed where you think it is.
Give it time before you panic

Events Manager reporting is not instant. Before concluding an event is missing, wait a few hours and re-check. I have watched people rewrite a working checkout because they looked at a dashboard ninety seconds after a test order.

The six causes, ranked

01

The event name is lowercase

Snapchat's standard events are uppercase: PURCHASE, ADD_CART, PAGE_VIEW, START_CHECKOUT. If you send purchase, it is not recognised as a standard event. The insidious part is that it may still fire and still appear somewhere — it simply won't be treated as the standard conversion, so campaign optimisation and reporting behave as though nothing happened.

This is number one because it produces the exact symptom people describe — "the pixel is firing but Events Manager shows nothing" — and because copying a Meta implementation across is a natural thing to do. Meta uses Purchase. Snapchat does not.

✗ Ported from Meta
{
  event: "Purchase",
  price: 24.00,
  currency: "USD"
}
✓ What Snapchat expects
{
  event: "PURCHASE",
  price: 24.00,
  currency: "USD",
  transaction_id: "1047"
}
The checkIn the Network tab, read the event name in the request payload. It must be exactly PURCHASE. Capitalisation is not cosmetic here.
02

No transaction_id is being sent

Without transaction_id, Snapchat has no way to tell a genuine second order from the same customer refreshing the confirmation page. Snap documents a 30-day deduplication window on transaction_id, versus 48 hours for client_dedup_id.

The failure mode cuts both ways, which is why it belongs this high. Omit it and refreshes inflate your purchase count. Send a value that isn't actually unique per order — a cart ID, a checkout ID, a session ID — and legitimate orders get collapsed into one and vanish. The second case looks exactly like "my events aren't firing."

The checkPlace two test orders. Confirm the transaction_id differs between them, and that it matches the order number your store actually assigns.
03

The pixel isn't on the page that actually confirms the order

Almost everyone installs the pixel sitewide and assumes the confirmation page inherits it. Frequently it doesn't. Hosted checkouts, order-status pages and post-purchase upsell flows are often rendered outside the theme or template that carries your tracking code.

Worth checking specifically: if you run a post-purchase upsell, the page a customer lands on immediately after paying may not be the page you think of as the thank-you page.

The checkComplete a real order. On the page you land on, view source and search for your pixel ID. Do not infer it from the theme — look at the page the customer is actually on.
04

An off-site payment redirect breaks the session

When checkout hands off to an external gateway and returns the customer to an order-received page, that round trip can break the browser session the pixel depends on. The purchase completes, the customer sees their confirmation, and the event never reaches Snapchat — or arrives stripped of the identifiers needed to attribute it.

This is the point where a browser-only setup stops being sufficient. Server-side tracking via the Conversions API is the durable fix, because the event originates from your server and never depends on surviving a redirect.

The checkDoes your payment flow leave your domain? If yes, treat browser-only tracking as best-effort and plan for CAPI.
05

A single-page checkout re-initialises the pixel

In single-page applications, if pixel initialisation runs on every virtual page view, the pixel's state resets each time. Advanced matching data gathered earlier in the flow is lost, so the purchase event arrives without the identifiers that make it useful — thin, poorly matched, and sometimes unattributed.

The event fires. It just doesn't carry what it needs, which is why this one is easy to misread as "working."

The checkWatch the Network tab through the whole checkout. Initialisation should happen once. Events should fire many times.
06

Deduplication is eating the event

If you run the pixel and the Conversions API — which you should — Snapchat deduplicates using client_dedup_id (48-hour window) or transaction_id (30 days). Two events sharing an identifier are counted once, by design.

It becomes a problem when the browser and server sides disagree about what that identifier is. Get the mapping wrong and you either double-count everything or silently lose one side. Snap's guidance is that non-purchase events map to client_dedup_id, and purchase events map to transaction_id — and crucially, the value must match across every path sending that event.

Snapchat deduplication windows compared Horizontal bar chart on a shared 30-day axis. transaction_id deduplicates over 30 days. client_dedup_id deduplicates over 48 hours, which is about one fifteenth of that span. transaction_id 30 days client_dedup_id 48 hours day 0 7 14 21 30 DEDUPLICATION WINDOW
Why the identifier you choose matters. A purchase deduplicated on transaction_id stays protected for 30 days. On client_dedup_id that protection expires after 48 hours — which is why Snap maps purchases to transaction_id and everything else to client_dedup_id.
The checkFor one order, capture the identifier the browser sent and the identifier your server sent. They must be identical. Not similar — identical.

Where my own numbers come from

I don't have a large client sample on Snapchat, and I'm not going to pretend otherwise. What I have is one store I ran end to end — my own — where the tracking worked, which is the only reason I can talk about what a healthy Snapchat setup produces.

AlphaMart — my own store, not a client

Snap Ads Manager · 4 Nov 2023 – 7 May 2024
Ad spend
$1,452
Purchases
1,034
Cost per purchase
$1.40
ROAS
5.69×

Context that matters, because otherwise these figures flatter me: at 5.69× on $1,452 that's roughly $8,262 in tracked revenue across 1,034 orders — an average order value of about $8. This was a low-ticket product. A $1.40 cost per purchase is a very different achievement at $8 AOV than it would be at $80, and anyone quoting a CPA without an AOV beside it is showing you half a number.

The figures are from a period ending May 2024. I'm dating them rather than presenting them as current.

✓ Unedited screenshot Snapchat Ads Manager for Alpha Mart showing US$1,452.18 spent, 11,076,872 paid impressions, 242,131 clicks, 2.19% click rate, 1,034 purchases and US$1.40 cost per purchase, over 4 November 2023 to 7 May 2024.
What this screenshot does and doesn't prove. It corroborates the spend (US$1,452.18), the purchase count (1,034), the cost per purchase (US$1.40) and the date range. It also shows 11,076,872 impressions and 242,131 clicks at a 2.19% click rate. It does not show ROAS — that figure comes from store-side revenue, not from this view, and you should treat any number you can't see in the frame accordingly.

The reason 1,034 purchases matter for this article isn't the ROAS. It's that a store sending a clean, correctly-named, properly-deduplicated PURCHASE event at that volume gives you a reliable baseline for what "working" looks like — and makes it obvious when something has stopped.

What I can't tell you

Two honest limitations, because an article that admits none is usually hiding some.

I can't give you a frequency ranking from a large sample. The order above reflects a small number of accounts plus what the failure modes logically imply — a lowercase event name breaks reporting deterministically, so it belongs at the top regardless of how often I have personally seen it. Treat the ranking as a sensible search order, not a statistic.

Snapchat's interface changes. Menu paths go stale quickly, which is why the checks above are anchored to the network request and the payload rather than to where a button currently sits. The payload is the thing that's actually true.

The short version

  1. Open the Network tab, filter tr.snapchat.com, place a test order.
  2. Confirm the event name is exactly PURCHASE, uppercase.
  3. Confirm transaction_id is present and unique per order.
  4. Confirm the pixel exists on the page the customer actually lands on.
  5. If checkout leaves your domain, plan for the Conversions API.
  6. If you run pixel and CAPI, confirm the dedup identifier matches exactly on both sides.

If you get through all six and the event still doesn't arrive, the problem is usually not the pixel — it's that the page you're testing isn't the page your customers reach. Go back and complete a real purchase with real money, on a phone, from an ad click. Test orders through a staging link skip precisely the parts that break.

Not sure which of the six it is?

Send me your store URL and I'll tell you what your tracking is doing. No account access needed to start — just the link.

Get a free tracking audit →