| utm_source | |
| utm_medium | cpc |
| utm_campaign | {{CAMPAIGN_NAME}} |
| utm_id | {{CAMPAIGN_ID}} |
| utm_term | {{AD_NAME}} |
| utm_content | {{AD_NAME}} |
| rdt_cid | {{CLICK_ID}} |
Reddit Ads is the buying interface for placing ads against the most context-heavy social surface in the consumer internet — subreddit communities, conversations on specific posts, and the Reddit feed. The targeting model rewards advertisers who think in terms of community fit rather than persona-style demographics, and the measurement model has caught up to where Meta and Google were two or three years ago: a Pixel for client-side, a Conversions API for the rest, and a click identifier (rdt_cid) that you have to wire up yourself.
The macro syntax is the easy thing to get wrong. Reddit uses UPPERCASE double curly braces — {{CAMPAIGN_ID}}, {{AD_NAME}}, {{CLICK_ID}}. This is a third distinct syntax beyond Google Ads’ single-brace lowercase ({campaignid}) and Meta’s lowercase double-brace ({{campaign.id}}). Templates do not transfer between platforms.
This page covers the macro catalog, where the tracking-URL field actually lives, the rdt_cid story (different from Google’s auto-tagging in one important way), the Pixel/CAPI handshake, and the small list of common ways the setup goes wrong.
The recommended UTM template
| Parameter | Value | Why |
|---|---|---|
utm_source | reddit | GA4 default channel grouping classifies reddit as Paid Social. |
utm_medium | cpc | Matches GA4’s paid-channel regex. |
utm_campaign | {{CAMPAIGN_NAME}} | Human-readable campaign in reports. Switch to {{CAMPAIGN_ID}} if your team renames campaigns frequently. |
utm_id | {{CAMPAIGN_ID}} | Always the numeric ID — rename-safe and powers GA4 cost-data joins. |
utm_term | {{AD_NAME}} | Creative-level dimension for paid social. |
utm_content | {{ADGROUP_NAME}} | Audience differentiation within a campaign. |
rdt_cid | {{CLICK_ID}} | Required. Reddit’s per-click identifier for Pixel/CAPI attribution. Not auto-appended. |
This is the template the mini builder hands users when they pick “Reddit Ads.” The rdt_cid line is the one most third-party guides forget — without it, Reddit’s measurement loses the click→conversion join.
Dynamic macros
Reddit’s macro list is short — about a dozen useful tokens — and the catalog is straightforward once you accept the UPPERCASE convention. Practical points worth knowing:
- UPPERCASE only.
{{campaign_id}}outputs literally as{{campaign_id}}. The fix is exactly four shift-keys. - IDs vs names — same trade-off as everywhere.
{{CAMPAIGN_NAME}}returns whatever the campaign is called right now; rename the campaign and historical UTM joins desync.{{CAMPAIGN_ID}}is rename-safe forever. Use the ID forutm_idalways; use it forutm_campaigntoo unless human readability in reports outweighs join stability. {{CLICK_ID}}is the one that’s specific to Reddit. It generates a unique value per click, which Reddit’s measurement system can later join against the Pixel event log. Withoutrdt_cid={{CLICK_ID}}in the template, the join is impossible.{{PLACEMENT}}returns short strings — typically the surface name (feed,conversation, etc.). Less wordy than Meta’s underscore-joined format.- No conditional macros. Reddit has no equivalent of Google Ads’
{ifsearch:}/{ifmobile:}. If you need different UTMs per placement or device, you split the ad rather than templating.
Where to put the tracking URL
Reddit’s URL field — typically labelled Tracking URL or Destination URL depending on UI version — lives on the ad, not the campaign or ad group. Same shape as Meta: every ad has its own URL with its own UTM template; no inheritance from above.
The full URL goes into the field, including UTMs and rdt_cid:
https://example.com/landing?utm_source=reddit&utm_medium=cpc&utm_campaign={{CAMPAIGN_NAME}}&utm_id={{CAMPAIGN_ID}}&utm_term={{AD_NAME}}&utm_content={{ADGROUP_NAME}}&rdt_cid={{CLICK_ID}}
When you duplicate an ad inside Reddit Ads Manager, the URL duplicates with it. When you bulk-create from a CSV, every row carries its own URL. There’s no shared template object.
rdt_cid: the click identifier
rdt_cid is Reddit’s per-click ID — same role as Google’s gclid, Meta’s fbclid. The difference: Reddit doesn’t auto-append it. You wire it up explicitly in the tracking template via rdt_cid={{CLICK_ID}}.
This is the most common Reddit-specific gotcha. People migrate a Meta template that omits fbclid (because Meta auto-tags it), paste it into Reddit, and end up with no click identifier on the URL. The Reddit Pixel then has nothing to join site-side events against the original click — campaign reports look fine in Reddit Ads Manager, but conversion attribution falls apart.
The Pixel reads rdt_cid from the URL on landing, persists it into a first-party cookie, and includes it on every subsequent Pixel event. Same shape as Meta’s _fbc cookie or the way Google Ads’ GCLID flows into Google’s conversion tracking.
Pixel + Conversions API
Reddit launched its Conversions API in 2023 and it’s now the standard companion to the Pixel for any advertiser running meaningful spend.
The Reddit Pixel is the JavaScript tag — fires events from the browser, reads rdt_cid off the URL, ships events to Reddit’s collection endpoint. Standard events: PageVisit, ViewContent, Search, AddToCart, AddToWishlist, Purchase, Lead, SignUp. Custom events possible.
The Conversions API (CAPI) is the server-side complement — same events, sent from your server, your CDP, or a CAPI partner integration to Reddit’s API endpoint. Events are deduplicated against the Pixel by matching event_id on both sides.
For 2026, the practical setup is: Pixel for the easy 60–75% of clicks where it isn’t blocked, CAPI for everything ITP/ad-blockers/iOS tracking-prevention drops. Pixel-only is increasingly leaving meaningful attribution on the table — Safari and aggressive privacy add-ons routinely drop the cookie, and CAPI is the only path that survives.
For the receiver-side picture — how GA4 classifies utm_source=reddit, what happens when rdt_cid arrives without UTMs — see Google Analytics .
Limitations and gotchas
- The macro syntax doesn’t transfer. UPPERCASE double-brace is Reddit-only. Meta lowercase, Google single-brace, Microsoft uppercase-curly. Always reset your muscle memory when switching.
- Case sensitivity in UTMs themselves. GA4 preserves source/medium case.
Reddit,reddit, andREDDITcreate three rows. Lowercase the source string regardless of macro casing. - No campaign-level URL template. Set per ad. Bulk-apply during creation; otherwise you’re updating one ad at a time.
rdt_cidwon’t survive certain redirects. Same risk profile asgclidandfbclid— link shorteners, AMP cache, automation wrappers. Defensive UTMs help; a missingrdt_ciddoesn’t.- The Tracking URL field accepts anything. No syntax validation, no preview. A typo in the macro name (
{{CAMPGN_ID}}) outputs literally and you only find out post-launch.
Verification
Three steps, in order:
- Click your own ad in incognito. No preview tool exists in Reddit Ads Manager — clicking the live ad and inspecting the landing-page URL is the only deterministic check.
- Confirm UTMs and
rdt_cidboth landed. Open the URL bar on the landing page; both should be present with substituted values, not literal macros. - Verify in Events Manager. Reddit’s Events Manager → Test Events. Fire an event from your landing page and confirm Reddit’s collection sees both the Pixel event and (if CAPI is wired) the API event with matching
event_id.
Common problems
- My UTMs come out as literal
{{CAMPAIGN_ID}}in URLs. Tokens were pasted in lowercase or with a typo. Reddit is case-sensitive on macros —{{CAMPAIGN_ID}}only. - My Reddit campaign shows as
(direct)/(none)in GA4. Either UTMs were never set, or they were stripped by a redirect. Click your own ad and inspect. - Reddit Ads Manager reports way more conversions than GA4 sees. Often a Pixel/Conversions-API double-count from
event_idmismatch. Both sides must send the sameevent_idper event for Reddit to deduplicate them. - My Pixel is firing but rdt_cid never sticks in the cookie. Most likely missing from the tracking URL — Reddit doesn’t auto-tag it. Check the template explicitly includes
rdt_cid={{CLICK_ID}}. - My click-through rate looks fine but conversions are flatlined. Migration from Meta where
fbclidwas auto-tagged. Same template pasted into Reddit dropsrdt_cid. Add it.
| Token | Description | Substituted at |
|---|---|---|
| {{CAMPAIGN_ID}} | Numeric campaign ID. Stable across renames — recommended as utm_id. | Click time |
| {{CAMPAIGN_NAME}} | Campaign name. | Click time |
| {{ADGROUP_ID}} | Numeric ad group ID. | Click time |
| {{ADGROUP_NAME}} | Ad group name. | Click time |
| {{AD_ID}} | Numeric ad ID. | Click time |
| {{AD_NAME}} | Ad name. | Click time |
| {{PLACEMENT}} | Where the ad rendered — feed, conversation, native, etc. | Click time |
| {{CLICK_ID}} | Reddit's per-click identifier — populates rdt_cid for downstream attribution. Unlike Meta's fbclid or Google's gclid, Reddit doesn't auto-append this. You set it explicitly via rdt_cid={{CLICK_ID}} in your tracking template. | Click time |
