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