skills/marketing-growth/tiktok-ads-integration/SKILL.md
Launch TikTok ad campaigns for ecommerce with Events API server-side tracking, Spark Ads, catalog sync, and shopping ads for product discovery
npx skillsauth add finsilabs/awesome-ecommerce-skills tiktok-ads-integrationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
TikTok is a primary discovery channel for ecommerce, particularly for fashion, beauty, home, and consumer goods. Reliable attribution requires pairing the browser-based TikTok Pixel with the server-side Events API (EAPI) — similar to Meta's CAPI approach. For Shopify, WooCommerce, and BigCommerce, the official TikTok integrations install both Pixel and EAPI automatically. Custom implementation only belongs in the Custom/Headless section.
| Platform | Integration Method | Pixel + EAPI | Catalog Sync | |----------|--------------------|-------------|-------------| | Shopify | TikTok for Shopify (official app) | Yes (built-in) | Yes (automatic) | | WooCommerce | TikTok for WooCommerce plugin | Yes (built-in) | Yes (automatic) | | BigCommerce | TikTok channel in Channel Manager | Yes (built-in) | Yes (automatic) | | Custom / Headless | TikTok Pixel JS + Events API REST | Manual implementation | Manual feed generation |
For headless stores, install both the browser Pixel and server-side Events API:
Browser Pixel (add to <head> on every page):
ttq.load('YOUR_PIXEL_ID');
ttq.page();
// Product page
ttq.track('ViewContent', {
content_id: product.sku,
content_type: 'product',
content_name: product.name,
value: product.price,
currency: 'USD',
});
// Purchase — pass event_id for deduplication with Events API
const purchaseEventId = `purchase-${order.id}`;
ttq.track('CompletePayment', {
content_id: order.lineItems.map(i => i.sku).join(','),
value: order.subtotal,
currency: order.currencyCode,
order_id: order.id,
}, { event_id: purchaseEventId });
Server-side Events API (send from your order webhook):
async function trackTikTokPurchase(order: Order, req: Request) {
const eventId = `purchase-${order.id}`; // MUST match Pixel event_id for deduplication
const { createHash } = await import('crypto');
const sha256 = (val: string) => createHash('sha256').update(val.toLowerCase().trim()).digest('hex');
await fetch(
`https://business-api.tiktok.com/open_api/v1.3/pixel/track/?business_id=${process.env.TIKTOK_BUSINESS_ID}`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Access-Token': process.env.TIKTOK_ACCESS_TOKEN!,
},
body: JSON.stringify({
data: [{
pixel_code: process.env.TIKTOK_PIXEL_ID,
event: 'CompletePayment',
event_id: eventId,
event_time: Math.floor(Date.now() / 1000),
user: {
email: sha256(order.customerEmail),
phone_number: sha256(order.customerPhone?.replace(/\D/g, '') ?? ''),
ip: req.ip,
user_agent: req.headers['user-agent'],
ttclid: req.cookies['ttclid'], // TikTok click ID — strongest attribution signal
},
properties: {
value: order.subtotal,
currency: order.currencyCode,
contents: order.lineItems.map(i => ({ content_id: i.sku, content_type: 'product' })),
order_id: order.id,
},
page: { url: `${process.env.STORE_URL}/checkout/thank-you` },
}],
}),
}
);
}
In TikTok Ads Manager, build a three-tier campaign structure:
Campaign 1: Prospecting — Video Shopping Ads
Campaign 2: Retargeting — Engaged Users
Campaign 3: Spark Ads — Boost Organic Content
| Metric | Target | Where to Find | |--------|--------|---------------| | Pixel Event Quality Score | 7+/10 | TikTok Events Manager → Pixel | | Video play rate (2s) | > 25% | Ads Manager → Campaign Analytics | | Click-through rate | > 1% | Ads Manager | | Cost per Purchase | Your target CPA | Ads Manager → Conversions | | ROAS | > 2× for broad / > 4× for retargeting | Ads Manager → Revenue |
ttclid in all EAPI events — capture the TikTok click ID from landing page URLs (?ttclid=xxx) and store in a cookie; it is the strongest attribution signal after iOS 14| Problem | Solution |
|---------|----------|
| Double-counting purchases in Events Manager | Ensure event_id in Pixel and Events API match exactly for the same event |
| Catalog feed rejections | Check that price format is "XX.XX USD" (space between amount and currency code is required) |
| Low match rate in Events Manager | Send ttclid, ip, and user_agent in addition to hashed email for maximum attribution |
| High CPMs but low click-through rate | First 2 seconds of video must be visually arresting — no logo cards or slow product reveal intros |
| Spark Ad authorization expired | Request new auth codes every 30 days; set calendar reminders for creator-authorized content |
tools
Let shoppers save products to a wishlist, share it with friends, and get notified when saved items come back in stock or drop in price
development
Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode
development
Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch
development
Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion