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
- A Reddit Ads account and a Reddit Pixel (Events Manager). Copy the Pixel ID.
- 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.
- Optional: in Events Manager > Events Testing, copy a Test ID to send test events while you verify the set-up.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
pixel_id | string | Yes | Your Reddit Pixel ID, from Events Manager > Configure data source > Conversions API. It forms the request path. |
access_token | secret | Yes | A 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_id | string | No | Optional. 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_id | string | No | Not read by server-side delivery: the Conversions API is addressed by Pixel ID. Retained for existing integrations. |
Configure in Signal
- In the Management UI, go to Integrations > Integration Library and select Reddit Ads.
- Choose a preset, fill in the fields above and choose the pipelines and consent categories (advertising destinations default to marketing).
- 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_eventsAuthentication: 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 event | Reddit event |
|---|---|
page | PAGE_VISIT |
view_item_list | VIEW_CONTENT |
search | SEARCH |
view_search_results | SEARCH |
view_item | VIEW_CONTENT |
add_to_wishlist | ADD_TO_WISHLIST |
add_to_cart | ADD_TO_CART |
begin_checkout | CUSTOM (begin_checkout) |
purchase | PURCHASE |
sign_up | SIGN_UP |
generate_lead | LEAD |
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 event | Reddit event |
|---|---|
page | PAGE_VISIT |
vehicle_searched | SEARCH |
vehicle_viewed | VIEW_CONTENT |
vehicle_saved | ADD_TO_WISHLIST |
brochure_downloaded | CUSTOM (brochure_downloaded) |
finance_quote_requested | LEAD |
trade_in_valued | CUSTOM (trade_in_valued) |
test_drive_booked | LEAD |
dealer_contacted | LEAD |
generate_lead | LEAD |
vehicle_reserved | ADD_TO_CART |
purchase | PURCHASE |
service_appointment_booked | CUSTOM (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 event | Reddit event |
|---|---|
page | PAGE_VISIT |
view_item | VIEW_CONTENT |
search | SEARCH |
add_to_cart | ADD_TO_CART |
generate_lead | LEAD |
sign_up | SIGN_UP |
purchase | PURCHASE |
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 event | Reddit event |
|---|---|
page | PAGE_VISIT |
view_item | VIEW_CONTENT |
quote_started | CUSTOM (quote_started) |
get_quote | LEAD |
quote_requested | LEAD |
quote_completed | CUSTOM (quote_completed) |
generate_lead | LEAD |
lead_submitted | LEAD |
begin_checkout | CUSTOM (begin_checkout) |
purchase | PURCHASE |
policy_purchased | PURCHASE |
policy_renewed | CUSTOM (policy_renewed) |
sign_up | SIGN_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 event | Reddit event |
|---|---|
page | PAGE_VISIT |
plan_viewed | VIEW_CONTENT |
generate_lead | LEAD |
demo_requested | LEAD |
content_downloaded | LEAD |
sign_up | SIGN_UP |
trial_started | CUSTOM (trial_started) |
subscription_started | PURCHASE |
trial_converted | PURCHASE |
Identity and hashing
| Reddit field | Signal source | Treatment |
|---|---|---|
user.email | $traits.email | trim, lowercase, SHA-256 |
user.phone_number | $traits.phone | E.164, SHA-256 |
user.external_id | user_id | SHA-256 |
click_id | rdt_cid click ID | sent as captured |
user.uuid | _rdt_uuid cookie (gateway sync) | sent as captured |
user.ip_address, user.user_agent | visitor request | sent as captured |
user.screen_dimensions | context.screen | sent 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.
Deduplication and consent
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
+suffixto be removed from the local part of an email before hashing; Signal’snormalised_sha256trims 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_countis the number of order lines, not the unit total, until a SUM expression exists (#1389).
Troubleshooting
| Symptom | Cause | Resolution |
|---|---|---|
401 / 403 | Invalid, expired or under-privileged credential | Re-issue the credential described under Prerequisites and update the integration. |
400 | A field the vendor rejects | Open the event in the Delivery Log; the vendor’s message names the field. |
| Event dead-lettered with a required-field error | A 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 rate | Few identifiers | Call datafly.identify() with email and phone when you know them, and keep click-ID capture enabled. |
Vendor reference: https://ads-api.reddit.com/docs/v3/api/post-conversion-events.