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{{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.

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}}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 for utm_id always; use it for utm_campaign too 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. Without rdt_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, 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. 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 fbclid was auto-tagged. Same template pasted into Reddit drops rdt_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

Frequently asked questions

Last reviewed
What's rdt_cid and why isn't it auto-appended?

rdt_cid is Reddit's per-click identifier — the equivalent of Google's gclid or Meta's fbclid. The difference: Reddit doesn't auto-tag it onto outbound URLs the way Google and Meta do. You append it explicitly in the tracking template — rdt_cid={{CLICK_ID}} — and the platform substitutes a unique click ID at click time. If you skip this, the Reddit Pixel can't link a site-side conversion back to the specific click that drove it.

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 rdt_cid (or the UTMs themselves) didn't survive a redirect. Reddit's tracking-URL field doesn't auto-append anything — if you forgot to add UTMs, 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.