TikTok Catalog
Layer 2 destination model for the TikTok product catalog. Thin projection from product_catalogue_canonical with TikTok feed field names, custom labels, product sets, and the e-commerce-vertical-only wrinkle for non-sellable rows.
product_catalogue_tiktok projects product_catalogue_canonical into the
TikTok catalog feed format.
TikTok's catalog powers Dynamic Showcase Ads, Catalog Ads, Video Shopping Ads,
and Collection Ads, and is the metadata counterpart to TikTok Events API
conversions — the catalog id is the same value the pixel/Events API sends for
retargeting.
The good news: TikTok mirrors the Meta model almost exactly — same feed
fields, custom_label_0..4, product sets, and an id that must match pixel
events. The canonical → TikTok mapping is therefore nearly identical to
Meta. The deltas are noted below.
How the canonical catalogue maps to TikTok
TikTok requires nine fields on every row: id, title, description,
availability, condition, price, link, image_link, brand.
| Layer 1 column | TikTok feed field | Notes |
|---|---|---|
item_id |
id |
"Unique product identifier (SKU) that matches your pixel events" |
title |
title |
≤ 150 chars |
description |
description |
≤ 5,000 chars |
availability |
availability |
in stock / out of stock / preorder / available for order |
condition |
condition |
new / refurbished / used |
price |
price |
29.99 USD |
link |
link |
Product URL |
image_link |
image_link |
≥ 500×500 |
brand |
brand |
Required by TikTok |
custom_label_0..4 |
custom_label_0..4 |
custom_label_0 = group_id — product-set key |
Template
{{ config(materialized='view', tags=['tiktok', 'catalogue', 'outputs']) }}
SELECT
item_id as id,
title,
description,
availability,
condition,
CAST(price AS VARCHAR) || ' ' || currency as price,
link,
image_link,
-- brand is required; fall back to a constant so non-merch rows pass validation
COALESCE(brand, 'A24') as brand,
custom_label_0,
custom_label_1,
custom_label_2,
custom_label_3,
custom_label_4
FROM {{ ref('product_catalogue_canonical') }}
Design notes
id matches pixel events
Like Meta's content_ids, TikTok's id "must match your pixel events" for
retargeting. It resolves to the canonical item_id, so it agrees with the
TikTok Events API conversion payload by construction.
Custom labels and product sets
TikTok supports custom_label_0 through custom_label_4 and product sets
built with AND/OR logic over any feed field. The portable pattern carries over
unchanged: a per-group product set is custom_label_0 = '<group_id>', and the
group row (id = group_id) makes group-level Dynamic Showcase Ads work for
SKU-less engagement.
E-commerce-vertical-only wrinkle
TikTok catalogs are created against the e-commerce vertical and do not
document a non-retail item type. The "group as a catalogue item" row (a title, a
trailer) is not directly purchasable, but TikTok still requires price,
availability, condition, image_link, and brand. Populate sensible
placeholders in Layer 1 (price 0, availability = 'in stock',
condition = 'new', a real image, brand fallback) so those rows validate. This
is the same compromise Meta requires for non-sellable rows — it is not a blocker,
just a required-field obligation. TikTok recommends at least 20 products in a
catalog for Dynamic Showcase / Collection Ads.
Minimum feed size
TikTok recommends ≥ 20 items for Dynamic Showcase and Collection Ads. The group-as-item rows plus child SKUs usually clear this easily; for a thin catalogue, confirm you are above the threshold before launching DPA.
Transport
Two options, unlike Reddit:
- Catalog Batch API — push the Layer 2 table via reverse ETL for real-time sync (best for frequently changing inventory).
- Scheduled feed URL — publish the Layer 2 view as a hosted CSV / XML / TSV at an HTTPS URL; TikTok fetches it hourly to daily. Native Shopify / WooCommerce / BigCommerce connectors also exist for merch.
Either way, refresh ahead of new items going live so the coverage contract holds.
Reference
- Create a TikTok catalog
- TikTok Catalog Batch API
- TikTok product feed fields
- Meta Catalog model — TikTok mirrors this field set