UTM Tracking for Reddit Ads: How to Build and Validate Campaign Links

For Reddit Ads, use utm_source=reddit with utm_medium=cpc for paid campaigns (Promoted Posts, Conversation Ads, and all paid Reddit formats). Reddit has no GA4 auto-tagging — there is no equivalent to Google's gclid or Meta's fbclid that automatically populates source and medium data in GA4. Without UTM parameters, Reddit Ads clicks typically appear as reddit.com referral traffic in GA4's Traffic Acquisition report rather than routing to the Paid Social channel group. Using utm_medium=cpc correctly ensures GA4 distinguishes paid Reddit spend from organic Reddit referrals and attributes sessions to the right channel.

Terminal showing mlz build command with utm_source=reddit and utm_medium=cpc, a GA4 Paid Social channel group label, and the assembled tracked URL at the bottom.

Why UTM parameters are essential for Reddit Ads

Reddit is one of the few major ad platforms with no native integration that pushes structured attribution data into GA4 automatically. Unlike Google Ads (which has gclid and auto-tagging) or Meta (which has fbclid), Reddit Ads relies entirely on UTM parameters to communicate with external analytics tools. The consequences of running Reddit Ads without UTM tags:

Reddit traffic shows as referral, not paid
GA4 attributes untagged Reddit clicks as referral traffic from reddit.com. This traffic lands in the Referral channel group — not Paid Social. If you're spending on Reddit Ads and seeing no Paid Social lift in GA4, missing UTM tags are likely the cause. Your paid Reddit spend is invisible in any report that filters by channel.
Reddit's own Ads Manager reports only Reddit-side metrics
Reddit Ads Manager shows impressions, clicks, CPM, and CPC — but these are Reddit's internal counts. Without UTM parameters flowing into GA4, you have no way to connect Reddit's click count to the sessions, conversions, and revenue that GA4 tracks. ROAS calculations require both sides of this data to be in the same system.
Reddit's Pixel handles conversion tracking, not GA4 session attribution
Reddit's Pixel (similar to Meta Pixel) lets you fire conversion events back to Reddit Ads for optimisation and reporting inside Ads Manager. It is not a substitute for UTM parameters — the Pixel reports conversions to Reddit, while UTM parameters bring session attribution into GA4. Both can coexist on the same page: Pixel fires for Reddit's bidding system, UTMs populate GA4's acquisition reports.
Organic Reddit referrals must be separated from paid
If you post organically on Reddit or participate in communities that link to your content, those sessions arrive in GA4 as referral traffic from reddit.com. Without UTM tags on your paid campaigns, GA4 cannot distinguish paid clicks from organic Reddit referrals — and both blend into the same referral row in Traffic Acquisition reports.

The correct utm_source and utm_medium for Reddit Ads

Reddit offers several ad formats. The utm_source is always reddit; the utm_medium depends on whether the campaign is paid or whether you're tagging organic posts:

Reddit campaign type utm_source utm_medium
Promoted Post (link ad) reddit cpc
Conversation Ad reddit cpc
Product Ad / Carousel reddit cpc
Video Ad reddit cpc
Organic Reddit post with link reddit social

Use utm_medium=cpc for all paid Reddit campaigns. GA4's default Paid Social channel group requires a social platform source (like reddit) paired with a paid medium indicator — and cpc is the most broadly compatible paid indicator in GA4's built-in channel definitions. Some teams use utm_medium=paid-social for Reddit, which works if you create a custom GA4 channel group rule to match it, but cpc is the safest default for out-of-the-box GA4 channel groupings.

For organic Reddit posts (links posted in subreddits or on your own profile), use utm_medium=social. GA4 routes utm_source=reddit&utm_medium=social to the Organic Social channel group, keeping paid and organic Reddit traffic separated in all acquisition reports.

Building Reddit UTM links with mlz build

The mlz build command generates the full tracked URL and normalises all parameter values to lowercase automatically. Reddit campaigns frequently target multiple ad groups and subreddits — use --content to identify which subreddit or ad group drove a session, keeping campaign-level reporting clean in GA4:

mlz build — paid Reddit campaign links
# Promoted Post (paid) — basic
$ mlz build \
  --url "https://example.com/landing" \
  --source "reddit" \
  --medium "cpc" \
  --campaign "spring-launch-2026"

{
  "tracked_url": "https://example.com/landing?utm_source=reddit&utm_medium=cpc&utm_campaign=spring-launch-2026",
  "params": {
    "utm_source": "reddit",
    "utm_medium": "cpc",
    "utm_campaign": "spring-launch-2026"
  }
}

# With subreddit tracking via --content
$ mlz build \
  --url "https://example.com/landing" \
  --source "reddit" \
  --medium "cpc" \
  --campaign "spring-launch-2026" \
  --content "r-marketing"
