Server-Side TrackingReferenceIntermediate

Deduplication that survives reality: event ids, order ids and what each platform actually keys on

A platform-by-platform table of deduplication keys — Meta, Google Ads, GA4, TikTok, Microsoft, LinkedIn, Pinterest, Snapchat, Reddit, X, CM360 — and the two-key strategy that keeps hybrid tracking honest.

By
Track editorial team
Published
Last reviewed
Reading time
4 min read

Key takeaways

  • Use two keys: an event id generated once at the source and handed to every path, plus the order id on every commerce event.
  • Platforms merge on different keys — Meta, TikTok, Microsoft, LinkedIn and Pinterest on the event id, Google Ads and GA4 on the order or transaction id, Snapchat on a matching pair, CM360 on the ordinal.
  • Vendors merge only within a window (Meta documents about 48 hours), so delayed CRM qualifications belong on a separate vendor event, not as a duplicate of the browser one.
  • Refunds are their own events with the original order id; verify deduplication in the event debugger, the destination monitor and the vendor UI.

Why two keys

An event id identifies one action as observed by your systems. An order id identifies one business transaction. They fail in different ways:

  • Event ids are generated per observation. If the browser and the server observe the same purchase independently, they only share an id if you deliberately pass it between them.
  • Order ids exist for purchases and refunds but not for page views, leads or sign-ups.

A robust setup uses both: one event id generated at the source and handed to every path, plus the order id on every commerce event. Platforms that dedupe on the event id merge the observation; platforms that dedupe on the order id merge the transaction; a platform that supports both gets belt and braces.

The reference table

PlatformBrowser fieldServer fieldMerges onNotes
MetaeventID (pixel option)event_idevent id + event name, ~48 horder_id in custom_data is informational
Google Adstransaction_id (gtag)orderId (upload)order id per conversion actionleads: use separate conversion actions
GA4transaction_idtransaction_idtransaction id for purchaseother events are not deduplicated
TikTokevent_id (ttq option)event_idevent id + event nameorder_id in properties
Microsoftevent_id (UET push)eventIdevent id + event namesame UET tag id on both paths
LinkedInevent_id (lintrk)eventIdevent idper conversion rule
Pinterestevent_id (pintrk)event_idevent idorder_id in custom_data
Snapchatclient_dedup_idevent_idmatching pairwithin the dedup window
RedditconversionId (rdt)conversion_idconversion id
Xconversion_id (twq)conversion_idconversion idper event id (tw-…)
Campaign Manager 360ordinal / u1ordinalordinal + activity + usertimestamps within 28 days
Affiliate networksorder referenceorder referencenetwork-side duplicate protection

Generating the id

Generate the id before anything is sent, at the place the action is first known. In the browser that is the moment tsq.push(["track", ...]) runs; Track assigns a ULID and uses it for the vendor pixel call and the collector request alike. For server sources, the source system should generate the id — or, for purchases, pass the order id so the router can derive a deterministic event id from it.

A deterministic id for purchases (hash(site, "purchase", order_id)) has a pleasant property: a retried webhook from Shopify or a duplicate CRM export produces the same id, and the worker's own dedup guard drops it before delivery.

Timing windows

Vendors only merge within a window — Meta documents about 48 hours, others are similar. If your server event arrives days later (a CRM batch), it will not merge with the browser event; it will count in addition. Choose per event type:

  • Purchases and other immediate conversions: hybrid with a shared id, both within minutes.
  • Delayed qualifications (a lead becomes an opportunity a week later): a different vendor event or conversion action, not a duplicate of the browser one.

Refunds

Refunds are their own events. GA4 has a refund event with transaction_id; Google Ads uses conversion adjustments (retraction/restatement) keyed on the order id; Meta has no refund event but accepts negative values in custom conversions; most affiliate networks accept a reversal postback. Track emits refund with a negative value and the original order id and lets each connector decide what the vendor supports.

A debugger-driven verification

  1. Buy something in test mode with the browser open.
  2. In the event debugger find the browser purchase and the server purchase — same event id, same order id.
  3. Open the destination monitor: one delivery attempt per path, both accepted.
  4. In the vendor's UI (Events Manager, Test events, DebugView), confirm one conversion, not two.

If step 4 shows two, the id did not travel through one of the paths. The redacted payload preview in the debugger shows which.

Primary sources

Documentation and standards this article is based on.

  1. Meta — Conversions API: deduplicationdevelopers.facebook.com
  2. Microsoft Advertising — Conversions API (CAPI)learn.microsoft.com

Was this article helpful?

Responsible editor

Track editorial team

Product & engineering

The people building Track: engineers and analysts who work on server-side tracking, consent tooling and connector integrations every day.