Skip to content

TikTok Events API: How to Set Up Server-Side Tracking for TikTok Ads

The TikTok Events API sends conversions from your server instead of a pixel ad blockers drop. How it works, why ttclid matters, and how to set it up without inflating counts.

Marcus Johnson Apr 23, 2026 · 11 min read · updated Sep 15, 2026
Share

Quick answer. The TikTok Events API sends conversion events straight from your server to TikTok, instead of relying on a browser pixel that ad blockers and mobile privacy settings routinely drop. It lifts attribution from about 50 to 65 percent up to 95 percent or higher, so TikTok optimizes on complete data. Convultra captures and persists ttclid today, with TikTok Events API forwarding coming soon.

If you run TikTok Ads, the conversions in your dashboard are a partial count. The TikTok pixel fires in the browser, and on TikTok’s audience that browser is mobile, often running an ad blocker, and frequently closed before the pixel ever phones home. The Events API fixes that by moving the conversion event off the browser and onto your server, where nothing can strip it. This guide covers what it is, why it matters more on TikTok than almost anywhere else, and how to set it up.

What the TikTok Events API actually does

The TikTok Events API is a server-side channel for sending customer actions (purchases, leads, add-to-carts, page views) directly from your backend to TikTok. Instead of trusting a JavaScript pixel to fire and a cookie to survive, your server pushes the event the moment it happens.

TikTok uses those events for the three things that decide whether your campaigns are profitable: conversion optimization, where the Smart Performance algorithm learns which audiences actually buy; retargeting, where it excludes people who already converted; and audience building, where it constructs lookalikes from real purchasers. Feed that machine clean data and it works. Feed it a browser pixel’s leftovers and it optimizes toward the wrong people.

It is TikTok’s equivalent of Meta CAPI and server-side Google Ads conversion tracking, and it belongs to the same family of tools as any other conversion API. The mechanics differ slightly across platforms, but the principle is identical: send conversions from the server, not the browser.

Why the leak is worse on TikTok

Every ad platform loses conversions to ad blockers and mobile privacy defaults. TikTok loses more of them, for reasons specific to the platform.

The audience skews young and mobile, and younger, mobile-first users adopt ad blockers and strict privacy settings at higher rates than the general population. When one of them clicks your ad, lands on your store, and buys, the pixel that was supposed to record it often never runs. On iOS, Safari’s Intelligent Tracking Prevention caps cookie lifetime and limits what client-side scripts can read, so even when the pixel does fire, the click-to-purchase link can be broken by the time the session ends.

Then there is the cross-device pattern that is endemic to TikTok specifically. People browse TikTok on their phone, see your ad, get interested, and finish the purchase later on a laptop. The pixel on the phone never sees the sale. The laptop never saw the ad. Without a server-side identifier tying the two together, that conversion is invisible.

Stack these up and pixel-only TikTok attribution typically lands somewhere between 50 and 65 percent of real conversions. The danger is not just the missing rows in a report. TikTok’s algorithm trains on what you send it, so an incomplete signal teaches it to chase the wrong audiences, and your cost per acquisition climbs for reasons that never surface in the dashboard. This is the whole argument for server-side conversion tracking: you stop optimizing toward data you know is wrong.

The part everyone gets wrong: ttclid

Here is the opinionated take, because it is the single most common reason TikTok setups quietly fail: if you do not capture ttclid, none of the rest matters.

ttclid is TikTok’s click ID, the same idea as Google’s gclid or Meta’s fbclid. When someone clicks your ad, TikTok appends it to the landing URL:

https://yourstore.com/product?ttclid=ABCD1234EFGH5678

That string is the thread connecting the ad click to the eventual purchase. Your site has to read it from the URL on arrival and persist it (a first-party cookie, a hidden form field, your session, or your order record) so that when the purchase fires from your server hours or days later, you can attach it. Skip this step and your Events API calls arrive at TikTok with no way to match them to an ad, which means no attribution and no optimization signal. Plenty of “working” TikTok integrations are silently sending events with no ttclid and wondering why match rates are terrible.

TikTok retains a ttclid for about 30 days, so most ecommerce purchase windows are fine. Long B2B sales cycles are where it expires, and that is when email and phone matching earn their keep as a fallback.

How the flow works end to end

Once ttclid capture is in place, the rest is a clean server-to-server handshake:

  1. Click. The customer taps your ad and lands on your site with ?ttclid=... in the URL.
  2. Capture. Your site reads ttclid and stores it against the visitor or the eventual order.
  3. Convert. The customer buys. Your backend now holds the order ID, value, customer email and phone, the ttclid, and a timestamp.
  4. Send. Your server posts a CompletePayment event to the Events API, with the ttclid included.
  5. Match and optimize. TikTok ties the purchase to the original click and feeds it back into bidding.

A CompletePayment payload looks like this:

{
  "event": "CompletePayment",
  "event_id": "order_12345",
  "timestamp": "2026-06-23T14:30:00Z",
  "user": {
    "ttclid": "ABCD1234EFGH5678",
    "email": "customer@example.com",
    "phone": "+1234567890",
    "external_id": "customer_789"
  },
  "properties": {
    "value": 149.99,
    "currency": "USD",
    "content_id": "sku_shoe_blue_10",
    "content_name": "Blue Running Shoe Size 10",
    "content_category": "Footwear",
    "quantity": 1
  }
}

Always send at least one user identifier, and ideally several. ttclid is the strongest, but TikTok hashes email and phone automatically and uses them to match when ttclid is missing. More identifiers means a higher match rate, which on TikTok is the difference between a campaign that optimizes and one that flounders.

Your implementation options

