Reddit Pixel & Conversions API Implementation | OpsBlu Docs

Reddit Pixel & Conversions API Implementation

Technical guide to Reddit Pixel (rdt) installation, conversion event tracking, custom audiences, Conversions API setup, and event matching configuration.

How Reddit Tracking Works

Reddit's measurement system uses the Reddit Pixel (browser-side JavaScript) and the Reddit Conversions API (server-side). Both feed data into Reddit Ads Manager for attribution, conversion reporting, and audience building.

Browser-side (Reddit Pixel): The pixel loads alb.reddit.com/snoo.js, which initializes a global rdt function. On initialization, it sets a _rdt_uuid first-party cookie as the browser identifier. The pixel also reads the rdt_cid click identifier from the URL when users arrive from Reddit ad clicks. Event data is sent to alb.reddit.com containing the event name, parameters, cookie values, and any user data for matching.

Server-side (Conversions API): The Conversions API (CAPI) accepts events via HTTPS POST to ads-api.reddit.com/api/v2.0/conversions/events/{account_id}. It requires an OAuth2 access token. Server-side events bypass ad blockers and provide tracking coverage for users on restricted browsers.

Deduplication: When running both pixel and CAPI, Reddit deduplicates using the event_metadata.conversion_id field. If the same conversion_id arrives from both sources, Reddit keeps one event. Always generate a consistent ID and send it through both channels.

Identity matching: Reddit matches conversions to ad views and clicks through the _rdt_uuid cookie, the rdt_cid click identifier (from ad click URLs), hashed email, hashed external ID (your user ID), and IP + user agent fingerprinting. The click ID is the strongest attribution signal.


Installing the Reddit Pixel

Add the base pixel code inside <head> on every page:

<script>
!function(w,d){if(!w.rdt){var p=w.rdt=function(){p.sendEvent?
p.sendEvent.apply(p,arguments):p.callQueue.push(arguments)};
p.callQueue=[];var t=d.createElement("script");
t.src="https://www.redditstatic.com/ads/pixel.js";t.async=!0;
var s=d.getElementsByTagName("script")[0];
s.parentNode.insertBefore(t,s)}}(window,document);

rdt('init', 'YOUR_PIXEL_ID', {
  optOut: false,
  useDecimalCurrencyValues: true
});
rdt('track', 'PageVisit');
</script>

Replace YOUR_PIXEL_ID with the pixel ID from Reddit Ads Manager > Events Manager > Reddit Pixel.

The useDecimalCurrencyValues: true flag specifies that currency values are in decimal format (e.g., 29.99) rather than cents (e.g., 2999).

Via Google Tag Manager: Use the Reddit Pixel tag template from the GTM Community Gallery. Configure the pixel ID and fire on All Pages for the PageVisit event. Create separate GTM tags for conversion events with appropriate triggers.


Conversion Tracking

Standard Events

Fire conversion events with rdt('track'):

// Purchase
rdt('track', 'Purchase', {
  value: 89.99,
  currency: 'USD',
  transactionId: 'order_12345',
  itemCount: 2,
  products: [
    { id: 'SKU-001', name: 'Widget Pro', category: 'Widgets', price: 44.99 },
    { id: 'SKU-002', name: 'Widget Lite', category: 'Widgets', price: 45.00 }
  ],
  conversionId: 'cv_order_12345_1709510400'
});

// Add to Cart
rdt('track', 'AddToCart', {
  value: 44.99,
  currency: 'USD',
  itemCount: 1,
  products: [
    { id: 'SKU-001', name: 'Widget Pro', category: 'Widgets' }
  ]
});

// View Content
rdt('track', 'ViewContent', {
  products: [
    { id: 'SKU-001', name: 'Widget Pro' }
  ]
});

// Lead / Form Submission
rdt('track', 'Lead');

// Sign Up
rdt('track', 'SignUp');

// Search
rdt('track', 'Search', {
  products: [
    { name: 'modern planters' }
  ]
});

// Add to Wishlist
rdt('track', 'AddToWishlist', {
  value: 44.99,
  currency: 'USD'
});

