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:

  1. Catalog Batch API — push the Layer 2 table via reverse ETL for real-time sync (best for frequently changing inventory).
  2. 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