Your TikTok ads are running, but conversions show zero. Or the numbers in TikTok Ads Manager don’t match your actual sales. TikTok Pixel not tracking conversions is frustrating because TikTok’s debugging tools are less mature than Meta’s or Google’s.
Here’s the complete guide to diagnosing and fixing TikTok pixel tracking issues.
How TikTok Pixel Tracking Works
Understanding the system helps with troubleshooting:
- Base pixel code loads on every page
- Event code fires on specific actions (view content, add to cart, purchase)
- Data is sent to TikTok’s servers
- TikTok matches the event to ad clicks
- Conversions appear in Ads Manager
Failure at any step means missing conversions.
Step 1: Verify Base Pixel Installation
Before troubleshooting events, confirm the base pixel loads.
Use TikTok Pixel Helper
Install the TikTok Pixel Helper Chrome extension:
- Install from Chrome Web Store
- Navigate to your website
- Click the extension icon
- Check for your pixel ID
Green checkmark = Pixel detected and loading Red X or nothing = Pixel not installed or broken
Manual Verification
Open DevTools (F12) → Network tab:
- Filter by “analytics.tiktok”
- Reload the page
- Look for requests to
analytics.tiktok.com
You should see a request with your pixel ID in the URL.
Check the Code
Your base pixel should look like this:
<script>
!function (w, d, t) {
w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};var o=document.createElement("script");o.type="text/javascript",o.async=!0,o.src=i+"?sdkid="+e+"&lib="+t;var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(o,a)};
ttq.load('YOUR_PIXEL_ID');
ttq.page();
}(window, document, 'ttq');
</script>
Verify YOUR_PIXEL_ID is replaced with your actual pixel ID (looks like XXXXXXXXX).
Step 2: Verify Event Tracking
Base pixel loading doesn’t mean events are tracking.
Standard Events
TikTok supports these standard events:
| Event | When to Fire |
|---|---|
ViewContent | Product page view |
AddToCart | Add to cart action |
InitiateCheckout | Checkout start |
PlaceAnOrder | Purchase complete |
CompletePayment | Payment processed |
Contact | Contact form submission |
Subscribe | Newsletter signup |
SubmitForm | Form submission |
Check Events in Pixel Helper
- Navigate to a page where the event should fire
- Trigger the action (add to cart, purchase, etc.)
- Open TikTok Pixel Helper
- Check if the event appears in the helper
Check Events in Ads Manager
- Go to TikTok Ads Manager → Assets → Events
- Click on your pixel
- Select “Event Overview”
- Check if events are being received
Note: There’s a 20-minute to 24-hour delay before events appear here.
Event Code Examples
ViewContent (product page):
ttq.track('ViewContent', {
content_id: 'SKU123',
content_type: 'product',
content_name: 'Blue Widget',
price: 29.99,
currency: 'USD',
quantity: 1
});
AddToCart:
ttq.track('AddToCart', {
content_id: 'SKU123',
content_type: 'product',
content_name: 'Blue Widget',
price: 29.99,
currency: 'USD',
quantity: 1,
value: 29.99
});
CompletePayment (purchase):
ttq.track('CompletePayment', {
content_id: 'SKU123,SKU456', // Comma-separated for multiple items
content_type: 'product',
content_name: 'Blue Widget, Red Widget',
price: 29.99, // Unit price
currency: 'USD',
quantity: 2,
value: 59.98 // Total order value
});
Step 3: Common Issues and Fixes
Issue: Pixel Loads But Events Don’t Fire
Cause: Event code isn’t executing.
Fix: Check that your event code runs at the right time:
// For click events (add to cart)
document.querySelector('.add-to-cart-btn').addEventListener('click', function() {
ttq.track('AddToCart', { ... });
});
// For page load events (view content)
document.addEventListener('DOMContentLoaded', function() {
ttq.track('ViewContent', { ... });
});
Issue: Events Fire But Show Zero in Ads Manager
Cause: Attribution window or matching issues.
Fix: Check these settings in Ads Manager:
- Events → Your Pixel → Settings
- Verify attribution window (default: 7-day click, 1-day view)
- Enable “Advanced Matching” for better user matching
Issue: Conversion Counts Don’t Match Actual Sales
Causes:
- iOS 14+ App Tracking Transparency
- Ad blockers
- Attribution window differences
- Duplicate event firing
- Users converting outside attribution window
Fixes:
- Implement TikTok Events API (server-side) for better accuracy
- Check for duplicate events (see below)
- Compare attribution windows in reports
Issue: Duplicate Conversions
Cause: Event fires multiple times per action.
Fix: Add deduplication logic:
// Simple deduplication using sessionStorage
function trackPurchase(orderId, data) {
if (!sessionStorage.getItem('tiktok_purchase_' + orderId)) {
ttq.track('CompletePayment', {
...data,
content_id: orderId // Use order ID for deduplication
});
sessionStorage.setItem('tiktok_purchase_' + orderId, 'true');
}
}
Issue: iOS Users Not Tracking
Cause: iOS 14.5+ requires App Tracking Transparency permission. Most users opt out.
Fix:
- Implement TikTok Events API (server-side tracking)
- Enable Advanced Matching with hashed user data
- Accept that iOS tracking will be incomplete
Step 4: Implement TikTok Events API
For reliable tracking, supplement the pixel with server-side Events API.
Why Events API?
- Bypasses ad blockers
- Works better with iOS privacy restrictions
- More reliable than client-side tracking
- Better match rates
Basic Implementation
import requests
import hashlib
import time
def send_tiktok_event(event_name, user_data, event_data):
url = "https://business-api.tiktok.com/open_api/v1.3/pixel/track/"
# Hash user data
email_hash = hashlib.sha256(user_data['email'].lower().strip().encode()).hexdigest()
payload = {
"pixel_code": "YOUR_PIXEL_ID",
"event": event_name,
"event_id": str(time.time()), # Unique event ID for deduplication
"timestamp": str(int(time.time())),
"context": {
"user_agent": user_data['user_agent'],
"ip": user_data['ip']
},
"properties": event_data,
"user": {
"email": email_hash
}
}
headers = {
"Access-Token": "YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
return response.json()
# Example: Track purchase
send_tiktok_event(
event_name="CompletePayment",
user_data={
"email": "customer@example.com",
"user_agent": request.headers.get('User-Agent'),
"ip": request.remote_addr
},
event_data={
"value": 59.98,
"currency": "USD",
"content_type": "product",
"content_id": "order_123"
}
)
Deduplication Between Pixel and API
Send the same event_id from both sources:
Client-side (pixel):
var eventId = 'evt_' + Date.now() + '_' + Math.random().toString(36).substr(2);
ttq.track('CompletePayment', {
event_id: eventId,
// ... other data
});
// Pass eventId to your server
Server-side (API):
payload = {
"event_id": eventId, # Same ID as client
# ... other data
}
Step 5: GTM Implementation
If using GTM for TikTok pixel:
Base Pixel Tag
- Tags → New → Custom HTML
- Add the base pixel code
- Trigger: All Pages
Event Tags
For each event:
- Tags → New → Custom HTML
- Add event code:
<script>
ttq.track('CompletePayment', {
content_id: '{{Transaction ID}}',
value: {{Transaction Revenue}},
currency: 'USD'
});
</script>
- Trigger: Appropriate trigger (e.g., purchase confirmation page)
Sequencing
Ensure base pixel fires before event tags:
- Open your event tag
- Advanced Settings → Tag Sequencing
- “Fire a tag before” → Select your base pixel tag
Step 6: Debugging Checklist
Run through this checklist when TikTok conversions aren’t tracking:
Pixel Installation
- Pixel Helper shows green checkmark
- Network tab shows analytics.tiktok.com requests
- Pixel ID matches Ads Manager
Event Configuration
- Events fire at correct times
- Pixel Helper shows events
- Events appear in Ads Manager (after delay)
- No duplicate events firing
Data Quality
- Required parameters included (value, currency for purchases)
- Correct parameter formats (numbers, not strings)
- Content IDs match across events
Attribution
- Attribution window is appropriate
- Advanced Matching enabled
- Events API implemented (for best results)
Technical Issues
- No JavaScript errors blocking pixel
- Content Security Policy allows TikTok domains
- No ad blockers during testing
TikTok vs Meta vs Google: Key Differences
| Aspect | TikTok | Meta | |
|---|---|---|---|
| Debug Tool | Pixel Helper (basic) | Events Manager (detailed) | Tag Assistant (detailed) |
| Server-Side | Events API | Conversions API | Measurement Protocol |
| Processing Delay | 20min - 24hrs | 15min - 24hrs | 30sec - 48hrs |
| iOS Impact | High | High | Moderate |
TikTok’s debugging is less robust, so expect more manual verification.
When to Get Expert Help
TikTok pixel issues can be difficult to diagnose because:
- Debugging tools are limited compared to Meta/Google
- Events API adds complexity
- iOS tracking is increasingly unreliable
- Attribution can be confusing
Consider expert help if:
- You’ve verified pixel installation but still see zero conversions
- Conversion counts are wildly inaccurate
- You need to implement Events API
- iOS users are a significant portion of your audience
Get a free scan and we’ll check your TikTok pixel implementation and identify exactly what’s preventing conversions from tracking.