IntegrationsAdvertisingAmazon DSP Events

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

  1. 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_edit permission on the DSP advertiser.
  2. Copy the DSP Advertiser ID (not the entity ID) and pick the API host for its region.
  3. Create the conversion definitions (source SERVER_TO_SERVER) in Amazon DSP and copy their IDs: one default, and optionally one per event type.

Configuration

FieldTypeRequiredDescription
advertiser_idstringYesYour Amazon DSP advertiser ID (not the DSP entity ID). It forms the request path and is sent as the Amazon-Ads-AccountId header.
client_idstringYesThe Login with Amazon client ID of your Amazon Ads API application. Sent as the Amazon-Advertising-API-ClientId header.
client_secretsecretYesThe Login with Amazon client secret, used to exchange the refresh token for an access token.
refresh_tokensecretYesA long-lived Login with Amazon refresh token for a user with the event_manager_edit permission on the DSP advertiser.
api_hostselectYesThe regional Amazon Ads API host for the marketplace your advertiser belongs to.
configuration_idstringYesThe 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_viewstringNoOptional. The DSP conversion definition for Page View events.
conversion_definition_id_searchstringNoOptional. The DSP conversion definition for Search events.
conversion_definition_id_add_to_cartstringNoOptional. The DSP conversion definition for Add to Cart events.
conversion_definition_id_checkoutstringNoOptional. The DSP conversion definition for Checkout events.
conversion_definition_id_purchasestringNoOptional. The DSP conversion definition for Purchase events.
conversion_definition_id_leadstringNoOptional. The DSP conversion definition for Lead events.
conversion_definition_id_sign_upstringNoOptional. The DSP conversion definition for Sign Up events.
conversion_definition_id_applicationstringNoOptional. The DSP conversion definition for Application events.
default_country_codestringNoISO 3166-1 alpha-2 country sent when the event has no geo country. Amazon rejects an event without a country code.
profile_idstringNoNot read: the import is addressed by advertiser ID. Retained for existing integrations.
access_tokensecretNoNot read: delivery mints a short-lived access token from the refresh token. Retained for existing integrations.
marketplacestringNoInformational. The host events are sent to is set by the API Host field.

Configure in Signal

  1. In the Management UI, go to Integrations > Integration Library and select Amazon DSP.
  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/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/eventData

Authentication: 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 eventAmazon DSP event
pagedefinition for page_view
searchdefinition for search
view_itemdefinition for page_view
add_to_cartdefinition for add_to_cart
begin_checkoutdefinition for checkout
purchasedefinition for purchase
sign_updefinition for sign_up
generate_leaddefinition 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 eventAmazon DSP event
pagedefinition for page_view
searchdefinition for search
add_to_cartdefinition for add_to_cart
begin_checkoutdefinition for checkout
generate_leaddefinition for lead
sign_updefinition for sign_up
purchasedefinition 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 eventAmazon DSP event
pagedefinition for page_view
get_quotedefinition for lead
quote_requesteddefinition for lead
generate_leaddefinition for lead
begin_checkoutdefinition for application
purchasedefinition for purchase
policy_purchaseddefinition for purchase
sign_updefinition for sign_up

Identity and hashing

Amazon DSP fieldSignal sourceTreatment
matchKeys[] EMAIL$traits.emailtrim, lowercase, SHA-256
matchKeys[] PHONE$traits.phonedigits with country code, SHA-256
matchKeys[] FIRST_NAME, LAST_NAME$traits.first_name, last_nametrim, lowercase, SHA-256
matchKeys[] MAIDdevice 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.

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

  • unitsSold is not set (Amazon defaults it to 1) (#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.