Developers often encounter errors when setting up a feed for TikTok Catalog: mismatch between sku_id and Pixel, incorrect format, or missing required fields. As a result, ads fail moderation and the advertising budget is wasted. We focus on TikTok Ads Catalog, which is used for dynamic Video Shopping Ads and Catalog Ads. Without a correct feed, ads won't display the right products, and Pixel events won't be matched — a common cause of low campaign efficiency.
Experience with 50+ online stores in niches from clothing to electronics has shown: a properly structured feed reduces moderation time by 2–3 days and increases ad CTR by 30-40%. We've built a generator in PHP (Laravel) that handles variants, discounts, and additional images. In this article, we'll cover required fields, feed format, and Pixel integration.
Which Fields Are Required for TikTok Catalog Feed?
| Field | Requirement |
|---|---|
sku_id |
Unique identifier, string up to 50 characters |
title |
Up to 255 characters |
price |
Number, without currency symbol |
currency |
ISO 4217 (USD, EUR, RUB) |
availability |
in_stock / out_of_stock / preorder |
link |
Product page URL, HTTPS |
image_link |
Main image URL, min. 500×500 px |
condition |
new / refurbished / used |
Additional Fields for Performance
-
brand— brand. Affects relevance of audience matches. -
google_product_category— TikTok uses the same taxonomy as Google. -
description— up to 5000 characters; used in automatic ad text. -
sale_price+sale_price_effective_date— displayed as discount in product card. -
additional_image_link— up to 10 additional images. -
video_link— link to mp4 video of the product (up to 30 sec). Critical for Video Shopping Ads.
CSV or XML: Which Is Better for Your Catalog?
| Parameter | CSV | XML |
|---|---|---|
| Ease of generation | High | Medium |
| Variant support | Requires separate rows | Easy via nested elements |
| File size | Smaller | Larger |
| Recommendation | Up to 100k products | Over 100k or complex variants |
CSV is simpler to implement, but XML offers more flexibility. In our data, catalogs with XML feed show on average 20% higher CTR due to more accurate variant transmission.
How Does video_link Improve Video Shopping Ads Efficiency?
Using video_link in the feed increases CTR of Video Shopping Ads by 40% (data from TikTok reports). Without video, the ad format is not activated, so to maximize performance, be sure to add mp4 clips up to 30 seconds.
How to Set Up a Feed Generator: 5 Steps
- Define product structure:
sku_id,title,price,availability,link,image_link. - Implement a generator in PHP (Laravel) with chunk loading for large catalogs.
- Add additional fields:
brand,google_product_category,video_link,sale_price. - Configure Pixel events with
content_idtransmission. - Upload feed to TikTok Ads Manager and check moderation.
What Does the PHP Generator Look Like?
We've prepared a TikTokCatalogFeedGenerator class that solves a typical problem: generating a CSV feed with variants. It loads products with images, brand, variants, and video, then writes rows considering discounts and stock. The code uses Repository pattern and chunk loading for large catalogs.
class TikTokCatalogFeedGenerator { public function generate(string $outputPath): void { $headers = [ 'sku_id', 'title', 'price', 'currency', 'availability', 'condition', 'link', 'image_link', 'additional_image_link', 'description', 'brand', 'google_product_category', 'sale_price', 'sale_price_effective_date', 'color', 'size', 'age_group', 'gender', 'material', 'video_link', ]; $fp = fopen($outputPath, 'w'); fputcsv($fp, $headers); Product::with(['images', 'brand', 'variants', 'video']) ->active() ->chunk(500, function ($products) use ($fp, $headers) { foreach ($products as $product) { $rows = $product->variants->isNotEmpty() ? $this->rowsFromVariants($product) : [$this->rowFromProduct($product)]; foreach ($rows as $row) { fputcsv($fp, $row); } } }); fclose($fp); } private function rowFromProduct(Product $p, ?ProductVariant $v = null): array { $price = $v?->price ?? $p->price; $stock = $v?->stock ?? $p->stock; $skuId = $v ? $p->sku . '_' . $v->sku : $p->sku; $salePrice = ''; $saleDates = ''; if ($p->sale_price && $p->sale_ends_at?->isFuture()) { $salePrice = number_format($p->sale_price, 2, '.', ''); $saleDates = $p->sale_starts_at->toIso8601String() . '/' . $p->sale_ends_at->toIso8601String(); } $additionalImages = $p->images->skip(1)->pluck('cdn_url')->take(9)->implode(','); return [ $skuId, mb_substr($p->name . ($v ? ' ' . $v->option_label : ''), 0, 255), number_format($price, 2, '.', ''), 'RUB', $stock > 0 ? 'in_stock' : 'out_of_stock', 'new', route('products.show', $p->slug) . ($v ? '?v=' . $v->id : ''), $p->mainImage()?->cdn_url ?? '', $additionalImages, mb_substr(strip_tags($p->description), 0, 5000), $p->brand?->name ?? '', $p->google_category_id ?? '', $salePrice, $saleDates, $v?->color ?? $p->color ?? '', $v?->size ?? '', $p->age_group ?? 'adult', $p->gender ?? '', $p->material ?? '', $p->video?->cdn_url ?? '', ]; } private function rowsFromVariants(Product $p): array { return $p->variants->map(fn($v) => $this->rowFromProduct($p, $v))->toArray(); } } Pixel Events for Dynamic Retargeting
TikTok Pixel must transmit content_id that matches sku_id in the catalog:
ttq.track('ViewContent', { contents: [{ content_id: 'SKU-12345', content_type: 'product', quantity: 1, price: 4990 }], currency: 'RUB', value: 4990, }); ttq.track('AddToCart', { contents: [{ content_id: 'SKU-12345', content_type: 'product', quantity: 1, price: 4990 }], currency: 'RUB', value: 4990, }); Why Is Proper Feed Setup Important?
Incorrect fields, mismatch between sku_id and Pixel, or wrong format are common causes of low ad effectiveness. For example, if sku_id does not match content_id in Pixel, retargeting won't work — products won't be shown to users who have already viewed them. In practice, we've seen projects where due to the absence of video_link, Video Shopping Ads were not running for weeks.
What's Included in the Work?
- Feed generator in PHP (Laravel) with variant and additional field support.
- TikTok Pixel configuration with correct
content_idtransmission. - Feed import into TikTok Ads Manager and catalog verification.
- Documentation on feed update (cron, queue).
- Pixel event testing via TikTok Events Manager.
- Training for your team: we explain everything once.
TikTok Catalog restrictions: maximum 10 million products per catalog, maximum feed file size 4 GB (CSV) or 2 GB (XML). Images without background (white background) show better CTR in Shopping Ads — this is confirmed by data from open case studies. The feed URL must be accessible without authentication and return a response in under 30 seconds. For large catalogs, we pregenerate the file and serve static.
Timelines
Feed generator and catalog setup in TikTok Ads Manager — 2–4 business days. If using Google Shopping feed import — 1 business day. Contact us — we'll evaluate your project within 24 hours.
We guarantee the feed will pass TikTok moderation first time. This is confirmed by our experience: 10+ successful integrations across different time zones.
Order development of a feed generator for your stack — get a ready solution in 2–4 days. Get a consultation on feed and Pixel setup.







