Reddit Ads

Send conversion events to Reddit through the Reddit Conversions API v3 for campaign attribution, measurement and optimisation.

Why route Reddit Ads through Datafly Signal

  • Conversions survive ad blockers and tracking prevention. Signal sends the event from your own infrastructure, so the conversions Reddit optimises against are not filtered by the browser.
  • Identifiers are hashed before they leave your infrastructure. Signal normalises and applies SHA-256 inside your own deployment, so Reddit receives match keys, not raw personal data.
  • Click and cookie identifiers are captured first-party and replayed on later conversions, so attribution survives when the landing-page cookie has expired.
  • One consent decision governs every destination. Reddit is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
  • Presets for Retail, Automotive, Insurance and B2B / SaaS. The mapping starts from a working configuration for your vertical, and every field can be changed afterwards.

Prerequisites

  1. A Reddit Ads account and a Reddit Pixel (Events Manager). Copy the Pixel ID.
  2. In Events Manager choose Configure data source > Conversions API > Set up manually and select Generate Access Token. Copy the conversion access token; Reddit shows it once.
  3. Optional: in Events Manager > Events Testing, copy a Test ID to send test events while you verify the set-up.

Configuration

FieldTypeRequiredDescription
pixel_idstringYesYour Reddit Pixel ID, from Events Manager > Configure data source > Conversions API. It forms the request path.
access_tokensecretYesA conversion access token generated in Reddit Events Manager (Conversions API > Generate Access Token). Sent as the Bearer token. It is shown once; generate a new one if lost.
test_idstringNoOptional. The test ID from Events Manager > Events Testing. While set, events are sent as test events and are not recorded for attribution. Clear it for production.
account_idstringNoNot read by server-side delivery: the Conversions API is addressed by Pixel ID. Retained for existing integrations.

Configure in Signal

  1. In the Management UI, go to Integrations > Integration Library and select Reddit Ads.
  2. Choose a preset, fill in the fields above and choose the pipelines and consent categories (advertising destinations default to marketing).
  3. Click Install Integration.

Or with the Management API:

curl -X POST http://localhost:8084/v1/admin/integration-catalog/reddit/install \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name": "Reddit Ads", "variant": "default", "config": {"pixel_id": "a2_abc123def456", "access_token": "eyJhbGciOi..."}, "delivery_mode": "server_side"}'

API endpoint

POST https://ads-api.reddit.com/api/v3/pixels/{{pixel_id}}/conversion_events

Authentication: Authorization: Bearer <conversion access token>. Allow egress to ads-api.reddit.com from the network your delivery workers run on.

Presets and event mapping

Every preset sends only the fields it maps (the strict output contract is on). Events not listed are not sent.

Retail (ecommerce)

Full retail funnel on Reddit’s standard events: category and search result views, product views, wishlist, add to cart, checkout (custom), purchase with value, currency, item count, order ID and products.

Signal eventReddit event
pagePAGE_VISIT
view_item_listVIEW_CONTENT
searchSEARCH
view_search_resultsSEARCH
view_itemVIEW_CONTENT
add_to_wishlistADD_TO_WISHLIST
add_to_cartADD_TO_CART
begin_checkoutCUSTOM (begin_checkout)
purchasePURCHASE
sign_upSIGN_UP
generate_leadLEAD

Automotive (automotive)

Vehicle funnel for the Reddit Conversions API: vehicle search and views, saves, finance, test-drive and dealer leads, reservations, purchases, and custom events for brochures, trade-in valuations and service bookings.

Signal eventReddit event
pagePAGE_VISIT
vehicle_searchedSEARCH
vehicle_viewedVIEW_CONTENT
vehicle_savedADD_TO_WISHLIST
brochure_downloadedCUSTOM (brochure_downloaded)
finance_quote_requestedLEAD
trade_in_valuedCUSTOM (trade_in_valued)
test_drive_bookedLEAD
dealer_contactedLEAD
generate_leadLEAD
vehicle_reservedADD_TO_CART
purchasePURCHASE
service_appointment_bookedCUSTOM (service_appointment_booked)

Default (default)

Reddit Conversions API v3 core funnel: page visits, content views, search, add to cart, lead, sign-up and purchase, with hashed email and phone, the Reddit click ID, the _rdt_uuid cookie, IP and user agent as match keys and a conversion ID for Pixel deduplication.

Signal eventReddit event
pagePAGE_VISIT
view_itemVIEW_CONTENT
searchSEARCH
add_to_cartADD_TO_CART
generate_leadLEAD
sign_upSIGN_UP
purchasePURCHASE

Insurance (insurance)

Insurance quote and policy funnel: quote requests and leads as LEAD, policy purchase as PURCHASE with the policy number as conversion ID, and custom events for quote start, quote completion, checkout and renewal.

