SNAP·Snapchat Pixel·warning

Snap CAPI, Deduplication, and Currency Alignment

Your Snap Pixel and Conversions API (CAPI) are sending the same PURCHASE event from both the browser and the server, but they do not share an `event_id` for deduplication, and the currency on the two payloads does not match. Snapchat ends up counting one order as two conversions, and the value column in Events Manager mixes USD with whatever your CAPI integration is sending, so the totals stop describing a single set of orders.

CL
By Christopher LandaverdeCreator of AdLint · ad-tech tracking specialistUpdated

Why It Matters

Snapchat's recommended setup runs the browser pixel and CAPI in parallel. The browser is fast and carries client signals (Snap click ID, browser cookies). The server is reliable and carries authoritative order data (true value, hashed PII, transaction ID). To stop them from double-counting the same order, both sides must send a matching `event_id` on each PURCHASE, SIGN_UP, SUBSCRIBE, or START_CHECKOUT. Snapchat deduplicates on that ID inside a short window and keeps one canonical event. When the IDs do not align, PURCHASE volume inflates roughly 1.7x to 2x depending on CAPI delivery rates. ROAS in Snapchat Ads Manager looks better than it is, and the optimisation engine starts bidding against a signal that is partly hallucinated. The cleanup is painful because historical reports keep the inflated numbers. Currency drift is the second problem. If the browser sends `currency: 'USD'` and CAPI sends `currency: 'EUR'` (or omits it and Snapchat assumes the account default), the value totals in Events Manager describe an exchange-rate average rather than a real currency. ROAS comparisons across markets become meaningless.

How To Fix It

  1. Derive a stable `event_id` from the order ID (or lead ID for SIGN_UP) and send the exact same string on the Snap Pixel `snaptr('track', 'PURCHASE', { ..., event_id: 'order-10492' })` call and the CAPI request body.
  2. Confirm CAPI volume is actually arriving for PURCHASE, SIGN_UP, and SUBSCRIBE in Events Manager. Browser-only coverage is the default failure mode.
  3. Pick one ISO 4217 currency per pixel and pass it explicitly on every value event. Do not rely on account defaults.
  4. Run a real test order, watch Events Manager, and confirm one deduplicated PURCHASE appears with the expected value and currency.
  5. After 24 hours, check that the deduplication rate in the CAPI diagnostics is above 70 percent.

Example

Configuration
Browser: snaptr('track', 'PURCHASE', { event_id: 'order-10492', price: 129.90, currency: 'USD' })
CAPI: { event_name: 'PURCHASE', event_id: 'order-10492', price: 129.90, currency: 'USD' }
For Your Client Report

Your Snap Pixel and Conversions API are running in parallel without a shared `event_id`, and the currency on the two payloads is inconsistent. Per Snapchat's Conversions API documentation, browser and server events representing the same business action must share an `event_id` so Snapchat can deduplicate, and every value-bearing event must pass an explicit ISO 4217 currency. Without deduplication, PURCHASE volume in Ads Manager inflates by the CAPI delivery rate and biases optimisation. Without consistent currency, value totals mix units and ROAS comparisons stop being meaningful. Fix: derive `event_id` from the order ID, send it identically on both sides, pin one currency per pixel, and confirm a deduplication rate above 70 percent in the CAPI diagnostics. Source: marketingapi.snapchat.com/docs/conversion.html.

Drop this paragraph into your client deliverable. Sources back to the canonical platform documentation linked below.

References

Audit your own files for this check

AdLint runs this check (and 177 others) against your GTM, Google Ads, Meta, TikTok, LinkedIn, Pinterest, Twitter/X, and Snapchat exports. Everything stays in your browser. No uploads, no accounts.

Run a free audit