Full list of standard events: PageVisit, ViewContent, Search, AddToCart, AddToWishlist, Purchase, Lead, SignUp, Custom.

Custom Events

For actions not covered by standard events:

rdt('track', 'Custom', {
  customEventName: 'quiz_completed',
  conversionId: 'cv_quiz_user123_1709510400'
});

Custom events can be used for audience creation and reporting. Configure them as conversion events in Reddit Ads Manager to use for optimization.


Event Matching (Advanced Matching)

Advanced Matching sends user identifiers alongside pixel events to improve match rates. Pass user data in the rdt('init') call:

rdt('init', 'YOUR_PIXEL_ID', {
  optOut: false,
  useDecimalCurrencyValues: true,
  email: 'user@example.com',    // auto-hashed to SHA-256
  externalId: 'customer_abc_123' // your internal user ID, auto-hashed
});
rdt('track', 'PageVisit');

For dynamic values available after page load (e.g., after login):

rdt('init', 'YOUR_PIXEL_ID', {
  email: 'user@example.com',
  externalId: 'customer_abc_123'
});
// Re-initialize with user data, then fire events
rdt('track', 'Purchase', {
  value: 89.99,
  currency: 'USD'
});

Reddit auto-hashes email and external ID with SHA-256 before transmission. Pass raw values; do not pre-hash.

Supported matching parameters:

  • email -- user email address
  • externalId -- your internal user/customer ID
  • idfa -- iOS Identifier for Advertisers (mobile web)
  • aaid -- Android Advertising ID (mobile web)

Server-Side Conversions API

The Reddit Conversions API sends event data from your server for improved tracking reliability.

Authentication

Generate OAuth2 credentials in Reddit Ads Manager > Events Manager > Conversions API. You receive a client_id and client_secret. Exchange them for an access token:

curl -X POST "https://www.reddit.com/api/v1/access_token" \
  -u "CLIENT_ID:CLIENT_SECRET" \
  -d "grant_type=client_credentials" \
  -H "User-Agent: YourApp/1.0"

Sending Events

curl -X POST "https://ads-api.reddit.com/api/v2.0/conversions/events/YOUR_ACCOUNT_ID" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "test_mode": false,
    "events": [
      {
        "event_at": "2025-03-04T00:00:00Z",
        "event_type": {
          "tracking_type": "Purchase"
        },
        "event_metadata": {
          "item_count": 2,
          "value_decimal": 89.99,
          "currency": "USD",
          "conversion_id": "cv_order_12345_1709510400",
          "products": [
            {
              "id": "SKU-001",
              "name": "Widget Pro",
              "category": "Widgets"
            }
          ]
        },
        "user": {
          "email": "a1c4db8a2e6...",
          "external_id": "f8b2c1d3e4...",
          "ip_address": "203.0.113.42",
          "user_agent": "Mozilla/5.0...",
          "screen_dimensions": {"width": 1920, "height": 1080},
          "click_id": "rdt_cid_value",
          "uuid": "rdt_uuid_cookie_value"
        }
      }
    ]
  }'

Hashing requirements: For the CAPI, email and external_id must be SHA-256 hashed before sending. Lowercase and trim whitespace from email before hashing. IP address and user agent are sent in plaintext.

Click ID (rdt_cid): Reddit appends a rdt_cid parameter to landing page URLs from ad clicks. Capture this value server-side and include it as click_id in CAPI events for attribution.

UUID cookie: Read the _rdt_uuid cookie from the user's browser and pass it to your server. Include it as uuid in the CAPI request to link server events to the browser session.

Deduplication with Browser Pixel

Generate a unique conversion_id on the client and send through both paths:

// Browser-side
var conversionId = 'cv_' + orderId + '_' + Date.now();
rdt('track', 'Purchase', {
  value: 89.99,
  currency: 'USD',
  conversionId: conversionId
});
// Send conversionId to your server for the CAPI call

In the CAPI request, use event_metadata.conversion_id with the same value.

Test Mode

Set "test_mode": true in the CAPI request body during development. Test events appear in Events Manager but do not affect campaign reporting or optimization.


