Reddit Conversions API GTM: Server-Side Delivery Through sGTM
Reddit Conversions API GTM delivery is not a matter of enabling a built-in tag: server-side Google Tag Manager ships no native Reddit integration, so the documented path is a custom server-side template that posts the Reddit v3 payload itself. Both sides supply the glue: sGTM's custom template API provides sendHttpRequest for outbound POSTs, and Reddit's Conversions API accepts a plain JSON body at one endpoint - what remains is the mapping between them.
The Mechanism: a Custom Template on sendHttpRequest
Google's server-side tagging documentation defines the custom template API, and sendHttpRequest is its outbound call: the template issues an HTTPS POST from the server container, with headers and a body you control. Reddit's endpoint for conversion events is https://ads-api.reddit.com/api/v3/pixels/<pixel_id>/conversion_events, authenticated with the conversion access token as a bearer header and accepting the data.events JSON body. No native tag, no partner gallery requirement - the template, the URL, and the token are the whole stack. (If your stack instead allows a plain outbound webhook, the same payload rules apply; Reddit does not care who formats the JSON.)
Mapping the sGTM Event Model to the Reddit Payload
| Reddit v3 field | Source in the sGTM event model |
|---|---|
event_at | The conversion's original timestamp in Unix milliseconds - not the send time - within the seven-day window |
action_source | Fixed WEBSITE for web containers |
type.tracking_type | Mapped from the inbound event name (purchase to PURCHASE, generate_lead to LEAD, and so on) |
metadata.conversion_id | A stable per-conversion identifier - the order ID, or a value derived from the event model |
user.ip_address, user.external_id | From the client fields the container preserves; hashed identifiers must follow Reddit's canonicalization |
click_id | Extracted from the landing URL query (rdt_cid) that the client captured at click time |
event_source_url | The page location, which also serves Reddit as a click-ID fallback |
Two mapping details carry most of the value. The click ID is first: rdt_cid reaches the container only if the client captured it into the event - typically from page_location - and the template then passes it as click_id; the extraction chain is the same one described in the rdt_cid tracking guide. The conversion ID comes second: Reddit's deduplication prefers a unique conversion_id per distinct conversion, identical on pixel and server sides - a template that invents a fresh value per send silently disables dedup.
Pipelines, Windows, and Dedup Discipline
The template inherits Reddit's payload rules wholesale: events must be sent within seven days of the conversion, batches are capped at 1,000 events per request, and the dedup job only processes events that arrived within two days. A server container that queues events during downtime must therefore flush within the windows, not after them - and a template that resends the same conversion with a fresh conversion_id turns one conversion into two on Reddit's side. Error responses and their fixes are tabulated in Reddit Conversions API errors.
A maintained sGTM deployment is real operational work - template versioning, token rotation on revocation, and monitoring 429 backoffs. Teams that would rather own only the postback hand the mapping to an automation: MOST applies the same payload rules per network, and Pixel Activator sends single test events without any setup. The cluster map is in the Reddit Conversions API complete guide, and the credentials in Reddit Conversions API setup.