Signal eventReddit event
pagePAGE_VISIT
view_itemVIEW_CONTENT
quote_startedCUSTOM (quote_started)
get_quoteLEAD
quote_requestedLEAD
quote_completedCUSTOM (quote_completed)
generate_leadLEAD
lead_submittedLEAD
begin_checkoutCUSTOM (begin_checkout)
purchasePURCHASE
policy_purchasedPURCHASE
policy_renewedCUSTOM (policy_renewed)
sign_upSIGN_UP

B2B / SaaS (saas)

Lead and subscription funnel: plan views, leads, demo requests and content downloads as LEAD, sign-ups, trials (custom) and paid subscriptions as PURCHASE.

Signal eventReddit event
pagePAGE_VISIT
plan_viewedVIEW_CONTENT
generate_leadLEAD
demo_requestedLEAD
content_downloadedLEAD
sign_upSIGN_UP
trial_startedCUSTOM (trial_started)
subscription_startedPURCHASE
trial_convertedPURCHASE

Identity and hashing

Reddit fieldSignal sourceTreatment
user.email$traits.emailtrim, lowercase, SHA-256
user.phone_number$traits.phoneE.164, SHA-256
user.external_iduser_idSHA-256
click_idrdt_cid click IDsent as captured
user.uuid_rdt_uuid cookie (gateway sync)sent as captured
user.ip_address, user.user_agentvisitor requestsent as captured
user.screen_dimensionscontext.screensent as captured

Email, phone and names come from datafly.identify() traits (a legacy properties.email / properties.phone is read when no trait is set). Raw personal data is never sent.

metadata.conversion_id carries the Signal event ID, or the order ID on purchases, so Reddit can deduplicate against the Reddit Pixel (the Pixel must send the same ID). Events must reach Reddit within seven days, and within two days for deduplication.

Example: purchase (Default preset)

datafly.identify('crm-user-7', { email: 'jane.doe@example.com', phone: '07700 900123', first_name: 'Jane', last_name: 'Doe' });
datafly.track('purchase', {
  transaction_id: 'T_1001', value: 139.99, currency: 'GBP',
  items: [
    { item_id: 'SKU_1', item_name: 'Helmet', item_category: 'Motorbike', item_brand: 'Shoei', price: 120.00, quantity: 2 },
    { item_id: 'SKU_2', item_name: 'Gloves', price: 19.99, quantity: 1 }
  ]
});

Request Signal sends (rendered from the preset):

{
  "data": {
    "events": [
      {
        "action_source": "WEBSITE",
        "click_id": "rdtclick",
        "event_at": 1758500000123,
        "event_source_url": "https://shop.example.co.uk/p/123?utm_source=x",
        "metadata": {
          "conversion_id": "T_1001",
          "currency": "GBP",
          "item_count": 2,
          "order_id": "T_1001",
          "products": [
            {
              "category": "Motorbike",
              "id": "SKU_1",
              "item_price": 120,
              "name": "Helmet",
              "quantity": 2
            },
            {
              "id": "SKU_2",
              "item_price": 19.99,
              "name": "Gloves",
              "quantity": 1
            }
          ],
          "value": 139.99
        },
        "referrer_url": "https://www.google.com/",
        "type": {
          "tracking_type": "PURCHASE"
        },
        "user": {
          "email": "86e0b9e56c17cc4d12387e1949b85053fbe73bc3ce5a1188713a9d300cc6133d",
          "external_id": "a1a37b21e9d35da94d0ae0b42483e449206f1e24c3790d28c113fb5fb9045f93",
          "ip_address": "203.0.113.7",
          "phone_number": "a8acc3a90a7b4e4dc65e93db9240ed26523050ef754d63b75b5161de76781436",
          "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",
          "uuid": "1700000000.uuid-1"
        }
      }
    ]
  }
}

Known limitations

  • Reddit asks for dots and any +suffix to be removed from the local part of an email before hashing; Signal’s normalised_sha256 trims and lowercases only, so Gmail-style variants may not match (#784).
  • One event per request: the v3 envelope nests the event array under data, which the delivery engine cannot batch yet (#1388). Reddit allows 1,000 requests per second.
  • metadata.item_count is the number of order lines, not the unit total, until a SUM expression exists (#1389).

Troubleshooting

SymptomCauseResolution
401 / 403Invalid, expired or under-privileged credentialRe-issue the credential described under Prerequisites and update the integration.
400A field the vendor rejectsOpen the event in the Delivery Log; the vendor’s message names the field.
Event dead-lettered with a required-field errorA value the vendor requires is missing (for example currency and value on a purchase)Send the property in the track() call, or map it in the integration.
Low match rateFew identifiersCall datafly.identify() with email and phone when you know them, and keep click-ID capture enabled.