In this guide
- Every platform dedupes with an ID that both copies share:
event_idfor Meta and TikTok,transaction_idfor GA4 and Google Ads. - Create the ID once, where the event happens, and give it to both the browser tag and the server tag.
- Test in each platform's tool. "Deduplicated" in Meta Events Manager is the proof.
Sending the same event from the browser and the server is the best way to recover lost data, and the fastest way to double your numbers if you skip deduplication. Each platform has its own way to recognise the second copy. This page gives you the rule for each and a method to keep the IDs the same. See also Facebook event deduplication in GTM.
The rules by platform
| Platform | Deduplicates with | Window | Notes |
|---|---|---|---|
| Meta | event_name + event_id (and fbp / external_id) | About 48 hours | Browser event should arrive first for best results |
| GA4 | transaction_id on purchases | Per property | Prevents the same order being counted twice |
| Google Ads | transaction_id (order ID) on the conversion | Per conversion action | Required to avoid double counting when imported and tagged |
| TikTok | event_id + event name from Pixel and Events API | About 48 hours | Pixel and API both need the same ID |
| Snapchat | client_dedup_id | Check current docs | Shared by Pixel and CAPI |
Windows are approximate and platforms change them, so check their current documentation.
Check your tracking in one pass
This is an example. Run the check on your own site to see where yours stands.
How to create a shared ID
Choose the source of the ID
For purchases the order number is perfect. For other events create a random ID when the event happens.
Put it in the data layer
Push it with the event, for example event_id: "ord_10293".
Read it in the web tag
The Meta pixel tag takes it as eventID. The GA4 tag sends it as a parameter so the server can read it.
Read it in the server tag
The server container reads event_id from the event data and sends it in its own call.
Check both copies match
In Preview, compare the browser event and the server event for the same action.
What goes wrong
event_id differ or one is missing.transaction_id is missing.transaction_id and avoid firing purchase on reload.transaction_id in both.Raw events in. Clean events out.
Open Tracked collects each event on your own domain, removes the noise and sends what is left to Meta, Google Ads, TikTok.
Testing
- Place a test order.
- In Meta Test Events, find the browser and server purchase with the same ID.
- Confirm Events Manager marks it as deduplicated.
- In GA4 DebugView, check the purchase appears once with its
transaction_id. - In Google Ads, check the conversion count over a day against orders.
When deduplication is not needed
If an event is only ever sent from one place, for example a refund that only your backend knows about, there is nothing to deduplicate. Send it once from the server with its own ID so it can be corrected or removed later if needed. Deduplication also does not merge two different events, such as a lead and a sale. Give each its own event name and its own ID, and check them separately in each platform's test tool.
Terms you will see
- Event ID
- A value shared by the browser and server copy of one event.
- Transaction ID
- The order number used by GA4 and Google Ads to avoid double counting.
- Deduplication window
- The time within which a platform will match two copies.
- Browser event
- An event sent by the pixel or tag in the visitor's browser.
- Server event
- An event sent by your server.
A checklist per platform
Works with your stack
Grab a logo and throw it. These are the tools Open Tracked already talks to.

Frequently asked questions
What is event deduplication?
Recognising that two events from different sources are the same action and counting it once.
Which ID does Meta use?
The event_id together with the event name. The same pair must be sent from the pixel and from the server.
How do I test it?
In Meta Events Manager, Test Events, look for the "Deduplicated" label on the event.
What about GA4?
Use transaction_id on purchases so GA4 counts each order once.
Do I need it if I only send from the server?
No. Deduplication matters when the same event can arrive from two sources.
Do I need spreadsheets to read my results?
No. Once tracking is live, the Open Tracked analytics shows spend, revenue, ROAS and profit, and you can ask Ari, the built-in AI assistant, questions about your own numbers in plain words. Ari's allowance depends on your analytics plan.
Is Open Tracked different from Open Track or Open Space Track?
No. Open Tracked is the official name of our server-side tracking platform, and the website is opentracked.io. Many people search for it as Open Track, OpenTrack or Open Space Track. All of them lead to the same product: server-side Google Tag Manager hosting, first-party analytics and a CRM pipeline.

Fix your tracking at the source
Open Tracked hosts your server-side Tag Manager, keeps first-party cookies alive and shows what each ad is really worth.
The Open Tracked team
We build Open Tracked: server-side tracking hosting, analytics and the tools around them, for stores that spend on ads. Questions about this guide, or an idea for the next one?
Comments
Loading comments...
