TikTok Offline Conversions: Complete Guide to Events API Integration
A complete guide to setting up offline conversion tracking for TikTok Ads using the Events API. Learn how The Upload Offline Conversions App uploads booked jobs, revenue, and CRM events to TikTok for campaign optimization.
TikTok’s advertising platform has grown rapidly for service businesses, and offline conversion tracking is essential to prove that TikTok Ads drive real revenue. This guide from The Upload Offline Conversions App (TUOCA) covers everything you need to set up TikTok offline conversions using the Events API.
Why TikTok Offline Conversions Matter
TikTok’s default optimization targets are engagement metrics — views, clicks, and form fills. Without offline conversion data, TikTok’s algorithm optimizes for the cheapest interactions, not the most profitable customers.
| Without Offline Data | With Offline Data |
|---|---|
| Optimizes for video views and clicks | Optimizes for booked jobs and revenue |
| CPA based on form fills | CPA based on actual conversions |
| No ROAS visibility | Real ROAS from uploaded revenue |
| “TikTok doesn’t work for us” | “TikTok delivers 4x ROAS for HVAC” |
Setup Overview
Prerequisites
- ✅ TikTok Business Account
- ✅ TikTok Ads Manager access
- ✅ Pixel created (for Events API authentication)
- ✅ Access token generated
- ✅ TTCLID auto-tracking enabled
Step 1: Create a Pixel
- Go to TikTok Ads Manager → Assets → Events → Web Events
- Click Create Pixel
- Select Manual Setup (not automatic)
- Name your pixel (e.g., “TUOCA Offline Events”)
- Note the Pixel ID
Step 2: Generate Access Token
- In your pixel settings, click Generate Access Token
- Copy and securely store the token
- This token authenticates all Events API requests
Step 3: Enable TTCLID Auto-Tracking
- Go to Assets → Events → Web Events → your pixel → Settings
- Enable Auto-tracking or Auto Advanced Matching
- This appends
ttclid=to ad click URLs
Step 4: Configure Events
Define which events you’ll track. For service businesses:
| Event Name | Funnel Stage | When to Send |
|---|---|---|
Contact | Top | Phone call received |
SubmitForm | Top | Lead form submitted |
PlaceAnOrder | Middle | Job/service booked |
CompletePayment | Bottom | Job completed, invoice paid |
Sending Events via the Events API
API Endpoint
POST https://business-api.tiktok.com/open_api/v1.3/event/track/
Use event_source offline and an Offline Event Set ID for in-person or CRM conversions. Use web and a Pixel ID for events that happened on the website. The v1.3 in the path is the current Events API 2.0 endpoint, not the retired Events API 1.0 /offline/track/ route.
Headers
Content-Type: application/json
Access-Token: YOUR_ACCESS_TOKEN
Event Payload
{
"event_source": "offline",
"event_source_id": "YOUR_OFFLINE_EVENT_SET_ID",
"data": [
{
"event": "CompletePayment",
"event_time": 1714502400,
"event_id": "job-2026-04-001",
"user": {
"ttclid": "E.C.P.AbCdEf123GhIjKl456",
"email": ["a8b14f04b2be6c5f..."],
"phone": ["d4f5c3b1e72a9f8d..."],
"external_id": ["customer-12345-hash"]
},
"properties": {
"value": 4500.00,
"currency": "USD",
"content_type": "product",
"description": "HVAC Installation"
}
}
]
}
Response
{
"code": 0,
"message": "OK",
"data": {
"events_received": 1
}
}
User Data Requirements
TikTok matches events using the TTCLID and hashed user data:
| Field | Type | Format | Required |
|---|---|---|---|
ttclid | String | Raw TTCLID value | Recommended |
email | Array of strings | SHA-256 hashed, lowercase | Recommended |
phone | Array of strings | SHA-256 hashed, E.164 | Recommended |
ip | String | Raw IPv4/IPv6 | Optional |
user_agent | String | Raw browser user agent | Optional |
external_id | Array of strings | SHA-256 hashed CRM ID | Optional |
Hashing rules:
- Email: lowercase → trim → SHA-256
- Phone: E.164 format (+1XXXXXXXXXX) → SHA-256
- External ID: SHA-256
Use the SHA-256 Hasher and E.164 Formatter to verify your data formatting.
How long to keep the click ID
TikTok asks you to keep the click ID for at least 28 days and expires it on the attribution window you set, so keep the ID from a March 1 click through at least March 29 and send the job while that window is still open. There is no second rule that throws the event out at 28 days. A click-attribution window you pass on a web event is measured in hours, and one of the documented examples is 720 hours, which is 30 days.
Meta is a different clock. Meta rejects a Conversions API request when the event happened more than 7 days before you send it, so a booking from Monday has to be uploaded by the next Monday, unless it is a physical-store sale, which Meta asks you to send within 62 days. A job that closes on day 20 can still go to Meta if you upload it within 7 days of the close.
Deduplication
TikTok deduplicates events using the event_id field:
- Same
event_idwith sameeventname → Counted once - Same
event_idfrom both pixel and Events API → Counted once - No
event_id→ Each submission counted separately
Always include event_id to prevent double-counting.
TikTok Bidding Optimization
Once offline conversions flow consistently:
Available Optimization Goals
| Goal | Data Needed | Best For |
|---|---|---|
| Complete Payment | 50+ events/week | Revenue optimization |
| Place an Order | 50+ events/week | Booking optimization |
| Contact | 50+ events/week | Lead volume |
Minimum Data Requirements
TikTok requires approximately 50 events per week for stable optimization. This is higher than Google’s threshold, which is why combining online and offline events helps reach the threshold faster.
Common TikTok Events API Errors
| Error Code | Message | Fix |
|---|---|---|
| 40001 | Invalid access token | Regenerate token in pixel settings |
| 40002 | Invalid pixel ID | Verify pixel ID |
| 40101 | Permission denied | Check token scope |
| 40103 | Rate limit exceeded | Reduce request frequency |
| 40200 | Invalid event format | Check event name and field types |
How TUOCA Handles TikTok
- Authentication — Stores pixel ID and access token securely
- Event mapping — Maps your conversion types to TikTok events
- User data hashing — SHA-256 hashes email, phone per TikTok’s rules
- TTCLID inclusion — Sends TTCLID when available from call tracking
- Batch optimization — Keeps each request at or under 1,000 events
- Rate limiting — Keeps each request at or under 1,000 events
- Deduplication — Generates consistent event_ids
- Click-ID age — Warns when a stored click ID is getting close to the 28 days TikTok asks you to keep it
Next Steps
- ✅ Create a TikTok pixel and generate access token
- ✅ Enable TTCLID auto-tracking
- ✅ Configure TUOCA with TikTok as a destination
- ✅ Send test events and verify in Events Manager
- ✅ Monitor for 30 days before optimizing for offline events