Audience Building

Reddit builds audiences from pixel and CAPI data:

  • Website Custom Audiences: Target users who triggered specific pixel events (ViewContent, AddToCart, Purchase). Lookback window 1-180 days.
  • Customer List Audiences: Upload hashed email addresses for direct matching. Minimum 1,000 matched users.
  • Lookalike Audiences: Expand from a source audience (website, customer list, or engagement) to find similar Reddit users.
  • Engagement Audiences: Target users who previously interacted with your Reddit ads (viewed, clicked, or engaged with promoted posts).

Audience rules for retargeting:

  • Users who viewed content pages in the last 30 days but did not add to cart
  • Users who added to cart in the last 14 days but did not purchase
  • Past purchasers in the last 180 days (for exclusion or repeat targeting)

Create audiences in Reddit Ads Manager > Audiences > Create Audience.

Subreddit and interest targeting: Reddit's targeting also includes subreddit-level and interest-category targeting, which does not require the pixel. These are configured at the ad group level during campaign creation.


Common Issues

Pixel not loading: Verify the pixel ID in rdt('init'). Use the Reddit Pixel Helper Chrome extension to confirm the pixel fires. Check that redditstatic.com and alb.reddit.com are not blocked by consent management platforms or ad blockers.

Duplicate conversions: Missing or mismatched conversionId / conversion_id values cause double-counting when using both pixel and CAPI. Generate the ID client-side and pass it to both paths.

CAPI returns 401: The OAuth2 access token expires (typically within 1 hour). Implement token refresh logic using the client_credentials grant. Ensure the token has the ads_api scope.

No conversions attributed to campaigns: Check the attribution window in campaign settings. Default is 28-day click / 1-day view. Verify that rdt_cid is being captured from ad click URLs and passed to the CAPI. Without click_id or uuid, server-side events may not match.

Currency values doubled: If useDecimalCurrencyValues is set to false (or omitted), Reddit interprets values as cents. A value: 89.99 would be recorded as $0.90. Always set useDecimalCurrencyValues: true in rdt('init') when passing dollar amounts.

Low CAPI match rates: Include as many identifiers as possible: click_id (rdt_cid), uuid (_rdt_uuid cookie), hashed email, hashed external_id, IP address, and user agent. The click_id and uuid are the strongest matching signals.

Pixel events appearing in Events Manager but not in reports: Events Manager shows all received events. Campaign reports only show events attributed to ad interactions within the attribution window. An event can be tracked but not attributed if the user did not view or click an ad within the lookback period.


Platform-Specific Considerations

Reddit's upvote/downvote on promoted posts: Promoted posts receive real upvotes, downvotes, and comments from users. Negative engagement does not affect pixel tracking or conversion attribution, but it provides qualitative signal about creative resonance. Monitor comments on promoted posts for ad creative iteration.

Subreddit exclusions: Some subreddits are excluded from ad targeting by Reddit's policies (NSFW communities, certain sensitive topics). If your target audience overlaps with excluded subreddits, use interest-based targeting as an alternative.

Conversion API rate limits: The CAPI enforces rate limits per account. For high-volume implementations, batch events (up to 500 per request) and implement retry logic with exponential backoff for 429 responses.

Attribution model: Reddit uses a last-touch attribution model. If a user sees ads from multiple Reddit campaigns before converting, the conversion is attributed to the last ad interaction. View-through conversions are attributed only if the user did not click any Reddit ad before converting.

Data freshness: Reddit reports conversion data with up to a 24-hour delay. Events appear in Events Manager within minutes, but campaign-level reporting and optimization signals may lag. Do not rely on real-time reporting for same-day campaign decisions.

GDPR and consent: The Reddit Pixel supports a consent mechanism. Call rdt('init', pixelId, { optOut: true }) to load the pixel without tracking. When consent is granted, reinitialize with optOut: false. For the CAPI, only send events for users who have provided valid consent.

Testing: Use the Events Manager test tool in Reddit Ads Manager. Fire test events from your staging environment and verify they appear. For CAPI, use "test_mode": true to validate payloads without affecting production data.