pixellint

Blog · Amazon Events API

Amazon Ads Events API Is Not Meta CAPI With a New Host

Teams that already ship Meta Conversions API often point the same worker at Amazon DSP measurement and expect a host swap. Amazon Ads Events API v1 expects uppercase conversionType and eventSource values, an eventData array, and match keys that do not mirror Graph event_name or action_source.

Implementation guides for Amazon Ads Events API document that conversion_type and event_source are required, case-sensitive, and uppercase. Values such as purchase or Offline are rejected. Rows with missing or unrecognized enums are not sent and are reported as failed. That sentence is the opposite of Meta, where Purchase and website are conventional strings inside data[].

The failure mode is silent on the worker side: HTTP 200 from a gateway that only checks JSON parse, while Amazon never attributes OFF_AMAZON_PURCHASES because the body still carries event_name Purchase and action_source web from the Meta mapper.

What Meta-shaped workers actually send

Meta CAPI posts to graph.facebook.com with data[] objects. Each object carries event_name, event_time in Unix seconds, action_source, user.em with SHA-256 email, and custom_data for value and currency. Hybrid stacks reuse the same struct for every vendor because the data team normalized on that envelope two years ago.

Amazon Events API v1 posts to advertising-api.amazon.com with eventData[] entries. Connector documentation lists conversion types ADD_TO_SHOPPING_CART, APPLICATION, CHECKOUT, CONTACT, LEAD, OFF_AMAZON_PURCHASES, MOBILE_APP_FIRST_START, PAGE_VIEW, SEARCH, SIGN_UP, SUBSCRIBE, and OTHER. Event sources are ANDROID, FIRE_TV, IOS, OFFLINE, WEBSITE, and MEASUREMENT_PARTNER.

There is no one-to-one map from Meta event_name Purchase to Amazon without an explicit translation table. Off-site retail purchases map to OFF_AMAZON_PURCHASES, not Purchase. Website origin maps to eventSource WEBSITE, not action_source web copied into the wrong field name.

Clock fields differ by vendor too. Meta event_time is seconds. Amazon expects event_time or timestamp fields documented per integration path, and mismatched clocks still look like valid hashes in logs while the event lands outside the attribution window.

Agencies that onboarded Amazon DSP after Meta Advantage+ shopping often inherit a single Lambda or Cloud Function named capi-forwarder. The name encodes the assumption. Amazon Events API is not a forwarder target for Graph JSON any more than Reddit v3 or Snap v3 is. The retail team sees spend in Amazon Ads while the engineering backlog still lists one multi-tenant emitter.

What Amazon counts as a valid event

Amperity documents required columns for Amazon Events API feeds: event_name, conversion_type, event_source, event_time, and country_code, plus at least one identifier column such as email, phone, maid, or match_id. Optional columns cover value, currency, and units sold when conversion_type is OFF_AMAZON_PURCHASES.

The conversion_type and event_source pair is gating. They must exactly match supported uppercase enums. Missing match keys fail the row even when marketing copied a perfect Meta user object into the payload.

Tealium separates Conversion Type and Conversion Source parameters on the Amazon Ads Events connector, mirroring Amazon Ads Events API v1. Automatic deduplication against the browser tag requires aligning clientDedupeId with the tag event id, another field name Meta-trained engineers miss when they reuse event_id from Graph.

Country code is ISO territory on Amazon rows. Meta campaigns sometimes omit country when action_source is web. Amazon rejects or drops those rows in batch exporters while the Meta pipe still looks healthy.

Where production pipelines diverge

Hosted checkout is the first fracture. Meta action_source web describes channel. Amazon eventSource WEBSITE describes where the event originated in Amazon taxonomy. OFFLINE is for true offline sources such as stores and call centers, not a synonym for server-side POST.

Retail brands optimize DSP on OFF_AMAZON_PURCHASES with unitsSold on purchase rows. Meta Purchase events carry contents and value in custom_data with different nesting. A mapper that copies custom_data.currency into Amazon without currencyCode on the event root fails schema checks on strict validators.

MMP and CDP connectors sometimes emit event_name for internal analytics while Amazon expects conversionType at the API boundary. The warehouse records a purchase. Amazon receives event_name Purchase inside a child object and never maps it to OFF_AMAZON_PURCHASES.