"tracked_url": "...?utm_source=reddit&utm_medium=cpc&utm_campaign=spring-launch-2026&utm_content=r-marketing"

The --content flag maps to utm_content, which appears in GA4's Traffic Acquisition report under the "Session manual term" or "Session content" dimension. This is the recommended way to differentiate subreddit-level performance within a single campaign — without creating separate campaigns for each subreddit target.

Add --validate to check that the destination URL is live and returns HTTPS/200 at build time. This is particularly useful for Reddit Ads where campaigns are reviewed before going live — a 404 destination discovered during Reddit's review cycle wastes the review window.

Validating Reddit campaign links before launch

Reddit Ads pull OG tags (og:title, og:description, og:image) when generating link previews for Promoted Posts in the feed. A missing og:image causes the Promoted Post to render without a visual preview — which typically reduces click-through rates on a platform where image-forward content performs better than text-only links. Use mlz build --validate --inspect to check both URL validity and OG metadata in one pass before submitting to Reddit's review:

mlz build with validation and OG inspection
$ mlz build \
  --url "https://example.com/landing" \
  --source "reddit" \
  --medium "cpc" \
  --campaign "spring-launch-2026" \
  --content "r-marketing" \
  --validate \
  --inspect

{
  "tracked_url": "https://example.com/landing?utm_source=reddit&utm_medium=cpc&utm_campaign=spring-launch-2026&utm_content=r-marketing",
  "validation": {
    "valid": true,
    "checks": [
      { "check": "ssl", "status": "pass" },
      { "check": "resolution", "status": "pass", "details": { "status_code": 200 } },
      { "check": "redirects", "status": "pass", "message": "No redirects detected." }
    ]
  },
  "inspection": {
    "open_graph": {
      "title": "Spring Launch 2026 — Example Co",
      "image": "https://example.com/og-spring.png",
      "description": "Product launch details and offer."
    },
    "checks": [
      { "check": "open_graph", "status": "pass", "message": "Open Graph tags present: title, description, and image." }
    ]
  }
}

A passing open_graph check confirms Reddit's crawler can fetch your og:image when generating the Promoted Post preview. For a complete pre-publish workflow that also validates post copy length and hashtag limits, use mlz publish-check.

Using utm_content to track subreddit performance

Reddit Ads lets you target specific subreddits at the ad group level. A single campaign might target r/marketing, r/entrepreneur, and r/startups simultaneously. Without utm_content, all three ad groups show up as a single blended row in GA4 under the same campaign name — making it impossible to know which community drove conversions.

Use utm_content to encode the subreddit or ad group name. Convention: use the subreddit slug prefixed with r- to avoid the slash character, which can cause URL encoding issues:

mlz build — subreddit-level UTM tracking
# r/marketing ad group
$ mlz build \
  --url "https://example.com/landing" \
  --source "reddit" \
  --medium "cpc" \
  --campaign "spring-launch-2026" \
  --content "r-marketing"

# r/entrepreneur ad group
$ mlz build \
  --url "https://example.com/landing" \
  --source "reddit" \
  --medium "cpc" \
  --campaign "spring-launch-2026" \
  --content "r-entrepreneur"

# r/startups ad group
$ mlz build \
  --url "https://example.com/landing" \
  --source "reddit" \
  --medium "cpc" \
  --campaign "spring-launch-2026" \
  --content "r-startups"

In GA4's Traffic Acquisition report, filter by Session campaign = spring-launch-2026 and add Session content as a secondary dimension. Each subreddit ad group appears as a separate row — giving you the subreddit-level conversion data that Reddit Ads Manager's own reporting doesn't connect to your GA4 goals.

Reddit Ads tracking gotchas

