TikTok offline conversions: how to send CRM sales through the Events API (ttclid, event IDs and limits)
People search for this three ways: TikTok offline conversions, TikTok Conversions API, TikTok Events API. They're the same thing. TikTok calls it the Events API, and it's a server-side connection that lets you send results from your own systems, not just from the browser.
Here's the part that surprises people. There isn't a separate "offline event set" on TikTok the way there used to be on Meta. Results that happen away from your website, like a booked call or a won deal, go through the Events API as web events on your pixel. So "offline" on TikTok is really "server-side events with a match key", and getting that right is most of the job.
Let me walk through how it works.
What TikTok matches on: the ttclid, TikTok's click identifier, or a hashed email and phone. So the same principle as everywhere else: keep the click ID from the moment the visitor lands, and send a hashed identity as the fallback.
Do you still need the pixel? Keeping it is fine, and TikTok recommends running both. The catch is duplicates. When the browser and the server report the same conversion, they need to carry the same event ID, or TikTok counts it twice. That's the same trap as on Meta, with a different name.
What should you send? The stages your CRM reports: a qualified lead, a booked call, a showed appointment, a won deal. A won deal is usually sent as a payment event with its value, which is what lets you optimise toward revenue and not just leads.
What about bots and fake leads? Website events can be filtered before they're sent. Stages from a CRM, a webhook or a CSV carry no bot check, so qualify honestly in the CRM before a stage that gets sent.
And the limits people hit. Refunds don't take a conversion back out: a purchase that was sent stays counted. And a CSV of past customers can warm up an account, but the rows are dated when you send them, so it teaches TikTok what a past buyer looks like, not the history you had.
A made-up example of the difference. A home-services company runs TikTok ads. 200 form fills a month, 60 booked estimates, 25 signed jobs. If TikTok only sees the 200, it optimises for people who fill in forms. If the 25 signed jobs come back with the click ID and a value, it can find more people like the 25.
A few TikTok-specific things worth checking, because the basics get you most of the way and these catch the rest.
Check that the ttclid is actually captured. Like every click ID, it lives on the landing page address, and a redirect or an embedded form can lose it. Open a test lead and look for it.
Check the event IDs. Look in Events Manager at whether a browser event and its server twin carry the same ID. If they don't, some conversions are counted twice.
Check the event names. A won deal should reach TikTok as a payment event with its value, not as a generic lead, or you'll be optimising toward the wrong thing.
Check that your CRM stages aren't all landing as the same event. If a booked call and a paid invoice both arrive as "purchase", TikTok can't tell them apart.
And look at diagnostics in Events Manager. It tells you when events arrive without a match key, which is the most common reason conversions fail to attach to a person.
Are you sending anything back to TikTok today, or only the pixel?
More on this: TikTok Events API, and the complete guide to offline conversion tracking.