Multi-vendor workers gated only on em SHA-256 hex are the worst case. Email hash validates on both vendors. Meta accepts action_source app. Amazon rejects event_source MOBILE because the supported enum is IOS or ANDROID with separate handling for FIRE_TV.

Meta CAPI shape that must not be forwarded verbatim

Graph envelope. Amazon Events API uses conversionType OFF_AMAZON_PURCHASES and eventSource WEBSITE, not these keys.

POST https://graph.facebook.com/v21.0/PIXEL_ID/events
{
  "data": [{
    "event_name": "Purchase",
    "event_time": 1758556800,
    "action_source": "website",
    "user": { "em": ["64ec88ca..."] },
    "custom_data": { "value": 79.99, "currency": "USD" }
  }]
}

If your Amazon branch is a string replace on the host, you still POST Graph field names. Amazon validators and partner ETL docs expect conversionType and eventSource at the event level inside eventData.

Dedup differs as well. Meta uses event_name plus event_id. Amazon clientDedupeId must align with tag-fired ids when you run hybrid Amazon Attribution plus server events. Reusing Meta event_id without mapping to clientDedupeId duplicates or drops conversions depending on connector settings.

Do not assume a 200 from an intermediary means Amazon counted the row. Batch exporters report failed rows when enums are wrong, but real-time proxies may log success on accept and never surface Amazon-side rejection.

Amazon Events API row shape after translation

Illustrative envelope aligned to Events API v1 enums documented in Amazon connector guides.

POST https://advertising-api.amazon.com/events/v1/conversions
{
  "eventData": [{
    "name": "order_completed",
    "conversionType": "OFF_AMAZON_PURCHASES",
    "eventSource": "WEBSITE",
    "countryCode": "US",
    "timestamp": "2026-09-22T12:00:00Z",
    "clientDedupeId": "evt-20260922-001",
    "value": 79.99,
    "currencyCode": "USD",
    "unitsSold": 1,
    "matchKeys": [
      { "type": "EMAIL", "values": ["64ec88ca..."] }
    ]
  }]
}

Why translation belongs in the worker, not the UI toggle

Server-side connectors expose dropdowns for conversion type and source because Amazon enums are not discoverable from Meta event catalogs. That UI is not a substitute for mapping logic in the worker that consumes your order stream.

When Tealium automatic deduplication is enabled, conversion type on the connector must match the tag-fired type. A Meta mapper emitting Purchase strings never aligns with OFF_AMAZON_PURCHASES unless you add an explicit branch per vendor.

Amazon DSP optimization on off-Amazon purchases is the business reason the dialect matters. Media teams bid on ROAS computed from OFF_AMAZON_PURCHASES rows. Feeding Meta Purchase strings into the wrong API surface starves the model while dashboards that only monitor Meta still look funded.

Treat Amazon as a second schema with its own tests, not as a failover URL for Graph payloads.

Checklist before you reuse a Meta CAPI worker for Amazon

conversion_type and event_source are required and must exactly match one of the values below. The values are case-sensitive and uppercase, so purchase or Offline are rejected.

Amperity Amazon Ads Events API guide

What to do before you trust shared CAPI code

Run one known order through a dedicated Amazon mapper with OFF_AMAZON_PURCHASES, WEBSITE, countryCode, and a single EMAIL match key. Compare Amazon Ads reporting to Meta Events Manager on the same order id. Investigate enum translation first, not match quality tuning.

If the worker logs Graph field names on the Amazon branch, split the modules. Shared hashing utilities are fine. Shared event envelopes are not.

Pixellint is not affiliated with Amazon or Meta. Passing validation on a translated JSON artifact means the shape matches published connector documentation. It does not mean Amazon attributed the conversion or that the DSP bid model updated.

The durable fix is explicit dialect documentation in your collector repo, next to the Meta pack your team already maintains.

When Amazon reporting stays flat after a Meta migration win, pull failed-row exports from the CDP or connector before you rehash emails. Enum mismatches show up as conversion_type or event_source errors in batch logs long before match rate dashboards move. Fixing translation there is cheaper than opening a match-quality ticket with the wrong payload attached.

Sources

Contract pages

The dated argument is above. These pages are the field lists.

Read the conversion API field guide Docs