What this report contains
This is the deal-level answer to "what did that promotion actually do". Amazon returns it as a JSON document rather than a flat export, and the document holds two row grains at once: the promotion, with its own glance_views, units_sold and revenue; and the per-ASIN breakdown of those same three figures across the products the promotion included. This page documents both as two tables for that reason — the columns prefixed product_ are the second grain.
A promotion row carries its identity (promotion_id, promotion_name, type, status), its schedule (start_date_time, end_date_time) and its record history (created_date_time, last_updated_date_time) beside the three performance numbers. A product row carries only promotion_id, asin, product_name and the three product_ figures, so it means nothing without joining back to the promotion it belongs to.
Money is never converted: both grains ship their own currency column, revenue_currency_code and product_revenue_currency_code.
How to get it
Through the Selling Partner API, request the report type GET_PROMOTION_PERFORMANCE_REPORT for a marketplace with a start and end date, poll until Amazon returns a document id, then download it. What comes back is JSON, not the tab-separated text many other report types answer with, so a pipeline that assumes TSV fails on the first byte rather than on a column.
The trap is what the date range means. The window is matched against each promotion's start date, and it reaches forward as well as back: ask for a range and you get every promotion that starts in it, including deals scheduled for days that have not happened yet. A promotion that began before your window and ran all the way through it is simply absent. If the question is "what ran last month", the request window has to cover when those promotions started, not when they were live.
Who can request it. Amazon lists this report for sellers and vendors. A seller needs the Selling Partner Insights Selling Partner API role on the application making the request; a vendor needs the Brand Analytics role. Amazon's availability line attaches "who are also registered in Amazon's Brand Registry" to the vendor clause alone, so nothing published gates a seller on Brand Registry — which is why this page claims no entitlement beyond those API roles. Both are roles on the SP-API connection rather than anything switched on inside Seller Central. Amazon documents no console route to this report type at all — its reference covers only the API request, and notes the report can be requested but not scheduled — so no Seller Central path is stated here.
Where it exists is not published. Amazon's report-type reference names the roles and the seller type for this report and stops there — unlike its FBA entries, it carries no "Amazon store availability" line naming regions. An absent restriction is not an availability list, so this page records its marketplaces as not published rather than guessing a region set. The file behind it was a US pull, which says where the request was made, not where Amazon offers it.
Sample rows
Illustrative values, not data from a real account. Shown to give the shape of the file.
| promotion_id | promotion_name | glance_views | units_sold | revenue | revenue_currency_code | start_date_time | end_date_time |
|---|---|---|---|---|---|---|---|
| PROMO-EXAMPLE-01 | Example Promo A - Bottle | 12000 | 480 | 9600.00 | USD | 2026-03-02T08:00:00Z | 2026-03-02T16:00:00Z |
| PROMO-EXAMPLE-02 | Example Promo B - Yoga Mat | 8000 | 240 | 7200.00 | USD | 2026-03-05T00:00:00Z | 2026-03-12T00:00:00Z |
| PROMO-EXAMPLE-03 | Example Promo C - Desk Lamp | 0 | 0 | 0.00 | USD | 2026-04-01T07:00:00Z | 2026-04-03T07:00:00Z |
| PROMO-EXAMPLE-04 | Example Promo D - Grinder | 3000 | 150 | 5250.00 | USD | 2026-02-14T08:00:00Z | 2026-02-16T08:00:00Z |
| PROMO-EXAMPLE-05 | Example Promo E - Bottle UK | 2000 | 90 | 1800.00 | GBP | 2026-03-02T08:00:00Z | 2026-03-02T16:00:00Z |
Field reference
Main table
| Column | Type | Description |
|---|---|---|
promotion_id | string | Amazon's identifier for the promotion. It is also the only join key between the two row grains in this file: every product row repeats the promotion_id of the promotion it belongs to. |
promotions_api_mapping_id | string | A second identifier carried beside promotion_id. Amazon's schema defines it as the unique identifier that cross-references the promotion with the Selling Partner Promotions API, and marks it optional where promotion_id is required — in Amazon's own worked example the two are different shapes, a numeric id here and a UUID there. Treat promotion_id as the join key and this as the handle for reaching the promotion through the Promotions API. |
promotion_name | string | The name the promotion was given. Free text, and not unique — two deals on the same product in different months can carry the same name, which is why reporting keys on promotion_id. |
merchant_id | string | The selling account the promotion belongs to. Amazon's schema calls it the merchant customer ID associated with the promotion's funding agreement and marks it "For sellers only" — the vendor-side counterpart in the same schema is vendorCode, which is not one of the columns here. The file this page was measured against is a seller file, so what a vendor's pull carries in its place is not established. |
type | string | The kind of promotion. Amazon's schema declares the set as BEST_DEAL, DEAL_OF_THE_DAY, LIGHTNING_DEAL, PRICE_DISCOUNT, SALES_DISCOUNT, COUPON and PROMO_CODE, while the prose on the same reference says only Best Deal and Lightning Deal are supported for sellers (vendors also get Price Discount). The two disagree, and the measured evidence does not settle which values any one account's file actually contains — so parse against the full enum and read the live set off your own file. |
status | string | The promotion's state as of the pull, one of APPROVED, PENDING_APPROVAL, NEEDS_YOUR_ATTENTION or CANCELED per Amazon's schema. It matters more here than in most reports: because the window selects promotions whose start date falls in it, and reaches forward, a file mixes promotions that have finished, ones running now and ones that have not started — and the approval states are how you tell a booked deal from one that will never run. |
glance_views | int64 | Detail page views attributed to the promotion — Amazon calls these glance views. The per-ASIN breakdown of the same figure is product_glance_views. |
units_sold | int64 | Units sold under the promotion. The per-ASIN breakdown of the same figure is product_units_sold. |
revenue | decimal | Revenue attributed to the promotion, in the currency named by revenue_currency_code. Amazon's schema adds that for sellers this is the same figure as "sales" in the Seller Central UI. The per-ASIN breakdown of it is product_revenue. |
revenue_currency_code | string | The currency revenue is denominated in. Carried per row and never converted, so a total that ignores it adds pounds to dollars. |
start_date_time | timestamp_ms | When the promotion starts. This is the column the request window is matched against: a promotion is in the file because its start date falls in the requested range, not because it was running then. |
end_date_time | timestamp_ms | When the promotion ends. A row whose end is in the future is a promotion still running or still scheduled, and its performance figures are incomplete by definition. |
created_date_time | timestamp_ms | When the promotion record was created — when it was set up, not when it ran. |
last_updated_date_time | timestamp_ms | When the promotion record was last changed. Useful for spotting deals that were edited after they were scheduled. |
products
| Column | Type | Description |
|---|---|---|
promotion_id | string | On a product row, the promotion this ASIN's figures belong to. The join back to the promotion grain, and the reason the name appears twice in this reference — the file holds two tables. |
asin | string | The ASIN included in the promotion. One promotion can carry many; this row is one of them. |
product_name | string | The product title as Amazon rendered it for this ASIN in the promotion document. |
product_glance_views | int64 | Glance views attributed to this ASIN within the promotion — the per-ASIN share of the promotion's glance_views. |
product_units_sold | int64 | Units of this ASIN sold under the promotion — the per-ASIN share of the promotion's units_sold. |
product_revenue | decimal | Revenue attributed to this ASIN within the promotion, in the currency named by product_revenue_currency_code. Amazon describes it the same way as revenue — for sellers, "sales" in the Seller Central UI, at the ASIN level. |
product_revenue_currency_code | string | The currency product_revenue is denominated in. As on the promotion grain, it is carried per row and nothing is converted. |
Use cases
Measuring what a deal moved. glance_views, units_sold and revenue on one row give the traffic and the outcome for the promotion as a whole, which is the number people mean when they ask whether a deal was worth it.
Finding which ASIN carried the promotion. A multi-ASIN deal is rarely evenly used. Sorting the product grain by product_units_sold within one promotion_id usually shows one or two ASINs taking almost all of it, which is the argument for narrowing the next deal rather than widening it.
Auditing the deal calendar before it runs. Because the window reaches forward, a pull returns scheduled promotions with their start_date_time, end_date_time, type and status already populated. That is a review of what is booked, from the same file that later reports how it went.
Spotting promotions that were edited after scheduling. last_updated_date_time moving away from created_date_time marks deals someone changed after setting them up — worth checking against what was approved.
Building a promotion-to-ASIN map. The product grain is the only place the file says which ASINs a promotion actually included, which is what lets promotion activity be joined to ASIN-level sales and traffic reporting.
Limitations and gotchas
The window selects on start date, not on activity. This is the mistake that silently loses rows: a long-running promotion that started before the requested range does not appear in it, however much it sold during it.
Scheduled promotions are in the file with nothing to show. Deals that have not run yet come back alongside finished ones. Averaging units_sold across every row without filtering on status or start_date_time drags the average toward zero.
Two grains, one file — do not sum them together. revenue and product_revenue describe the same money at different levels of detail. Adding them, or joining product rows onto promotion rows and then summing the promotion column, double-counts.
Do not assume every promotion has product rows. The schemas were validated against a production US file holding 4,282 promotions and 7,390 included products — fewer than two ASINs per promotion on average. Join left from the promotion grain; the evidence does not establish that a promotion always brings at least one product row with it.
There is no date column on the metrics. Nothing in either grain says which day the glance views or units happened on. Amazon states the figures are cumulative for the promotion up until the day prior to the request, and that a promotion is only reported completely once it ended a day or more before you asked — so a running deal's numbers are promotion-to-date and one pull behind, not live. Every pull is therefore a snapshot of totals as they stood that day, not a period of data, which is what this page's cadence records. Getting a daily series out of this report means diffing successive pulls, not grouping a column.
Money is not converted. Both grains carry their own currency code per row, and a pull covering more than one marketplace mixes currencies in the same column.
Vendors: the funding columns Amazon documents are not in this list. Amazon's schema marks vendorCode, amountSpent, amountSpentCurrencyCode and fundingAgreementId on a promotion, and productAmountSpent on an included product, as vendor-only — and none of them appears among the columns above, which were measured on a seller file. Whether a vendor's own pull carries them is not something this page's evidence settles; check your own document before building on promotion spend.
FAQ
There are two kinds. One row per promotion carries that promotion's glance views, units sold and revenue. One row per ASIN within a promotion carries the same three figures for a single product, joined back by promotion id. Both levels carry their own currency code beside their revenue — whatever the marketplace uses — and nothing is converted, so any total has to group on that code.
Because the report selects promotions whose start date falls in the requested window. A promotion that started earlier and was still running through your range will not be returned. Widen the request to cover when it started.
Yes. The window reaches forward as well as back, so scheduled deals appear before they run, with their schedule populated and their performance figures not yet meaningful.
Not from a single file. Neither grain has a date column on the metrics, so the numbers are totals for the promotion rather than a daily series. A day-by-day view has to be built by comparing successive pulls.
They are described as the breakdown of the same three figures, but the measured evidence does not confirm that they reconcile exactly. Check one promotion against its products in your own file before relying on it.
Yes. Amazon lists it as available to both, through different API roles — Selling Partner Insights for sellers, Brand Analytics for vendors, with Brand Registry named on the vendor side. The columns documented here were measured on a seller file, and Amazon's schema marks several promotion-funding fields as vendor-only, so a vendor's document can carry fields this page does not list.
Sources
Every researched claim on this page, and the Amazon or Walmart page it came from.
- history_window — developer-docs.amazon.com/report-type-values-performance — the Promotions Performance Report entry states 'This report supports start dates up to two years before the current date.'
- history_window — developer-docs.amazon.com/report-type-values — 'The retention of generated reports varies by report type. If an explicit retention is not specified for a report type, then the report will be retained for 90 days.' The Promotions Performance entry specifies none, so the 90-day default applies to the generated document.
- latency — developer-docs.amazon.com/report-type-values-performance — 'Data for this report is updated on a daily basis, so some fields might not reflect the most up-to-date state of the promotion.'
- latency — developer-docs.amazon.com/report-type-values-performance — 'If a selected promotion is in progress when you request a report, the report will contain cumulative data for the promotion up until the day prior to your report request' and 'A report will contain complete information on a selected promotion if the promotion ended one day or more before the time you requested the report.'
- fields `type`, `status` — github.com/promotionReport.json — the `promotionReport` schema Amazon links as the **Schema** for this report type from developer-docs.amazon.com/report-type-values-performance. `type` enumerates BEST_DEAL, DEAL_OF_THE_DAY, LIGHTNING_DEAL, PRICE_DISCOUNT, SALES_DISCOUNT, COUPON, PROMO_CODE; `status` enumerates APPROVED, PENDING_APPROVAL, NEEDS_YOUR_ATTENTION, CANCELED.
- fields `type` — developer-docs.amazon.com/report-type-values-performance — the prose narrows the schema enum: 'Currently, three promotion types are supported for vendors (Best Deal, Lightning Deal, and Price Discount), and two promotion types are supported for sellers (Best Deal and Lightning Deal).' Recorded as the doc's own inconsistency with its schema, not as the file's contents.
- fields `promotions_api_mapping_id` — github.com/promotionReport.json — `promotionsApiMappingId` is described as 'Unique identifier to cross-reference promotions with the Selling Partner Promotions API' and is not in the object's required list.
- marketplaces — developer-docs.amazon.com/report-type-values-performance — the Promotions Performance Report entry gives only 'Availability: Sellers who have the Selling Partner Insights Selling Partner API role and vendors who have the Brand Analytics Selling Partner API role who are also registered in Amazon's Brand Registry.' and no 'Amazon store availability' line, while developer-docs.amazon.com/report-type-values-fba gives 'North America (NA)', 'Europe (EU)' and 'NA and Amazon IN stores' on other entries. Nothing published says where this report exists, so `marketplaces` records `not-published` rather than a store list.
- how-to-get-it — developer-docs.amazon.com/report-type-values-performance — Amazon's own name for the report type is 'Promotions Performance Report', with 'Requested/scheduled: This report can only be requested', 'Report output type: JSON', and required `reportOptions` of `promotionStartDateFrom` and `promotionStartDateTo`: 'All promotions with a start date-time that fall within the range of promotionStartDateFrom and promotionStartDateTo will be included.'
- upstream.report_type — developer-docs.amazon.com/report-type-values-performance — the Promotions Performance Report entry gives '**`reportType` Value**: `GET_PROMOTION_PERFORMANCE_REPORT`', the same report type this page names under "How to get it".
- conflict `marketplace_id` / `creationChannel` — github.com/promotionReport.json — `DetailsByPromotion.required` lists promotionId, promotionName, unitsSold, revenue, revenueCurrencyCode, startDateTime, endDateTime, type, status, creationChannel, marketplaceId, createdDateTime, lastUpdatedDateTime, includedProducts. Nothing changed on the page.
- seller_type — developer-docs.amazon.com/report-type-values — the Performance table lists GET_PROMOTION_PERFORMANCE_REPORT with Seller/Vendor availability 'Both'.
- seller_type — developer-docs.amazon.com/report-type-values-performance — the entry's `Role` line is 'Selling Partner Insights, Brand Analytics' and its `Availability` line is 'Sellers who have the Selling Partner Insights Selling Partner API role and vendors who have the Brand Analytics Selling Partner API role who are also registered in Amazon's Brand Registry.' The same entry describes the report as data 'to help sellers and vendors optimize their promotions', so the page is written for both and `seller_type` is `both`.
- requires — developer-docs.amazon.com/report-type-values-performance — the Availability line attaches 'who are also registered in Amazon's Brand Registry' to the vendor clause only, so nothing published gates a *seller* on Brand Registry and `requires` stays empty. The gates Amazon does name are the Selling Partner Insights and Brand Analytics Selling Partner API roles, which are application roles on an SP-API connection rather than seller entitlements, so they are stated in the body instead of in `requires`.
- cadence — developer-docs.amazon.com/report-type-values-performance — a promotion in progress comes back with 'cumulative data for the promotion up until the day prior to your report request', and the report carries no per-day metric column — the rows cover no requested period — so each pull is a point-in-time snapshot of promotion-to-date totals and `cadence` is `snapshot`. Amazon's 'Data for this report is updated on a daily basis' describes refresh, which this page records under `latency`.
- fields `merchant_id` — github.com/promotionReport.json — `merchantId` is 'The merchant customer ID associated with the promotion funding agreement. For sellers only.', and its vendor-side counterpart `vendorCode` is 'The vendor code associated with the promotion funding agreement. For vendors only.'
- fields — vendor-only properties — github.com/promotionReport.json — `vendorCode`, `amountSpent`, `amountSpentCurrencyCode` and `fundingAgreementId` on a promotion, and `productAmountSpent` / `productAmountSpentCurrencyCode` on an included product, are each marked 'For vendors only.' None of them is among the 21 columns measured here, and the file they were measured against is a seller file. Column list untouched.
- fields `revenue`, `product_revenue` — github.com/promotionReport.json — 'The total revenue generated across all ASINs in the promotion. For sellers, this is equivalent to "sales" in the Seller Central UI.', and the same sentence on `productRevenue` at the ASIN level.
- how-to-get-it — sellercentral.amazon.com/G200453160 — checked again: Seller Central's 'Promotions Report' help article renders no article body without a login (the non-`/external/` form of the URL redirects to `/ap/signin`), and is a different report from GET_PROMOTION_PERFORMANCE_REPORT in any case. No Seller Central console path is stated on this page.