Reddit's URL shortener and UTM parameter survival
Reddit wraps outbound links through its own redirect system. When a user clicks a Promoted Post, the click goes through Reddit's redirect before landing on your destination URL. In standard configurations, UTM parameters survive this redirect — they're part of the destination URL that Reddit passes through. However, if your destination URL uses additional redirects (CDN, link shortener, landing page builder), each hop is an additional point of failure. Validate the full redirect chain with mlz check before launch to confirm parameters reach the final destination.
Reddit's Pixel and GA4 show different conversion counts
Reddit's Pixel fires when a conversion event occurs and reports that event back to Reddit Ads for internal attribution. GA4 records the session and conversion when the user arrives via the UTM-tagged URL and completes a goal. These two systems have different attribution models and lookback windows — Reddit Ads uses a 7-day click and 1-day view attribution window by default, while GA4 uses last-click attribution by default. Discrepancies between Reddit Ads conversion count and GA4 goal completions are normal and expected.
Reddit in-app browsing and UTM parameter survival
Reddit's mobile app opens links in an in-app browser before routing to the destination. UTM parameters survive this transition in most configurations — they're embedded in the destination URL that Reddit passes to the in-app browser. The more common issue is when users click a Reddit Promoted Post on mobile, switch apps, and return later via a direct bookmark or shared link without the original UTM parameters.
Conversation Ads use a different link format
Reddit's Conversation Ads (formerly carousel ads) show an expandable comment-style ad unit with a CTA button that links to your destination. The destination URL on the CTA button is where you set UTM parameters — not in the ad headline. Ensure UTM parameters are applied to the CTA destination URL in Ads Manager, not to the ad unit's display URL.
Avoid "Reddit" with capital R in utm_source
GA4 is case-sensitive for UTM parameter values. utm_source=reddit and utm_source=Reddit appear as two separate traffic sources in GA4 reports. Always use lowercase — the mlz build CLI normalises values to lowercase automatically, preventing this fragmentation at the source.

Reddit UTM naming conventions

Consistent naming across all Reddit campaigns is the foundation of reliable GA4 attribution. GA4 is case-sensitive, so the same source with different capitalisation creates separate rows in every acquisition report:

  • utm_source: reddit (always lowercase — never "Reddit" or "REDDIT")
  • utm_medium: cpc for all paid Reddit campaign formats, social for organic Reddit posts
  • utm_campaign: lowercase hyphen-separated, e.g. spring-launch-2026 or q2-brand-awareness
  • utm_content: subreddit or ad group identifier, e.g. r-marketing or r-entrepreneur
  • utm_term: not typically used for Reddit Ads (Reddit targets by interest and subreddit, not keyword); omit unless you have a specific reason to populate it

For a full cross-channel naming reference that covers all five UTM parameters, see the UTM naming conventions guide. For the GA4 case sensitivity mechanics that explain why lowercase enforcement matters, see Are UTM parameters case sensitive in GA4?

FAQ

Does Reddit have auto-tagging like Google Ads?
No. Reddit has no equivalent to Google's gclid auto-tagging that automatically sends structured source and medium data to GA4. Reddit's Pixel provides conversion data back to Reddit Ads for bidding and reporting within Ads Manager, but it does not populate GA4's Traffic Acquisition reports with source, medium, or campaign data. UTM parameters are the only mechanism for Reddit Ads attribution in GA4.
What utm_medium should I use for Reddit Ads — cpc or paid-social?
Use utm_medium=cpc for reliable routing to GA4's default Paid Social channel group without any custom configuration. GA4's built-in Paid Social channel group conditions match a social platform source (like reddit) combined with a paid medium indicator — and cpc is the most consistently matched paid indicator in GA4's default channel definitions. Using utm_medium=paid-social works if you create a custom GA4 channel group rule for it, but requires ongoing maintenance. cpc is the safer default for most setups.
How do I track which subreddit an ad group targets?
Use utm_content to encode the subreddit name or ad group identifier. The recommended convention is to use the subreddit slug prefixed with r- to avoid URL encoding issues with the forward slash in r/subreddit format. For example, a campaign targeting r/marketing would use utm_content=r-marketing. In GA4's Traffic Acquisition report, add Session content as a secondary dimension to see performance broken down by subreddit.
Will UTM parameters survive Reddit's redirect?
In standard configurations, yes — UTM parameters are part of the destination URL that Reddit's redirect system passes through to the final page. The more common point of failure is additional redirects on your own infrastructure (CDN, link shortener, landing page platform) after Reddit's redirect. Validate the complete destination URL chain with mlz check before launch to confirm parameters are preserved through every hop.
Can I use both Reddit's Pixel and UTM parameters on the same page?
Yes, and you should. Reddit's Pixel fires JavaScript events that report conversions back to Reddit Ads for bidding optimisation and internal Ads Manager reporting. UTM parameters are query string values that GA4 reads on session start to populate Traffic Acquisition reports. They are independent systems serving different purposes and do not interfere with each other. Using both gives you Reddit Ads' own conversion optimisation signals plus complete GA4 attribution for cross-channel analysis.

Build Reddit UTM links from the terminal

Pass --source "reddit" --medium "cpc" to mlz build and get a normalised, validated URL ready for your Reddit Ads destination field. Lowercase normalisation means GA4 routes every session to the Paid Social channel group correctly. Add --content "r-subreddit" to track subreddit-level performance, and --validate --inspect to confirm the destination is live and OG tags are present before your campaign starts spending.

npm install -g missinglinkz

Free plan: 50 links/month. No credit card. See the UTM tracking for developers guide for the full programmatic workflow.