utm.new
Reddit Ads logo
Paid social

Reddit Ads UTM parameters

Reddit Ads is the self-serve buying interface for advertising against subreddit and community context. UTMs use UPPERCASE double-brace macros (a third syntax beyond Google Ads' single-brace and Meta's lowercase double-brace). rdt_cid is the click identifier, the Reddit Pixel handles client-side conversions, and the Conversions API covers the iOS and ad-blocker gap.

Updated
Recommended UTM template
Open in builder →
utm_sourcereddit
utm_mediumcpc
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.

ParameterValueWhy
utm_sourceredditGA4 default channel grouping classifies reddit as Paid Social.
utm_mediumcpcMatches 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 for utm_id always; use it for utm_campaign too unless human readability in reports outweighs join stability.
  • {{CLICK_ID}} carries Reddit’s per-click value. Reddit already auto-appends that value as rdt_cid on the click, so the Pixel has it without any template work. Mapping rdt_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, and REDDIT create 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_cid won’t survive certain redirects. Same risk profile as gclid and fbclid — link shorteners, AMP cache, automation wrappers. Defensive UTMs help; a missing rdt_cid doesn’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:

  1. 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.
  2. Confirm UTMs and rdt_cid both landed. Open the URL bar on the landing page; both should be present with substituted values, not literal macros.
  3. 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_id mismatch. Both sides must send the same event_id per 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 carries rdt_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

Frequently asked questions

Last reviewed
What's rdt_cid, and does Reddit auto-append it?

rdt_cid is Reddit's per-click identifier — the equivalent of Google's gclid or Meta's fbclid. Like those, Reddit auto-appends it to the landing-page URL when someone clicks your ad, and the Reddit Pixel reads it on landing to join conversions back to the click. You only need to add it to your tracking template yourself — as rdt_cid={{CLICK_ID}} — when you route clicks through a third-party ad server or tracker (e.g. AnyTrack, CM360) where Reddit's native auto-append doesn't flow through. For a standard Pixel setup, it's already on the URL.

Why is the macro syntax uppercase?

Reddit's tokens use UPPERCASE double curly braces{{CAMPAIGN_ID}}, not {{campaign.id}}. Google Ads is lowercase single-brace. Meta is lowercase double-brace with dot notation. Reddit is uppercase double-brace with underscores. Three platforms, three syntaxes. Don't paste a Meta template into Reddit and hope — the tokens will output as literals.

Does Reddit Ads support utm_id?

Yes — though the platform's own dashboards key off Reddit's internal IDs, not the UTM. The right setup is the same as everywhere else: utm_id={{CAMPAIGN_ID}} in your tracking template. GA4's Campaign ID dimension and any cost-data import to GA4 (e.g. via Supermetrics or AnyTrack) joins on this value.

Should I rely on the Reddit Pixel alone, or do I need the Conversions API?

Both. The Reddit Pixel is the easy win — JavaScript tag, fires on the standard events (PageVisit, AddToCart, Purchase, Lead, etc.). The Conversions API is the server-side complement that catches events the Pixel misses: Safari ITP–blocked clicks, ad-blocker-blocked clicks, iOS users with strict tracking prevention, server-side conversions with no browser session. As of 2026, Pixel-only attribution typically loses 25–40% of conversions to client-side blocks. CAPI closes most of that gap, deduplicated against the Pixel via a shared event_id.

What's the right utm_medium for Reddit Ads?

cpc. Matches GA4's paid-channel regex, gets classified as Paid Social by default, and aligns with how teams already group reporting across paid social platforms. paid-social works too but is less universal — if your stack also flows into GA Universal-style legacy systems, cpc is safer.

Where do I set the tracking template — at the campaign or ad level?

Ad level. Reddit's tracking-URL field lives on the individual ad, not the campaign. Like Meta, there's no inheritance from a higher level. If you create five ads in an ad group, you set the URL on each — though Reddit's UI lets you bulk-apply during ad creation when you duplicate from an existing ad.

Why does my Reddit Ads campaign show as (direct)/(none) in GA4 sometimes?

Almost always means the UTMs (or rdt_cid) didn't survive a redirect. Reddit auto-appends rdt_cid, but it doesn't add UTMs for you — if you forgot to put UTMs on the ad's URL, there's nothing for GA4 to read. If you added them but they're missing on the landing page, check for: link shorteners that strip query strings, server-side redirects that don't forward params, AMP-cache redirects, or a mobile-app deep link that drops the URL altogether.

Are Reddit's macros case-sensitive?

Yes — and unlike most platforms, case-correct. {{campaign_id}} in lowercase outputs literally; only {{CAMPAIGN_ID}} substitutes. This is one of the most common Reddit-specific bugs people hit when migrating templates from Meta.