There are four realistic ways to do this, and the trade-offs are worth being honest about.

Pixel plus Events API (hybrid). Keep the pixel for browser events like PageView and AddToCart, and send the money events (CompletePayment) from the server. You get the reach of the pixel and the accuracy of the API, with deduplication keeping the two from double-counting. This is the right default for most stores.

Events API only. Send everything server-side and drop the pixel. It is the cleanest architecture and gives you full control, but you own ttclid capture entirely and it needs real backend work. Good for developer-led, API-first teams.

A partner app or connector. Shopify apps and similar tools handle the plumbing for you with no code, at a monthly cost and with a dependency on someone else’s reliability. Fine if you just want it done and do not need much customization.

Convultra. Managed server-side conversion tracking that installs as one script, persists ttclid alongside every other click ID, and records conversions server-side without a developer or a tagging server to babysit. Google Ads and OpenAI Ads forwarding are live; TikTok Events API forwarding is coming soon. That is the bias of this guide, and it is worth stating plainly, so the section below covers what Convultra does for TikTok today and what it does not do yet.

The point that outranks any vendor choice: doing nothing is the expensive option. The leak compounds every month you leave it open.

The TikTok side, whichever route you take

Two things have to exist in TikTok before any server-side path can deliver an event.

Get your TikTok Events API access token. In TikTok Business Suite, open Settings, then Business Data and Analytics, and create a Web Events API application. Authorize it, then copy the access token (keep it secret) and your pixel ID.

Define your conversion events in TikTok Ads Manager. Under Assets, then Events, create the actions you intend to track (Purchase, AddToCart, and so on) so TikTok has somewhere to route them.

Where Convultra fits today

Convultra is not forwarding to the TikTok Events API yet; that integration is coming soon. What it does today is the part of this guide that most setups get wrong, which is capturing ttclid and keeping it attached to the sale.

Step 1: Install the script. Add one async tag before the closing </head> with the project key from your dashboard. Setup takes about five minutes.

<script async src="https://cdn.convultra.com/ultra.min.js" data-convultra-key="proj_…"></script>

The script is about 10KB. On landing it reads ttclid from the URL, along with gclid, gbraid, wbraid, fbclid, msclkid and oppref, and stores it in first-party storage, so a purchase days later still carries the click.

Step 2: Record the purchase. Fire the conversion on your order confirmation page:

Convultra.trackPurchase({
  value: 149.99,
  currency: 'USD',
  orderId: 'order_12345'
});

The purchase is recorded server-side with the persisted click IDs attached and deduplicated on the order ID. Personal data detected in the payload is hashed with SHA-256 before it is sent to any ad platform.

Step 3: Connect the platforms that forward today. Google Ads delivery with enhanced conversions and OpenAI Ads delivery are live, and the delivery log shows every conversion sent with the platform’s response. TikTok Events API forwarding is coming soon, along with Meta and Microsoft Ads. Until it ships, keep sending to TikTok through the pixel or one of the other routes above; the ttclids and purchases Convultra captures are recorded and ready, and the recovery report shows how many conversions the pixel alone is missing.

Deduplication, so you do not inflate your own numbers

If you run the pixel and the Events API together, the same purchase can reach TikTok twice and get counted twice. The fix is a shared, unique event_id (your order ID works well) on both the pixel event and the API event. TikTok sees the matching ID and counts the conversion once. A managed tool should set this for you, which is what makes running both safe through a transition. If you are building it yourself, make the event_id deterministic and consistent across the pixel and the server, and keep a record of what you have already sent so a retry does not create a duplicate.

What changes after you switch

Two things move, on two timelines. Attribution improves almost immediately: within a day your tracked conversion count jumps, often sharply, because you are finally counting the orders the pixel was dropping. That is not new revenue, it is revenue you already earned and could not see.

Ad performance follows on a two to four week lag. TikTok’s Smart Performance Campaigns need a run of complete conversions before they retrain, and once they have it you can switch optimization from clicks or traffic to actual purchases, add value-based bidding toward a target ROAS, and build lookalikes from real converters. Fix the data first, then let the optimization catch up. The order matters.

FAQ

What is the difference between the TikTok pixel and the Events API?

The pixel is browser-based JavaScript; the Events API is server-based. The API is more reliable because it keeps working through ad blockers and mobile privacy restrictions that stop the pixel from firing.

Why does ttclid matter so much?

It is TikTok’s click ID, and it ties a conversion back to the ad click that drove it. Without it, TikTok cannot attribute the sale, so capturing and persisting ttclid is the foundation of the whole setup.

Can I use the Events API without the TikTok pixel?

Yes. You can run Events API only, though many stores keep the pixel for broad browser events and use the API for conversion accuracy, with deduplication preventing double counts.

Do I need a developer to set this up?

Not with a managed tool, which handles ttclid capture, hashing and deduplication for you. Convultra captures and persists ttclid today, and TikTok Events API forwarding is coming soon. Building it directly against the API, or running a GTM server container, does need engineering time.

What match rate should I expect?

Sending ttclid alone, expect roughly 70 to 85 percent. Adding hashed email and phone typically pushes it to 90 to 95 percent, because TikTok can match across multiple identifiers.

Get accurate TikTok tracking live today

Every week you run on pixel-only data is a week TikTok optimizes toward the wrong audiences and your cost per acquisition pays for it. Start your free trial, install the script, and your ttclids and purchases are captured server-side from day one. Google Ads and OpenAI Ads delivery are live now, and TikTok forwarding is coming soon.

See how many conversions your pixel is losing

Install alongside your current setup. The recovery report shows the gap within a week.

Keep reading

All articles →