flowsk.com
Client + Server De-Dup Simulator

Count the sale once, with the server's truth

Adding server-side tracking without a de-duplication key is worse than not adding it at all. Set the real number of orders and watch four common setups report four different answers.

Quick answer

if (property, dedup_key) already exists → merge, else → insert

Send the purchase from the browser and from your backend, both carrying the same dedup_key (the order id). The pair collapses into one conversion marked confirmed by both sides, with the server's amount as the truth.

Without the key, everything that survives the browser is counted twice — the most common broken server-side setup we see.

The known truth
Client events blocked (%)
Ad blockers, tracking protection, in-app webviews, corporate networks. 20–30% is typical on paid traffic.
Server events lost (%)
Webhook failures and timeouts. Usually under 1% with retries.
Truth

Verdict

What the two events look like
// browser — fast, contextual, blockable
{ "source": "client", "category": "purchase", "name": "purchase",
  "value_cents": 12900, "dedup_key": "order_10482" }

// your backend — authoritative, unblockable
{ "source": "server", "category": "purchase", "name": "purchase",
  "email": "hello@example.com", "value_cents": 12900,
  "dedup_key": "order_10482" }

// result: ONE conversion, source: "both", value from the server

The key must exist before either event fires, be identical on both sides, and be unique per fact. Order id qualifies; a timestamp does not. Read the de-duplication guide.

Frequently asked questions

What is a de-duplication key?

A string that both the browser and your server can derive independently for the same fact — usually an order id, a subscription id or a submission id. When both events carry it, the attribution system merges them into one record instead of counting two conversions.

Why send the same event twice on purpose?

Because the two sides answer different questions. The client event tells you what the person did and when, in the context of a session. The server event confirms it actually happened and carries information the browser never had. Sending both and de-duplicating gives you accuracy and context at once.

What happens without a dedup key?

Every conversion that survives the browser gets counted twice. Revenue looks inflated, CPA looks excellent, and nothing reconciles against your payment processor. It is the most common broken server-side setup.

What share of client events actually get blocked?

On paid traffic, 20–30% is typical: ad blockers, tracking protection, privacy browsers, corporate networks and in-app webviews. Organic and direct traffic is usually better; paid social is usually worse.

Is server-only good enough?

The count will be right, but you lose the path — no pageviews, no clicks, no landing pages, no sense of what the person did before converting. You will know how many, not why.

What makes a good key?

It must exist before the event fires, be identical on both sides, and be unique per fact. Order id is ideal. A timestamp is not — the two sides will never agree to the millisecond.