Table of contents
Quick summary
- Events leave from the server already in your package, no monthly third party subscription
- Deduplication reuses one event_id made on the page, never a second one on the server
- Customer data hashed one way with SHA-256, phone numbers in 62 format rather than 0812
- Orders closed in WhatsApp go out as rupiah valued events, up to 7 days afterwards
- Included in every website package from IDR 2,000,000 per year, revisions uncapped for a year
What actually gets built when the Conversions API goes live
The Conversions API is not a switch in Events Manager, it is a payload your server composes. Each one carries the same event name the pixel uses, the event time in seconds, the action source, hashed customer details, and the deal value in IDR. Leave a field out and Meta still accepts it and still counts it, so a misconfiguration rarely surfaces as an error.
Three things must be right at once: a token issued to a Business Manager system user, not a staff account that dies when they leave; the place the server code runs; and a short event list, since eight Aggregated Event Measurement slots per domain make a long one cannibalise itself. On our builds, payloads leave the server already included in the package.
The first task is not code, it is picking the events that stand for money arriving: Purchase with its value for a shop, a Lead on the WhatsApp press plus a second event on CRM approval for a service business. We settle that before writing code, because remapping events mid campaign throws away the baseline you would compare against.
Deduplication: one action, two paths, one number
A purchase reported twice, once by the pixel and once by the server, is deduplicated only when both payloads share an event_name and exactly the same event_id. That id is generated once on the page and reused on the server. Minting a fresh one server side is the fault we find most in audits, and the report doubles with no extra sales behind it.
That window runs about 48 hours, so slower payloads count as new actions. For an order that settles days later, send a different event with its own event_id rather than a repeat. Broken deduplication costs more than reporting: a campaign tuned to inflated numbers chases the wrong visitors, cost per result looks cheap, and your WhatsApp group stays quiet.
Customer data, hashing, and the match score
A server side event carries no cookies, so Meta needs other material to recognise the person: customer detail hashed one way with SHA-256 before it leaves, namely phone, email, name and postcode. Hashing happens on the server, and raw values never travel.
Two things sink Event Match Quality here: phone formatting and stray whitespace. Numbers belong in international form without the plus sign, because one still starting with zero hashes to a value matching nothing. Text must be lowercased and trimmed too, since a trailing space yields a different hash. A low match score usually means only one or two matching signals are actually reaching Meta.
- Phone numbers in 62 format, not 0812, then SHA-256 hashed
- Email and name lowercased and trimmed before hashing
- A consistent CRM external_id, so an old visit and a new order connect
- The fbp and fbc cookies from the original visit forwarded server side
- client_ip_address and client_user_agent from the visitor's request, not the server
Conversions that close in WhatsApp or in your CRM
In most Indonesian businesses the order does not close on the site. The visitor taps WhatsApp, haggles in the chat, then transfers the money. The browser pixel stops at that press, and with no server path all Meta learns is that somebody clicked and vanished.
The server path accepts events up to seven days late, which is what makes WhatsApp orders reportable. The press is logged as a Lead with an event_id and external_id, then once an admin marks it paid, the server sends a Purchase with the real rupiah value under that same external_id. Once purchase events carrying a rupiah value start landing, campaign optimisation has material to work with, and it can look for people who resemble buyers rather than people who resemble clickers.
Field faults, and how to check your own setup
Nearly every install we audit shows as active in Events Manager. What is rarely right is the payload, and since a wrong payload still produces numbers, nobody suspects anything until the report is held against the bank statement.
Checking it yourself takes three places. Test Events, with test_event_code pasted into your server config briefly, shows the payload within seconds and the matching material it carried. Diagnostics names missing parameters and events timestamped outside the window. The event source column should read as one event from browser and server, not two rows with suspiciously similar totals.
One last test beats all three. Turn on an ad blocker on one device, complete a conversion, then see whether the event still registers. If it does not, what you have is not the Conversions API, it is a browser pixel under a new name.
- A fresh event_id minted server side, so one purchase lands twice
- Phone numbers hashed with the leading zero, so they match nothing
- A personal account behind the token, so sending dies when they leave
- Empty value and currency, so Meta knows a sale happened but not its size
- event_time in milliseconds instead of seconds, so events are rejected as stale
- test_event_code left in production, so real events land in the test list uncounted
Browser pixel and Conversions API compared property by property
| Property | Browser pixel | Conversions API |
|---|---|---|
| Where the code runs | The visitor's device | Your own server |
| Blocked by ad blockers | Often, mostly on mobile | No |
| Matching material | The fbp and fbc cookies | Hashed CRM data plus external_id |
| Sending window | As it happens | Up to 7 days afterwards |
| Orders closed in WhatsApp | Out of reach | Can be sent with its value |
Frequently asked questions
What is the Meta Conversions API?
The Meta Conversions API sends conversion events from your server straight to Meta without passing through the visitor's browser. Each payload carries the event name, event time, hashed customer details and the deal value in rupiah, so conversions keep being reported even when an ad blocker kills the browser script.
How does the Conversions API differ from a plain Meta Pixel?
The difference is where the code runs and what identifies the person. The pixel runs on the visitor's device and leans on cookies, while the Conversions API runs on your server and leans on hashed customer data plus a CRM external_id. A correct setup runs both with identical event_id values.
How do I stop one purchase being counted twice?
Stopping double counts comes down to one event_id created on the page, passed to the server, then reused untouched, with the same event_name on both paths. Meta's deduplication window runs about 48 hours, so a server payload slower than that is counted as a separate action.
How long does a Meta Conversions API install take?
Installation finishes inside the build window: 3 to 5 working days for a landing page, 7 to 14 for a company profile site. Wiring it into a CRM for orders that close off site happens inside that same window rather than as a separate project.
Can an order closed in WhatsApp be reported to Meta?
WhatsApp orders can be reported, because the server path accepts events up to seven days late. The button press is logged as a Lead with an external_id, then once an admin marks it paid, the server sends a purchase event with the real rupiah value under that same external_id, so Meta reads both as one person.
Do I need an extra server or a monthly service for this?
The server that sends the events is part of every Metanotech website package, alongside hosting, SSL, a WhatsApp group and unlimited revisions for a year, from IDR 2,000,000 per year for a landing page up to IDR 12,000,000 for e-commerce. The domain is bought separately and stays in your name.





