What this report contains
This is the seller-side answer to "what did that coupon actually do". Amazon returns it as a JSON document rather than a flat export, and the seller document holds two row grains at once: a flat list of coupons, each with its clips, redemptions, budget figures and sales; and, under each coupon, the ASINs it applies to. They land as two tables for that reason, and this page documents both.
A coupon row carries its identity (coupon_id, name, website_message, merchant_id), its schedule (start_date_time, end_date_time), its configuration (discount_type, discount_amount) and then the four things people actually open the file for: clips and redemptions on the demand side, budget, budget_spent, budget_remaining and budget_percentage_used on the cost side, and sales with total_discount on the outcome side.
An ASIN row carries only coupon_id and asin. That is the whole grain — there is no per-ASIN breakdown of clips, redemptions or sales here, which is the single most common expectation this report disappoints.
Money is never converted: currency_code rides on the coupon row, and every money column on that row takes its unit from it.
Both tables also carry context columns that Amazon's document does not — marketplace_id, country_code and snapshot_date, and on the ASIN table a currency_code as well. They are added when the document is stored rather than returned in it, so the column reference does not describe them.
How to get it
Through the Selling Partner API, request the report type GET_COUPON_PERFORMANCE_REPORT for a marketplace with a start and end time, poll until Amazon returns a document id, then download it. What comes back is JSON, not the tab-separated text most Seller Central report types answer with, so a pipeline that assumes TSV fails on the first byte rather than on a column.
Two traps sit in that one request. The first is that Amazon uses this single report type for both sellers and vendors and answers each with a different schema: a seller account gets the flat coupons[] list described here, while a vendor account gets campaigns[] with coupons nested inside them. Code written against one shape does not read the other, and nothing in the request says which you will get — your account type does.
The second is what the date range means. Coupons are selected by when their campaign started, so you get every coupon that starts in the window, not every coupon that was running during it. A coupon that began before your range and ran all the way through it is simply absent. If the question is "what ran last month", the window has to cover when those coupons started.
Amazon's report-type reference gives the entry an Availability of "Sellers" and a Role of Brand Analytics — an application-level SP-API role, not a seller entitlement — and says the report can only be requested, never scheduled. What the entry does not give is a store list. The "Amazon store availability" line that other report types carry is simply absent here, so which marketplaces offer this report is not something Amazon publishes, and this page does not guess.
Sample rows
Illustrative values, not data from a real account. Shown to give the shape of the file.
| coupon_id | name | start_date_time | end_date_time | clips | redemptions | budget | budget_spent | sales | currency_code |
|---|---|---|---|---|---|---|---|---|---|
| EXAMPLE-COUPON-01 | 15% off Example Stainless Bottle | 2026-09-01T00:00:00Z | 2026-09-14T23:59:59Z | 4200 | 318 | 1000.00 | 769.00 | 5120.00 | USD |
| EXAMPLE-COUPON-02 | $5 off Example Trail Mix | 2026-09-05T00:00:00Z | 2026-09-19T23:59:59Z | 1850 | 96 | 500.00 | 480.00 | 1245.00 | USD |
| EXAMPLE-COUPON-03 | 10% off Example Desk Lamp | 2026-09-10T00:00:00Z | 2026-09-24T23:59:59Z | 760 | 41 | 300.00 | 91.00 | 910.00 | USD |
| EXAMPLE-COUPON-04 | 20% off Example Yoga Mat | 2026-09-18T00:00:00Z | 2026-10-02T23:59:59Z | 120 | 0 | 250.00 | 0.00 | 0.00 | USD |
Field reference
Main table
| Column | Type | Description |
|---|---|---|
coupon_id | string | Amazon's identifier for the coupon, and the only join key between the two row grains in this file — every ASIN row repeats the coupon_id of the coupon it belongs to. |
promotions_api_mapping_id | string | A second identifier carried beside coupon_id, tying the coupon to its record in Amazon's Promotions API. The evidence does not establish when the two differ, so treat coupon_id as the join key and this as a cross-reference. |
merchant_id | string | The selling account the coupon belongs to. |
name | string | The name the coupon was given. Free text, not unique, and not necessarily what a shopper sees — the shopper-facing text is website_message. |
website_message | string | The shopper-facing message carried with the coupon. Amazon's schema calls it the message displayed with the coupon on the product page, so it is customer copy on the detail page rather than an internal label; whether it renders anywhere else, search results included, is not documented. |
start_date_time | timestamp_ms | When the coupon campaign starts. This is the column the request window is matched against — a coupon is in the file because it started in the requested range, not because it was running then. |
end_date_time | timestamp_ms | When the coupon campaign ends. A row whose end is in the future is a coupon still running or still scheduled, and every figure on it is incomplete by definition. |
discount_type | string | The kind of discount the coupon offers, which is what tells you how to read discount_amount. Amazon's schema enumerates two values — PERCENT_OFF_LIST_PRICE and AMOUNT_OFF_LIST_PRICE, a percentage or a fixed amount off the list price. That is the documented vocabulary rather than proof of what a file contains, so still read the set off your own. |
discount_amount | decimal | The discount the coupon is configured to give. It is a bare number whose unit depends on discount_type — Amazon's schema documents it as a percentage under PERCENT_OFF_LIST_PRICE and a currency value under AMOUNT_OFF_LIST_PRICE — so it cannot be summed or averaged across rows of different types. |
total_discount | decimal | The total amount customers saved across the coupon's redemptions, as opposed to the per-unit discount_amount. Amazon's schema keeps it distinct from budget_spent, which adds the clip and redemption fees the seller paid, so the two are different numbers and budget_spent is the larger — it, not this, is the coupon's cost. Both are gross values that include purchases later returned or cancelled. |
clips | int64 | How many times shoppers clipped the coupon. A clip is interest, not a purchase — the shopper has taken the coupon and may never use it, which is why this is usually much larger than redemptions. |
redemptions | int64 | How many times the coupon was actually used. This is the count that consumes budget and the one behind sales; the ratio of it to clips is the coupon's real conversion signal. |
budget | decimal | The budget configured for the coupon, in the currency named by currency_code. |
budget_spent | decimal | How much of budget the coupon has consumed as of this pull. Amazon's schema defines it as the total the seller spent on the coupon including clip and redemption fees, which makes it larger than total_discount, the amount customers saved. It is a gross value that includes purchases later returned or cancelled. |
budget_remaining | decimal | What is left of the budget — the same fact as budget_spent seen from the other end, so do not add the two together and do not add either to budget. |
budget_percentage_used | float64 | The share of the budget consumed, derived from budget_spent and budget. Amazon's schema names it a percentage and caps it at 100, and its worked example (0.4 against a budget_spent of 42.29 and a budget of 10000) is the 0-100 reading; but the same sentence defines it as budgetSpent divided by budget, which would be a 0-1 fraction. The document contradicts itself, so check one row against the two money columns before charting it. |
sales | decimal | Sales attributed to the coupon, in the currency named by currency_code. There is no date on it, so it is the coupon's running total as of the pull rather than a figure for a day. |
currency_code | string | The currency every money column on the row is denominated in. Carried per row and never converted, so a total that ignores it sums two different currencies as though they were one. |
asins
| Column | Type | Description |
|---|---|---|
coupon_id | string | The coupon this ASIN belongs to — the join back to the coupon table, and the only thing on this table that ties a product to any of the metrics. It repeats once per ASIN the coupon covers, so it is not unique here. |
asin | string | One ASIN the coupon applies to. One coupon can carry many, and this table is the only place the file says which products a coupon covered. It carries no metrics of its own — there is no per-ASIN clip, redemption or sales figure in this report. |
Use cases
Judging whether a coupon paid for itself. sales against budget_spent and total_discount on the same row is the whole argument, and it is one join away from nothing else — no other Amazon report puts a coupon's cost and its attributed revenue side by side.
Reading the clip-to-redemption gap. clips counts shoppers who took the coupon; redemptions counts those who used it. A coupon clipped thousands of times and redeemed rarely is a discount that got attention and still lost the sale, which is a price or listing problem rather than a promotion problem.
Catching a coupon about to run out of budget. budget_remaining near zero well before end_date_time means the coupon will not survive its own schedule. What Amazon does at that moment is not established, but the warning is in the file days ahead of anyone noticing the coupon stopped working.
Auditing the live coupon calendar. One pull gives every coupon whose campaign starts in the window with its schedule, discount configuration and shopper-facing website_message already populated — which is a review of what is booked, from the same file that later reports how it went.
Building a coupon-to-ASIN map. The ASIN grain is the only place this report says which products a coupon covered. Joined on coupon_id, it is what lets coupon activity be lined up against ASIN-level sales and traffic reporting — which is also the only way to get anything ASIN-level out of a coupon at all.
Limitations and gotchas
The window selects on campaign start, not on activity. This is the mistake that silently loses rows: a long-running coupon that started before the requested range does not appear in it, however much it redeemed during it.
The ASIN grain has no metrics. coupon_id and asin is the entire row. Anyone expecting the per-ASIN breakdown that the promotions performance report provides will not find one here, and a per-ASIN number built by dividing coupon sales across its ASINs is an invention, not a measurement.
There is no date column on the metrics. Nothing in either grain says which day the clips, redemptions or sales happened on, so the figures read as totals for the coupon so far: Amazon states that a coupon still in progress comes back with cumulative data up to the day before the request, and that a coupon which ended a day or more earlier comes back complete. A daily series means diffing successive pulls, not grouping a column.
Scheduled and still-running coupons are in the file with little to show. A coupon whose end_date_time is in the future has incomplete figures by definition, and averaging redemptions or budget_percentage_used across every row without filtering on the schedule drags the average toward zero.
The same report type answers vendors differently. A vendor account's document is campaigns[] with nested coupons, not the flat coupons[] documented here, so a parser shared between account types needs to branch on the shape it received.
discount_amount is not comparable across rows. Its unit depends on discount_type, so summing or averaging it across a file that mixes types produces a number that means nothing.
Do not assume every coupon brings ASIN rows. The schemas were validated against a production US file holding 3 seller coupons over 15 ASINs — a small file, which is also a reason to treat the column list as what that file contained. Join left from the coupon grain.
Money is not converted. Every money column takes its unit from currency_code on the same row, and a pull covering more than one marketplace mixes currencies in the same column.
FAQ
There are two kinds. One row per coupon carries its clips, redemptions, budget, budget spent and attributed sales. One row per ASIN within a coupon carries only the coupon id and the ASIN, joining back to the coupon it belongs to.
Clips count how many shoppers took the coupon; redemptions count how many actually used it. Clips are normally far higher, and the gap between the two is the most useful signal in the file.
Because the report selects coupons by when their campaign started. A coupon that started earlier and was still running through your range will not be returned. Widen the request to cover when it started.
No. The ASIN rows list which products the coupon applies to and nothing else. There is no per-ASIN clip, redemption, discount or sales figure anywhere in this report.
It is the same report type, GET_COUPON_PERFORMANCE_REPORT, but not the same file. Seller accounts receive a flat list of coupons; vendor accounts receive campaigns with coupons nested inside them. This page documents the third-party seller schema only.
Not from a single file. Neither grain has a date column on the metrics, so the numbers are totals for the coupon as of the pull. A day-by-day view has to be built by comparing successive pulls.
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 Seller Coupons Performance Report entry lists among its report behaviors "This report supports start dates up to two years before the current date." The same sentence opens the `sellerCouponReport` schema description.
- latency — developer-docs.amazon.com/report-type-values-performance — the same entry states "Data for this report is updated on a daily basis, so some fields might not reflect the most up-to-date state of the coupon", that "If a selected coupon is in progress when you request a report, the report will contain cumulative data for the coupon up until the day prior to your report request", and that a report "will contain complete information on a selected coupon if the coupon ended one day or more before the time you requested the report".
- marketplaces (not-published) — developer-docs.amazon.com/report-type-values-performance — the Seller Coupons Performance Report entry gives "Availability: Sellers" and "Role: Brand Analytics" and carries no "Amazon store availability" line. That line is how Amazon names regions where it publishes them: developer-docs.amazon.com/report-type-values-analytics gives each Brand Analytics report an "Amazon store availability" of "NA (all Amazon stores), EU (Spain, United Kingdom, France, Netherlands, Germany, Italy, Sweden, Turkey, Saudi Arabia, United Arab Emirates, India), FE (all Amazon stores)", and developer-docs.amazon.com/report-type-values-inventory gives two FBA reports "Spain, UK, France, Germany, and Italy Amazon stores". Its absence on the coupon entry is the finding: Amazon does not publish where this report exists, which is what `not-published` records.
- report_type — developer-docs.amazon.com/report-type-values-performance — the entry titled "Seller Coupons Performance Report" gives its `reportType` value as `GET_COUPON_PERFORMANCE_REPORT`, which is the name used throughout this page.
- how-to-get-it (availability, role, request-only) — developer-docs.amazon.com/report-type-values-performance — the same entry gives "Availability: Sellers", "Role: Brand Analytics", "Requested/scheduled: This report can only be requested" and "Report output type: JSON". The role is an application-level SP-API role, so it stays in the prose rather than in `requires`.
- grain (two row grains) — github.com/sellerCouponReport.json — every coupon in `coupons[]` carries its own `asins[]` array, and `AsinDetails` has the single property `asin` ("The asin of the product"). Amazon's document nests the ASIN level inside the coupon and gives it no metrics either, which is the split this page documents as two tables. The headline grain stays `coupon`.
- fields (promotions_api_mapping_id) — github.com/sellerCouponReport.json — Amazon's published `sellerCouponReport` schema, linked as **Schema** from the report-type reference, describes it as a "Unique identifier to cross-reference promotions with the Selling Partner Promotions API", which is what the description above already says.
- fields (promotions_api_mapping_id) — developer-docs.amazon.com/sp-api-release-notes — the August 26, 2026 entry adds the field to `GET_COUPON_PERFORMANCE_REPORT` so that "Sellers and vendors can use this field to cross-reference performance report data with promotions managed through the Promotions API", confirming it is a cross-reference rather than a second join key.
- fields (discount_type, discount_amount) — github.com/sellerCouponReport.json — `discountType` is an enum of `PERCENT_OFF_LIST_PRICE` and `AMOUNT_OFF_LIST_PRICE`, and `discountAmount` "Reflects a percentage when discountType is PERCENT_OFF_LIST_PRICE and a currency value when discountType is AMOUNT_OFF_LIST_PRICE".
- fields (total_discount, budget_spent, budget_remaining) — github.com/sellerCouponReport.json — `totalDiscount` is the "Total amount saved by customers redeeming the coupon", `budgetSpent` the "Total amount spent by the seller on the coupon, including clip fees and redemption fees", and `budgetRemaining` is "equal to budget minus budgetSpent". `redemptions`, `totalDiscount`, `budgetSpent`, `budgetRemaining` and `sales` each carry the sentence "Represents a gross value, including purchases that were returned or cancelled"; `clips` does not — it is the "Number of times the coupon has been applied on the product page by unique customers".
- fields (budget_percentage_used) — github.com/sellerCouponReport.json — "Percentage of the allocated budget that has been spent, equal to the budgetSpent divided by budget", with `minimum: 0`, `maximum: 100` and the example 0.4 alongside budgetSpent 42.29 and budget 10000. The cap and the example say 0-100; the wording says a quotient.
- fields (website_message) — github.com/sellerCouponReport.json — `websiteMessage` is "The message displayed with the coupon on the product page".
- fields (conflict: marketplace_id, customer_segment) — github.com/sellerCouponReport.json — `CouponDetails` lists `marketplaceId` ("Marketplace the coupon is running in") and `customerSegment` ("Customer segment that the coupon is available to") as required properties; the production file checked has neither. The page follows the file.
- how-to-get-it (console path to the coupons feature) — sell.amazon.com/seller-promotions — "To add a coupon to a product, hover over Advertising in the Seller Central main menu, then select Coupons" and "You can edit and deactivate coupons as needed from your Coupons dashboard." Amazon does not describe a coupon-performance view there, and the report type itself is documented as "This report can only be requested".