| utm_source | |
| utm_medium | cpc |
| utm_campaign | {{CAMPAIGN_NAME}} |
| utm_id | {{CAMPAIGN_ID}} |
| utm_term | {{AD_NAME}} |
| utm_content | {{ADGROUP_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 Reddit auto-appends on every ad click.
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 (auto-appended like gclid/fbclid, with one wrinkle for third-party trackers), 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}} | Reddit’s per-click identifier. Reddit auto-appends it for the native Pixel; include it here so the click ID survives when you route through a third-party ad server or tracker. |
This is the template the mini builder hands users when they pick “Reddit Ads.” The explicit rdt_cid={{CLICK_ID}} line is belt-and-suspenders: Reddit already auto-tags rdt_cid for its own Pixel, but carrying it in the template keeps the click ID intact through third-party trackers (AnyTrack, CM360) that the native auto-append doesn’t reach.
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}}carries Reddit’s per-click value. Reddit already auto-appends that value asrdt_cidon the click, so the Pixel has it without any template work. Mappingrdt_cid={{CLICK_ID}}yourself matters when a third-party ad server or tracker sits in the path and the native auto-append doesn’t reach it.- No placement macro. Reddit doesn’t expose a
{{PLACEMENT}}token — pasting one outputs it literally. The closest context tokens are{{PLATFORM_GROUP}},{{DEVICE_GROUP}}, and{{OS_GROUP}};{{POST_ID}}tells you which post the ad ran against. - No conditional macros. Reddit has no equivalent of Google Ads’
{ifsearch:}/{ifmobile:}. If you need different UTMs per surface 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 and Meta’s fbclid, and it behaves the same way: Reddit auto-appends it to the landing-page URL on every ad click. The Reddit Pixel reads rdt_cid from the URL on landing, persists it into a first-party cookie, and includes it on every subsequent Pixel event. That’s the native click→conversion join, and it works without you adding anything to the URL.
The one wrinkle is the {{CLICK_ID}} macro and the rdt_cid={{CLICK_ID}} template line. You don’t need it for the standard Pixel — the auto-append already covers that. You do need it when a third-party ad server or tracker sits between the click and your landing page (CM360, an affiliate network, AnyTrack), because Reddit’s native auto-append doesn’t survive that hop. Mapping rdt_cid={{CLICK_ID}} in the tracking template re-carries the click ID so downstream attribution still has it.
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. Reddit auto-appends
rdt_cid, so if it’s not on the landing URL something stripped it before it reached your domain — a link shortener, an AMP cache, or a redirect that drops the query string. If a third-party ad server sits in the path, also confirm the template carriesrdt_cid={{CLICK_ID}}through it. - My click-through rate looks fine but conversions are flatlined. Usually
rdt_cid(or the UTMs) is being dropped by a redirect between the click and the landing page, so the Pixel can’t join the conversion to the click. Trace the hops and confirm the click ID and UTMs both survive to the final URL.
| 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 |
| {{POST_ID}} | ID of the post the ad ran against. Reddit has no per-placement macro; the closest context tokens are {{PLATFORM_GROUP}}, {{DEVICE_GROUP}}, and {{OS_GROUP}}. | Click time |
| {{CLICK_ID}} | Reddit's per-click identifier. Reddit already auto-appends this value as rdt_cid on the ad click; the macro lets you carry it in a custom tracking template too. Map it as rdt_cid={{CLICK_ID}} when you route clicks through a third-party ad server or tracker (e.g. AnyTrack) so the click ID still flows. For the standard Reddit Pixel, rdt_cid is on the URL automatically. | Click time |
