Cookiebees
3Send back: Real revenue back to the ads

Meta Conversions API

Meta counts every sale once.
And knows who bought it.

Your pixel loses purchases to ad blockers, Safari and in-app browsers. We send each purchase and lead to Meta from our server too, under the same event id, so Meta keeps one and drops the copy. Each one leaves with every identifier the store holds, hashed, and the exact payload is there to read.

30-day free trialNo card requiredSet up in minutes

Is Meta counting my sales twice, or missing some?

What did Meta actually receive for this order?

Order #10482 · what we sent to Metabuilding

The order arrived knowing

EmailMeta browser id

The Purchase left with

EmailMeta browser id+ Phone+ Stable id+ Meta click id+ City+ Postcode+ Country+ IP address+ Device

Event

Purchase

Value

₹2,499

Event id

7c1e…9a40

Hashed before it leaves. Same event id as your pixel, so Meta counts the sale once.

Why does Meta not recognise so many of my buyers?

Can Meta learn which leads became customers?

What it is worth

Fewer lost sales in Ads Manager. No double counting.

Sales the browser dropped, counted

A purchase the pixel never sent still reaches Meta from the server, so campaigns are judged on more of the sales they made.

Each sale counted once

The server event carries the event id your pixel used, so Meta keeps one Purchase, not two. Double counting would flatter your ROAS; this stops it.

Leads judged by what they became

A lead that qualifies or is won in your pipeline goes to Meta as its own event, with the deal value read when it is sent.

Who bought

Every identifier you hold, filled in one fixed order.

Meta can only credit a sale to an ad if it can tell who bought. Each event is filled from the event itself, then the stored order, the customer record, the visitor’s browser and their last page view. Each step fills only what is still empty, and the log keeps which step filled what. Email, phone, name and address are SHA-256 hashed before they leave.

  • Email, phone, name, city, pin code and country, hashed
  • A stable id per customer, the browser id and the click id
  • IP address and browser taken from the order itself
  • A click older than 7 days never claims a fresh sale
Purchase · order #10482 · who bought0 of 9 filled
emthe event
phthe customer
external_idthe customer
ct · zp · countrythe customer
client_ip_addressthe order
client_user_agentthe order
fbpthe visitor
fbcthe visitor
fn · lnnot on this order, left empty rather than guessed
Each step fills only what is still empty, and the log keeps which step filled each field. A click older than 7 days never claims a fresh sale.

Counted once

Your pixel and our server send the same sale. Meta keeps one.

Meta deduplicates on the event id and event name within 48 hours. Our Purchase reuses the id your pixel created. It also waits a few minutes for the store’s webhook, so it is built once, from the order as it finally stands, with the phone and name the thank-you page never had.

  • The event id your pixel used, kept from the first arrival
  • Built once, from the settled order
  • Never resent under a new id, which would count the sale twice
  • Cash-on-delivery sales can wait for delivery, if you choose
Event stream · order #10482

Your Meta pixel

14:02:11

Purchase · event id 7c1e…9a40

from the thank-you page, email only

Store webhook

14:02:19

Order #10482 settles

phone, name and city merged into the order

Cookiebees server

14:07:11

Purchase · event id 7c1e…9a40

built once, from the order as it now stands

In Meta

two arrivals, one id
Meta deduplicates on the event id and event name within 48 hours. A resend under a new id would count the sale twice, so there is never one.

Match quality

Scored before it leaves, with the missing field named.

Each event is scored from the keys it actually carries, so you see match quality per event, not weeks later as an average. Where a field is missing, the score names it. The full parameter story is on the Signals page; this is the part that decides whether Meta can find the buyer at all.

  • A score per event, from the keys attached
  • The missing identifier named on the order
  • Every payload readable in the Event stream
  • What actually left, checked every morning against our own rules
Match quality · before sendingPurchase · order.48213
9.5

Scored here, not in Events Manager

Meta tells you the number weeks later, in aggregate. We score each event from the keys we attach, and name what to add.

emEmail+3
phPhone+1.5
fbcClick ID+2
external_idStable ID+1.5
fbpBrowser ID+0.25
ip · uaIP + user agent+0.5
ct · zp · countryLocation+0.75
fn · lnFirst + last name: capture at checkout+0.5

Leads and custom events

Not only purchases. The moments only your systems see.

A lead reaching a qualified or won stage goes to Meta as its own event. A won lead waits a few minutes, so the deal value a rep types is the value Meta gets. Custom events from workflows and audience events from your segments go through the same engine, with the same identity and the same log.

  • QualifiedLead and ConvertedLead from your own pipeline stages
  • Deal value read when the event is sent, not when the card moved
  • Audience events only for segments you switch on
  • Our attribution for Meta’s Custom attribution: a Meta beta, off until you choose a model and Meta enables it on your account
Signal backbuilding

Lead marked Qualified

Moved by a rep, or by a scoring rule

Match keys attached

EmailPhoneClick idExternal id

QualifiedLead posted to Meta and Google Ads, deduplicated on your own lead id.

Not every lead - the ones that qualified. That is the difference between teaching the algorithm to find volume and teaching it to find buyers.

Meta Conversions API, on your own site.

Start a workspace and watch it work on your next order or lead, or let us walk you through it.

Inside the module

Inside Meta Conversions API

Nothing goes to Meta until you switch it on, and every send is in the Event stream with its payload.

Purchase, server-side

Every order, deduplicated with your pixel on one event id

Lead stage events

Qualified and won, from your own pipeline

Identity waterfall

Five steps, each field traced to where it came from

Match quality

Per event, with the missing field named

When a sale counts

At placement, or cash-on-delivery sales once delivered

Custom attribution (Meta beta)

Our attribution per purchase, off until you opt in and Meta enables it on your account

Open any order and its What we sent card shows what the order arrived knowing, against what the Purchase carried when it left for Meta.

Where this sits

One of the four steps an order goes through.

Every feature reads the same identity. Open any of them; each has its own page.

Send Meta the sales your pixel missed

Every sale counted once.Every payload open to read.

Connect Meta, switch on Purchase, and watch the first order leave with its identifiers and its event id in the Event stream.