Amazon DSP
Import server-side conversions against Amazon DSP conversion definitions (conversion import, Conversions API v1). For new set-ups Amazon recommends the Events API: see the Amazon Ads integration.
Why route Amazon DSP through Datafly Signal
- Conversions survive ad blockers and tracking prevention. Signal sends the event from your own infrastructure, so the conversions Amazon DSP 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 Amazon DSP receives match keys, not raw personal data.
- One consent decision governs every destination. Amazon DSP is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
- Presets for Retail and Insurance. The mapping starts from a working configuration for your vertical, and every field can be changed afterwards.
Prerequisites
- An Amazon Ads API application (Login with Amazon). Copy its Client ID and Client Secret, and keep a refresh token for a user with the
event_manager_editpermission on the DSP advertiser. - Copy the DSP Advertiser ID (not the entity ID) and pick the API host for its region.
- Create the conversion definitions (source
SERVER_TO_SERVER) in Amazon DSP and copy their IDs: one default, and optionally one per event type.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
advertiser_id | string | Yes | Your Amazon DSP advertiser ID (not the DSP entity ID). It forms the request path and is sent as the Amazon-Ads-AccountId header. |
client_id | string | Yes | The Login with Amazon client ID of your Amazon Ads API application. Sent as the Amazon-Advertising-API-ClientId header. |
client_secret | secret | Yes | The Login with Amazon client secret, used to exchange the refresh token for an access token. |
refresh_token | secret | Yes | A long-lived Login with Amazon refresh token for a user with the event_manager_edit permission on the DSP advertiser. |
api_host | select | Yes | The regional Amazon Ads API host for the marketplace your advertiser belongs to. |
configuration_id | string | Yes | The DSP conversion definition (source SERVER_TO_SERVER) events are imported against when their type has no definition of its own below. |
conversion_definition_id_page_view | string | No | Optional. The DSP conversion definition for Page View events. |
conversion_definition_id_search | string | No | Optional. The DSP conversion definition for Search events. |
conversion_definition_id_add_to_cart | string | No | Optional. The DSP conversion definition for Add to Cart events. |
conversion_definition_id_checkout | string | No | Optional. The DSP conversion definition for Checkout events. |
conversion_definition_id_purchase | string | No | Optional. The DSP conversion definition for Purchase events. |
conversion_definition_id_lead | string | No | Optional. The DSP conversion definition for Lead events. |
conversion_definition_id_sign_up | string | No | Optional. The DSP conversion definition for Sign Up events. |
conversion_definition_id_application | string | No | Optional. The DSP conversion definition for Application events. |
default_country_code | string | No | ISO 3166-1 alpha-2 country sent when the event has no geo country. Amazon rejects an event without a country code. |
profile_id | string | No | Not read: the import is addressed by advertiser ID. Retained for existing integrations. |
access_token | secret | No | Not read: delivery mints a short-lived access token from the refresh token. Retained for existing integrations. |
marketplace | string | No | Informational. The host events are sent to is set by the API Host field. |
Configure in Signal
- In the Management UI, go to Integrations > Integration Library and select Amazon DSP.
- 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/amazon_dsp/install \
-H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
-d '{"name": "Amazon DSP", "variant": "default", "config": {"advertiser_id": "1234567890123", "client_id": "amzn1.application-oa2-client.abc123...", "client_secret": "...", "refresh_token": "Atzr|...", "api_host": "advertising-api.amazon.com", "configuration_id": "1234567890123"}, "delivery_mode": "server_side"}'API endpoint
POST https://{{api_host}}/accounts/{{advertiser_id}}/dsp/conversionDefinitions/eventDataAuthentication: Login with Amazon Bearer token (refreshed from the refresh token), Amazon-Advertising-API-ClientId and Amazon-Ads-AccountId headers. Allow egress to your region's Amazon Ads API host 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)
Retail events imported against Amazon DSP conversion definitions: page and product views, search, add to cart, checkout and purchases with value, currency and the order ID as clientDedupeId.
| Signal event | Amazon DSP event |
|---|---|
page | definition for page_view |
search | definition for search |
view_item | definition for page_view |
add_to_cart | definition for add_to_cart |
begin_checkout | definition for checkout |
purchase | definition for purchase |
sign_up | definition for sign_up |
generate_lead | definition for lead |
Default (default)
Amazon DSP conversion import core events (page views, search, add to cart, checkout, leads, sign-ups and purchases), each sent to the conversion definition configured for its type, with hashed email, phone and name match keys and the country code.
| Signal event | Amazon DSP event |
|---|---|
page | definition for page_view |
search | definition for search |
add_to_cart | definition for add_to_cart |
begin_checkout | definition for checkout |
generate_lead | definition for lead |
sign_up | definition for sign_up |
purchase | definition for purchase |
Insurance (insurance)
Insurance funnel: quote requests and leads, applications and policy purchases, each against its own conversion definition, with premium value and the policy number as clientDedupeId.
| Signal event | Amazon DSP event |
|---|---|
page | definition for page_view |
get_quote | definition for lead |
quote_requested | definition for lead |
generate_lead | definition for lead |
begin_checkout | definition for application |
purchase | definition for purchase |
policy_purchased | definition for purchase |
sign_up | definition for sign_up |
Identity and hashing
| Amazon DSP field | Signal source | Treatment |
|---|---|---|
matchKeys[] EMAIL | $traits.email | trim, lowercase, SHA-256 |
matchKeys[] PHONE | $traits.phone | digits with country code, SHA-256 |
matchKeys[] FIRST_NAME, LAST_NAME | $traits.first_name, last_name | trim, lowercase, SHA-256 |
matchKeys[] MAID | device advertising ID (apps) | lowercase, not hashed |
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.
The conversion import needs at least one match key per event, so an event with no email, phone, name or device advertising ID (an anonymous visitor) is not sent.
Deduplication and consent
clientDedupeId carries the Signal event ID, or the order ID on purchases; Amazon keeps the first record per ID across the Ad Tag, this API and MMPs. countryCode is required.
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):
{
"eventData": [
{
"clientDedupeId": "T_1001",
"conversionDefinitionId": "CD-PURCH",
"countryCode": "GB",
"currencyCode": "GBP",
"matchKeys": [
{
"type": "EMAIL",
"values": [
"86e0b9e56c17cc4d12387e1949b85053fbe73bc3ce5a1188713a9d300cc6133d"
]
},
{
"type": "PHONE",
"values": [
"033134b911b137918338415ee3d20a064b24773d36a3b02e8b99fdd3fcd6b4cd"
]
},
{
"type": "FIRST_NAME",
"values": [
"81f8f6dde88365f3928796ec7aa53f72820b06db8664f5fe76a7eb13e24546a2"
]
},
{
"type": "LAST_NAME",
"values": [
"799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f"
]
}
],
"name": "purchase",
"timestamp": "2025-09-22T00:13:20.123Z",
"value": 139.99
}
],
"source": "SERVER_TO_SERVER"
}Known limitations
unitsSoldis not set (Amazon defaults it to 1) (#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://advertising.amazon.com/API/docs/en-us/dsp-conversion-builder.