Table of contents
Quick summary
- Events post to the v1.3 endpoint with an access token and the Pixel Code from Events Manager
- Pixel and server share one event_id, so a single order is never counted twice
- Email and phone are SHA-256 hashed, with local numbers rewritten to +62 first
- WhatsApp taps go out as Contact, closed orders as CompletePayment from the server
- Included in every website package from IDR 2,000,000 per year, revisions uncapped for a year
What gets installed, beyond one script tag
A TikTok pixel in the head tag reports only from the visitor's browser, a path running on someone else's device, so ad blockers and in app browsers cut it off without warning. The Events API adds a second path, your own server calling TikTok, which no extension on a phone can block.
A complete install needs four things: the Pixel Code from Events Manager as event_source_id plus an access token with Events API scope, the version 1.3 endpoint, standard event names such as ViewContent, Contact, and CompletePayment, then the mandatory fields on every call, meaning event_time in Unix seconds, an event_id, the user block, and properties where value is a number and currency is IDR. An invented event name is still accepted, but cannot be chosen as an optimisation goal.
Deduplication and matching the right buyer
One purchase does travel twice, once from the pixel and once from the server, so each path covers for the other. TikTok drops the copy only when the event name and event_id match exactly, so the event_id must be minted in one place, usually your order number, then carried by both paths unchanged.
Match quality lives in the user block. Email is normalised first, lowercased and trimmed, then SHA-256 hashed, while phone numbers are rewritten to international form, 0812 becoming +62812, and hashed after that. An external_id from the CRM is hashed the same way everywhere, because two hashing recipes turn one person into two. These four fields go missing most often:
- the ttclid in the landing URL, stored before the visitor moves on
- the _ttp cookie from the pixel, forwarded as the ttp parameter
- the visitor's ip and user_agent, not your server's
- the full page address including its campaign parameters
The sale that closes in WhatsApp, not on the page
Most sales in Indonesia do not close on the website. Someone arrives from TikTok, reads the page, taps the WhatsApp button, and the deal plays out in a chat no pixel can see. Build nothing for that and all TikTok learns is that a person opened a page and left.
We log each WhatsApp tap as a Contact event carrying its page context. Once that lead becomes an order in your CRM or ERP, the server sends CompletePayment with the real deal value, an event_id from the order number, and the event_time of the action itself, so attribution lands on the right day. The CRM side trigger is built as an application module at IDR 5,000,000 per module per year, server included.
The faults we keep finding, and how to check for them
The most common problem is not a tricky Events API, it is a pixel installed twice, once in the theme and again through a tag manager. ViewContent then doubles, cost per result looks flattering, and no number in the account is safe to spend against. On the server side the repeat offenders are about data shape:
Checking takes half an hour. Grab the test code in the Test Events tab, run one genuine WhatsApp tap, then see whether the browser event has a server twin beside it. Read the diagnostics tab for missing fields and events that failed to deduplicate. Finally compare seven days of CompletePayment in Ads Manager with your order list: a report far below reality means server events are not matching, and one far above it almost always means a duplicate pixel.
- event_time in milliseconds when Unix seconds are expected, landing the event in the wrong year
- email sent raw, or hashed twice, both of which break matching
- the server's own IP going out, so every buyer appears to sit in one place
- the endpoint response never read, though a non zero code names the offending field
- a test_event_code left in production, so events land only in Test Events
Scope, timing, and what it costs
Pixel installation, event mapping, and the Events API connection come with every website package: a landing page from IDR 2,000,000 per year ready in 3 to 5 working days, a company profile site from IDR 3,000,000 per year ready in 7 to 14 working days, and e-commerce from IDR 12,000,000 per year. Hosting, SSL, the server, a WhatsApp group, and unlimited revisions for a year are part of it, while the domain is bought separately and stays in your name.
A note from the field: at a building materials distributor, TikTok reported nearly twice the leads in their order book, because the pixel loaded from both the theme and a tag manager. Once the copy was removed and CompletePayment began arriving from the server, the report could be read straight against their weekly sales recap. We work out of Gunung Putri, Bogor.
The browser TikTok Pixel compared with the server side Events API
| Point of comparison | TikTok Pixel | Events API |
|---|---|---|
| Where the event is created | The visitor's browser | Your server or Worker |
| Risk of being cut off | Ad blockers, private modes | Close to none |
| Matching data | Cookies, ttclid, browser hashes | CRM, hashed email, phone, ttp |
| Transaction value | Only what the page knows | The final figure from the order |
| Deduplication key | event_id from a page UUID | event_id from the order number |
Frequently asked questions
How does the TikTok Pixel differ from the TikTok Events API?
The TikTok Pixel is code in a visitor's browser reporting their actions, while the TikTok Events API sends the same report from your server through the v1.3 endpoint. A correct setup runs both paths with identical event_id values.
Does sending events from two paths double count conversions?
Double counting is prevented by deduplication: TikTok drops the copy whenever the event name and event_id are identical on the pixel call and the server call. The problem appears only when each path mints its own event_id, a random UUID on one side and an order number on the other.
How long does a TikTok Events API setup take before it is usable?
The work finishes inside the website build window, 3 to 5 working days for a landing page and 7 to 14 working days for a company profile site. Creating the access token and running Test Events normally adds a day.
Can a WhatsApp button tap be sent as a TikTok conversion?
A WhatsApp button tap can be sent as a Contact event, standard on the sites we build, on the floating button and inside product cards. When orders are logged in a CRM, the server follows up with CompletePayment carrying the real deal value.
Why is my TikTok Ads Manager conversion count so far from my order records?
A wide gap usually has three causes. A report well below reality means conversions that closed in WhatsApp were never sent as events, or server events were rejected over a bad field. A report well above reality almost always means the pixel is installed twice.
Does the Events API need its own server, or can a server side tag manager do it?
The Events API can run from two places: straight out of your site's backend, or from a server side tag manager container that forwards the events. Both use the same access token and Pixel Code, and our website packages already include the server.





