Skip to main content
GUIDE → CRITEO ADS CAPI

Send Criteo conversion events from TrackLayer with OAuth2, hashed identity, and purchase safe payloads.

Criteo server events are stricter than click id based ad platforms. There is no browser parameter to rescue weak identity capture later. The implementation has to get advertiser scope, event names, hashed identifiers, and transaction_data correct on the first pass.

§ 01

TLDR

What matters before you open the dashboard.

Criteo does not use a browser click id. Matching depends on identityLink style identifiers such as email_sha256 and durable first-party IDs.
TrackLayer authenticates with the OAuth2 client_credentials flow, caches the short lived access_token, then sends conversions to the 2023-07 endpoint.
The most common failures are wrong advertiser_id, bad hashing, and incomplete transaction_data on purchase events.
§ 02

Prerequisites

Have these pieces in place before requesting the first token.

01
A Criteo advertiser account with conversion API access and permission to generate credentials.
02
A client_id and client_secret that belong to the same advertiser you will post events into.
03
TrackLayer installed on the store with checkout identity capture enabled for email and first-party customer IDs.
04
A final event mapping for purchase, begin_checkout, add_to_cart, and lead before production traffic starts.
05
A test order flow so you can compare TrackLayer delivery logs against Criteo reporting before launch.
§ 03

Step By Step Setup

From OAuth2 credentials to a validated purchase request.

STEP 01

Request an OAuth2 token

Criteo uses the client_credentials flow. TrackLayer only needs client_id and client_secret, but both must belong to the advertiser scope that will receive the events.

POST https://api.criteo.com/oauth2/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_CLIENT_SECRET
STEP 02

Store the correct advertiser id

The conversions endpoint is advertiser scoped. Authentication can succeed while conversion writes still fail if the stored advertiser_id does not match the account context.

CRITEO_CLIENT_ID=YOUR_CLIENT_ID
CRITEO_CLIENT_SECRET=YOUR_CLIENT_SECRET
CRITEO_ADVERTISER_ID=1234567
STEP 03

Map canonical events to Criteo event names

Every event payload needs event_name and event_time. Keep purchase naming exact and align the string with the conversion event configured in the advertiser account.

{
  "event_name": "purchase",
  "event_time": "2026-04-24T13:14:58Z",
  "identifiers": {
    "email_sha256": "4a7d1ed414474e4033ac29ccb8653d9b2f4b1a6f6d8d1df9bca7eac191f85632"
  }
}
STEP 04

Send hashed identifiers and first-party IDs

There is no gclid or fbclid equivalent here. TrackLayer should normalize email to lowercase, trim whitespace, hash with SHA-256, and include customer_id or madid when available. Do not send raw email.

{
  "identifiers": {
    "email_sha256": "4a7d1ed414474e4033ac29ccb8653d9b2f4b1a6f6d8d1df9bca7eac191f85632",
    "customer_id": "cust_78421",
    "madid": "AEBE52E7-03EE-455A-B3C4-E57283966239"
  }
}
STEP 05

Attach transaction_data on purchase

Purchase events should carry order id, currency, value, and item lines. Missing transaction_data is one of the fastest ways to trigger a validation rejection.

POST https://api.criteo.com/2023-07/conversions
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json

{
  "data": [
    {
      "type": "Conversion",
      "attributes": {
        "advertiser_id": 1234567,
        "event_name": "purchase",
        "event_time": "2026-04-24T13:14:58Z",
        "identifiers": {
          "email_sha256": "4a7d1ed414474e4033ac29ccb8653d9b2f4b1a6f6d8d1df9bca7eac191f85632",
          "customer_id": "cust_78421"
        },
        "transaction_data": {
          "id": "PS-10428",
          "currency": "EUR",
          "value": 149.90,
          "item": [
            { "id": "SKU-BLK-42", "price": 79.95, "quantity": 1 },
            { "id": "SKU-GRN-11", "price": 69.95, "quantity": 1 }
          ]
        }
      }
    }
  ]
}
STEP 06

Validate in the TrackLayer dashboard

Run a controlled checkout, open the event log, and verify token acquisition, advertiser_id, hash coverage, payload shape, and the exact Criteo response before launch.

Testing flow
1. Place a test order with a real email address
2. Open TrackLayer -> Event Log -> purchase
3. Verify token refresh, identifiers, and API status
4. Compare order id, value, and currency with Criteo
§ 04

Testing Approach

Use TrackLayer first, then validate against Criteo reporting.

TrackLayer dashboard checks

  • Confirm the event log shows a fresh OAuth token exchange.
  • Inspect advertiser_id, event_name, event_time, and response code.
  • Open the payload viewer and verify email_sha256 and any first-party IDs.
  • For purchase, compare order id, revenue, currency, and item lines.

Acceptance criteria

  • Token request succeeds without manual retries.
  • Criteo accepts the payload with a success response.
  • Hash fields are present and never sent raw.
  • Event numbers in TrackLayer match the expected test orders.
§ 05

Troubleshooting

The rejection patterns that show up most often on Criteo launches.

ISSUE

401 or 403 on token exchange or conversion write

Recheck client_id, client_secret, and advertiser scope. Also confirm TrackLayer is refreshing short lived tokens instead of replaying an expired bearer token.

ISSUE

TrackLayer sends the event but Criteo rejects it

Start with event_name, advertiser_id, and schema shape. Rejections usually come from identifiers under the wrong object or missing transaction_data keys.

ISSUE

Low match quality or missing attributed conversions

Verify lowercase normalization, whitespace trimming, and SHA-256 hashing. Raw email values or inconsistent normalization will break matching.

ISSUE

Purchase is accepted without full revenue detail

Inspect transaction_data in the dashboard. Value must be numeric, currency must be present, and each item line should include id, quantity, and price.

§ 06

Launch Checklist

Use this before sending production volume.

[ ] client_id stored in TrackLayer
[ ] client_secret stored in TrackLayer
[ ] advertiser_id verified against the Criteo account
[ ] purchase event_name mapped exactly
[ ] email normalized and hashed with SHA-256
[ ] customer_id or madid attached when available
[ ] transaction_data includes order id, currency, value, and item lines
[ ] a test purchase shows a successful Criteo API response in the dashboard

We use essential cookies to keep the site secure and functional. Analytics and third-party tags run only with your consent. See our Cookie Policy.

We use essential cookies to keep the site secure and functional. Analytics and third-party tags run only with your consent. See our Cookie Policy.