Reddit Catalog
Layer 2 destination model for the Reddit product catalog. Thin projection from product_catalogue_canonical with Reddit feed field names, custom labels, product groups, and hosted-feed-file transport (no catalog API).
product_catalogue_reddit projects product_catalogue_canonical into the
Reddit catalog feed format.
Reddit's catalog powers Dynamic Product Ads (DPA) and Collection Ads, and is the
metadata counterpart to the
Reddit CAPI conversion model — the catalog
Product ID is the same value the conversion event sends.
Reddit rolled DPA out to all advertisers in May 2025, so the surface is newer than Meta's; the catalog primitives (required fields, custom labels, product groups) are present, but the transport is different — there is no robust public catalog API. The mapping is otherwise a close cousin of Meta.
How the canonical catalogue maps to Reddit
Reddit's required fields: Product ID, Title, Description, Price,
Image URL, Landing page URL, Availability. Optional but recommended:
brand, sale_price, custom_labels.
| Layer 1 column | Reddit feed field | Notes |
|---|---|---|
item_id |
id (Product ID) |
Matches the Reddit CAPI / pixel product id |
title |
title |
≥ 1 char (all fields must be non-empty) |
description |
description |
|
price |
price |
|
image_link |
image_link |
JPG/PNG, ≤ 20 MB; 1:1 1200×1200 recommended |
link |
link |
Landing page URL |
availability |
availability |
|
brand |
brand |
optional, recommended |
custom_label_0..4 |
custom_label_0..4 |
custom_label_0 = group_id — product-group key |
Template
{{ config(materialized='view', tags=['reddit', 'catalogue', 'outputs']) }}
SELECT
item_id as id,
title,
description,
CAST(price AS VARCHAR) || ' ' || currency as price,
image_link,
link,
availability,
brand,
custom_label_0,
custom_label_1,
custom_label_2,
custom_label_3,
custom_label_4
FROM {{ ref('product_catalogue_canonical') }}
-- Reddit rejects empty required fields; keep only complete rows.
WHERE title IS NOT NULL
AND description IS NOT NULL
AND image_link IS NOT NULL
AND link IS NOT NULL
AND availability IS NOT NULL
Design notes
Product groups, not product sets
Reddit's targeting unit is the product group (its equivalent of Meta product
sets). The portable hook still works: group by custom_label_0 = '<group_id>',
and because the group is itself a catalogue row (id = group_id), group-level
DPA covers SKU-less engagement.
Product ID ↔ Reddit CAPI
The feed Product ID is the retargeting / DPA join key and matches the product
id on the Reddit CAPI event. As with the
other platforms, both derive from canonical item_id, so they agree by
construction.
Every required field must be non-empty
Reddit errors on products missing required-field data, and values must be at
least one character. The WHERE guard above drops incomplete rows rather than
shipping a feed Reddit will partially reject. For the group-as-item rows, ensure
Layer 1 populates a real image and landing URL (same non-sellable-row obligation
as TikTok and Meta).
Newer surface — verify the live spec
Reddit DPA is recent (GA May 2025) and the feed ecosystem is thinner than Meta's. Confirm the current catalog requirements when building — third-party feed guides lag the official spec.
Transport — hosted feed file (the key difference)
Reddit has no robust public catalog API. The Layer 2 view must be published as a hosted feed file, which Reddit fetches on a schedule:
- Formats: CSV, Google Sheets, RSS 2.0 XML, TSV, or compressed files.
- Hosting: HTTPS, FTP, or SFTP URL (never embed credentials in the URL).
- Or upload a CSV manually in the Reddit Ads dashboard under Catalogs.
So unlike Meta/TikTok (which can be a reverse-ETL push to a catalog API), Reddit
needs a feed-publishing job: render product_catalogue_reddit to a file and
publish it to an HTTPS/SFTP URL on a schedule that stays
ahead of go-live.
Plan this as a distinct delivery step.
Reference
- Reddit Catalogs
- Reddit catalog requirements
- Reddit CAPI conversion model
- Meta Catalog model — Reddit mirrors this field set