What this report contains
One row is one ASIN over one reporting period. The report answers a single question about that ASIN — of the customers who ordered it, how many had ordered it before, and what they spent — and the ten columns are the whole file. The ASIN alone is not the key: it is the ASIN and the period, so an ASIN recurs once per period and successive pulls stack rather than replace each other. Anything you join or deduplicate on has to carry both.
Four of them establish identity and scope: asin, the period bounded by start_date and end_date, and report_period, which names whether that period is a WEEK, a MONTH or a QUARTER. Two are the raw counts the rest rests on: orders and unique_customers. Because orders are counted per order and customers are deduplicated, unique_customers is at most orders, and the distance between them already says something about repeat buying inside the period.
The remaining four are the result. repeat_customers_pct_total is loyalty measured in people; repeat_purchase_revenue, with its own repeat_purchase_revenue_currency_code, is loyalty measured in money, and repeat_purchase_revenue_pct_total puts that money back into proportion. Note what is not here: neither total — not total customers, not total revenue — is a column. The percentages are the only route to the denominators, and only by division. Both of those columns are fractions in Amazon's schema, bounded at 0 and 1 rather than 0 and 100, so a repeat share of eighteen per cent arrives as 0.18.
How to get it
Through the Selling Partner API, this arrives as a JSON report document rather than a flat file: a reportSpecification echoing the request you made, and a single dataByAsin collection holding the rows. Amazon states availability as sellers and vendors who hold the Brand Analytics Selling Partner API role and are registered in Brand Registry; on the seller path, Amazon adds that Brand Analytics needs a Professional selling account and Brand Representative status for the enrolled brand. The dataByAsin rows have to be rendered out of the document before they are a table at all, and there is only one row grain in the document — so one table, unlike the promotions and coupon documents that hold several.
Amazon publishes no clock for this one. The reference says the report can only be requested, never scheduled, and the period is a required reportOptions value you choose per request. So weekly describes the rows rather than a refresh rate: one row covers one week, which is what reportPeriod=WEEK returns. Amazon states no refresh rate for this report anywhere.
The trap is that file format. A tab-separated reader cannot read the raw JSON, so anything that assumes the downloaded document is already a table produces the right columns with nothing in them. The document has to be parsed as JSON and the dataByAsin collection flattened before the rows exist at all. If your first pull is empty or all nulls, you parsed a JSON document as a flat file.
The second thing to get right is the period. The report answers a WEEK, a MONTH or a QUARTER, and which one you asked for changes what every number means — a repeat rate over a quarter is not a worse-measured weekly rate, it is a different measurement, because a longer period gives customers more chance to come back inside it. A single request may also span several periods, and Amazon's schema says the per-ASIN data is then repeated for each of them — so even inside one document the same ASIN can appear more than once, keyed by the period it covers. report_period is in the row so you can tell files apart after the fact; keep it in anything you stack.
In the console, the same data is the Repeat Purchase Behavior dashboard. The route Amazon publishes is the seller one: reach Brand Analytics from the Seller Central main menu under Brands → Brand Analytics, with the Repeat Purchase Behavior dashboard under the Customer Behavior Analytics drop-down there, in either a Brand View or an ASIN View. Amazon writes no equivalent Vendor Central route anywhere public, so a vendor holding the Brand Analytics role has the API report documented but not the console path. Either way the dashboard and the report are not guaranteed to agree column for column, so use it to sanity-check a pull rather than to reconcile one.
Sample rows
Illustrative values, not data from a real account. Shown to give the shape of the file.
| start_date | end_date | asin | report_period | orders | unique_customers | repeat_customers_pct_total | repeat_purchase_revenue | repeat_purchase_revenue_currency_code | repeat_purchase_revenue_pct_total |
|---|---|---|---|---|---|---|---|---|---|
| 2026-09-07 | 2026-09-13 | B0EXAMPLE01 | WEEK | 1200 | 1000 | 0.1800 | 9000.00 | USD | 0.2250 |
| 2026-09-07 | 2026-09-13 | B0EXAMPLE02 | WEEK | 420 | 400 | 0.0850 | 1275.00 | USD | 0.1100 |
| 2026-09-07 | 2026-09-13 | B0EXAMPLE03 | WEEK | 150 | 150 | 0.0000 | 0.00 | USD | 0.0000 |
| 2026-09-07 | 2026-09-13 | B0EXAMPLE04 | WEEK | 80 | 60 | 0.2500 | 600.00 | USD | 0.3000 |
Field reference
| Column | Type | Description |
|---|---|---|
start_date | date | The first day of the reporting period the row covers. Every number in the row is counted over this period, and nothing in the file is dated more precisely. |
end_date | date | The last day of the reporting period the row covers. When report_period is WEEK, start_date and end_date bound one week — Amazon requires the start to be a Sunday and the end a Saturday; a month or quarter period widens both. |
asin | string | The ASIN the row is about. Together with the period bounded by start_date and end_date it is the row's identity — one ASIN appears once per period. |
report_period | string | Which reporting period the row was aggregated over. The report is documented as answering a WEEK, MONTH or QUARTER, and this column is what tells you which one you are holding — worth checking before comparing two files. Amazon carries it once, in the report specification at the head of the document rather than on each row, so it has to be lifted onto every row for a stacked table to stay readable. |
orders | int64 | Orders containing this ASIN over the period. Orders, not units — and not customers either, since one customer can place several orders inside the same period. |
unique_customers | int64 | Distinct customers who ordered this ASIN over the period. Because customers are deduplicated and orders are not, this is at most orders, and the gap between the two is itself a repeat-buying signal within the period. |
repeat_customers_pct_total | float64 | The share of the row's unique_customers who are repeat customers — the headline number of the report. Amazon's schema types it as a fraction between 0 and 1, so 0.18 is eighteen per cent; multiply before you put it on a chart. |
repeat_purchase_revenue | decimal | What the repeat purchases were worth over the period — Amazon's schema calls it ordered revenue from repeat customers, with returns not reflected. It is a portion of the ASIN's revenue, not the whole of it; the file does not carry the total, so the only way to reach it is to divide this by repeat_purchase_revenue_pct_total, and what that recovers is the ASIN's own revenue for the period, not the brand's. |
repeat_purchase_revenue_currency_code | string | The currency repeat_purchase_revenue is in. Carried per row, so revenue summed across files without grouping on this adds one currency to another. |
repeat_purchase_revenue_pct_total | float64 | Repeat purchase revenue as a share of total revenue, again a fraction between 0 and 1 in Amazon's schema. Amazon describes it only as the fraction of repeat purchase revenue versus total revenue; the field sits inside the per-ASIN object, so that total reads as this ASIN's own revenue over the period, but Amazon never spells the scope out. It is a second, independent reading of loyalty — repeat customers can be a small share of people and a large share of money, and the two columns diverging is the interesting case. |
Use cases
Separating acquisition from retention on one ASIN. Sales rising while repeat_customers_pct_total falls is a growth story driven by new buyers; sales flat while it rises means you are living off the customers you already have. The two have completely different next moves, and no sales report distinguishes them.
Finding the consumables you did not know you had. ASINs with a high repeat-customer share are products people re-buy on their own. They are the ones worth a Subscribe and Save offer, a multipack variation, or a larger post-purchase spend — and the ranking is often not the one the catalogue would suggest.
Valuing a repeat customer. repeat_purchase_revenue divided by the repeat customers implied by repeat_customers_pct_total and unique_customers gives a per-repeat-customer figure from the file itself, which is the honest input to what a first order is worth paying for.
Spotting the ASINs where money and people disagree. An ASIN whose repeat_purchase_revenue_pct_total sits well above its repeat_customers_pct_total earns disproportionately from a small loyal group; the reverse means repeat buyers come back for something cheap. Both are real and they call for opposite merchandising.
Watching a launch mature. A new ASIN starts with no repeat customers by definition. Pulling the same weeks in sequence shows when the repeat share starts to build, which is the earliest evidence that the product itself — not the launch spend — is working.
Measuring the gap between orders and customers. orders well above unique_customers in a single week means people are re-buying inside the period, which is a different and faster signal than the period-over-period repeat share.
Limitations and gotchas
The totals are not in the file. There is no total customers column and no total revenue column. Every absolute number you want besides orders, unique_customers and repeat_purchase_revenue has to be reconstructed by dividing by a percentage, which fails outright when that percentage is zero — a common case on new or low-volume ASINs.
The period changes the answer. Repeat rates are not comparable across a WEEK, a MONTH and a QUARTER; a longer window mechanically produces a higher repeat share. Comparing files without grouping on report_period manufactures a trend out of nothing.
Weekly rows do not add up. A customer who bought in three different weeks is three unique customers if you sum the weekly rows. unique_customers is deduplicated within a period only, so a monthly figure has to come from a monthly pull, not from four weekly ones.
Money is not converted. repeat_purchase_revenue ships with its own currency code, so a union of pulls from different marketplaces mixes currencies in one column.
The row carries no marketplace. The marketplace is a property of the request, not the row: Amazon's schema keeps marketplaceIds in the report specification and accepts only one marketplace per report. The ten columns therefore say nothing about where the orders happened; marketplace, country and currency have to be attached to the table from the request rather than read off the row. If you stack files yourself, carry the marketplace or the rows become unattributable.
What counts as a repeat customer is Amazon's definition, not yours. The report counts customers who had ordered the ASIN before, and Amazon's own description of the matching console dashboard is that it shows how often unique customers place multiple orders of the same product — so the comparison is per ASIN, not across your brand. What Amazon does not say anywhere public is how far back it looks for that earlier order. Do not restate the number as "returning customers in the last N days" until someone confirms the window.
The schema stands on one file. These ten columns were validated against a production US file of 406 ASINs over one WEEK period. That is a real file, which is more than most schemas stand on, but it is one marketplace and one period — a monthly or quarterly pull, or another marketplace, is where a column you have not seen would first appear.
FAQ
One ASIN over one reporting period. The row gives the orders and the distinct customers for that ASIN in the period, the share of those customers who had bought it before, and the revenue those repeat purchases produced, with its currency code.
A week, a month or a quarter, depending on what was requested, and the report_period column in each row tells you which. The same ASIN will show a higher repeat share over a quarter than over a week purely because the window is longer.
By division, or not at all — and only for one ASIN at a time. The file carries repeat purchase revenue and that revenue's share of the total, so the total is the one divided by the other. The share sits inside the per-ASIN object, so what you recover is that ASIN's revenue over the period, not your brand's or your account's; Amazon never states the scope outright. There is no total revenue column, and the division is undefined when the share is zero.
No. Unique customers are deduplicated inside a period, so summing four weeks counts a customer who bought in three of them three times. A monthly figure has to come from a monthly pull.
Because Amazon answers it as a document — a report specification plus a single collection of rows keyed by ASIN. It has to be rendered out into a table first; parsing it with an ordinary tab-separated reader gives you headers and no data.
No. They are two Brand Analytics reports that share plumbing — both arrive as JSON with one rows collection and both land as their own table — but repeat purchase measures buying the same ASIN again over time, while market basket measures what shared an order.
Sources
Every researched claim on this page, and the Amazon or Walmart page it came from.
- marketplaces — developer-docs.amazon.com/report-type-values-analytics — the Repeat Purchase entry (reportType GET_BRAND_ANALYTICS_REPEAT_PURCHASE_REPORT) states that the report is available in the following Amazon stores: US, MX, CA, BR, ES, UK, FR, NL, DE, IT, SE, TR, SA, AE, IN, SG, AU and JP. All eighteen have a term in _taxonomy.yaml and all eighteen are listed; no inference was needed.
- requires — developer-docs.amazon.com/report-type-values-analytics — Availability for this report type is stated as sellers and vendors who have the Brand Analytics Selling Partner API role and are registered in Amazon Brand Registry.
- requires — sell.amazon.com/amazon-brand-analytics — under "Who can use Brand Analytics?", to access Brand Analytics you need a Professional selling account, and to be a Brand Representative for a brand enrolled in Amazon Brand Registry. professional-plan is written into the field on this basis. It is a seller-path gate: Amazon states it of Brand Analytics as a Seller Central tool, and publishes no vendor equivalent.
- seller_type — developer-docs.amazon.com/roles-in-the-selling-partner-api — the Brand Analytics role entry answers "Role available to sellers?" Yes and "Role available to vendors?" Yes, and the report-type reference states availability for this report as sellers and vendors who hold that role and are registered in Brand Registry. Hence `both`, even though the page sits under the Seller Central source. Amazon's published console route for the dashboard is the Seller Central one only.
- grain — github.com/sellingPartnerRepeatPurchaseReport.json — startDate is described as "If the request spans multiple reportPeriods, byAsin data will be shared for each of these reportPeriods", and the schema's own example document carries the same dataByAsin collection across two weeks. So the key is the ASIN plus the period, not the ASIN alone. The `grain` field keeps `asin` because _taxonomy.yaml has no per-ASIN-per-period term; the prose carries the period axis.
- report_period (production file vs document, the file wins) — developer-docs.amazon.com/report-type-values-analytics — the entry's attribute list names eight attributes (startDate, endDate, asin, orders, uniqueCustomers, repeatCustomersPctTotal, repeatPurchaseRevenue, repeatPurchaseRevenuePctTotal), and the linked schema types repeatPurchaseRevenue as an amount/currencyCode object and puts reportPeriod in reportSpecification.reportOptions rather than on the row. The ten columns documented here are those eight with the revenue pair flattened into two, plus report_period lifted out of the envelope onto every row, which is the shape the production file arrives in.
- marketplace context — github.com/sellingPartnerRepeatPurchaseReport.json — marketplaceIds sits in reportSpecification and "This report type supports only one marketplaceId per report", so the marketplace is a property of the request rather than of a row. Marketplace, country and currency context therefore has to be attached to the table from the request; it cannot be read out of the file.
- cadence and report_period — developer-docs.amazon.com/report-type-values-analytics — the entry states the data is available across the reporting periods WEEK, MONTH and QUARTER, that requests can span multiple reporting periods, that reportPeriod is a required reportOptions value taking those three, and that this report can only be requested (never scheduled). It also states that dataStartTime must be a Sunday and dataEndTime a Saturday when reportPeriod=WEEK.
- history_window — sell.amazon.com/brand-analytics — data in Brand Analytics usually goes back three years and is generally available within three days, with quarter-end data typically available within one week. Amazon says this of the Brand Analytics dashboards, not of the SP-API report type.
- latency — developer-docs.amazon.com/report-type-values-analytics — the entry carries no publication or refresh statement and says the report can only be requested, where the rapid retail analytics entries on the same page state theirs (for example traffic data available approximately 65 to 115 minutes after the close of an hour, lookback window 30 days).
- percentage scale — github.com/sellingPartnerRepeatPurchaseReport.json — the schema the reference links for this report type types repeatCustomersPctTotal as number with minimum 0 and maximum 1, examples 0.0083 and 0.0129, described as the fraction of unique customers that are repeat customers; and repeatPurchaseRevenuePctTotal the same way, examples 0.0217 and 0.8717, described as the fraction of repeatPurchaseRevenue versus total revenue. repeatPurchaseRevenue is an object of amount and currencyCode, and the revenue is stated as ordered revenue from repeat customers with returns not reflected. The scale is settled and the sample matches it. The denominator behind "total revenue" is not spelled out anywhere: the field sits inside the per-ASIN object, which reads as that ASIN's own revenue over the period, and the page says no more than that.
- repeat customer scope (two Amazon pages worded differently) — sell.amazon.com/amazon-brand-analytics describes the Repeat Purchase Behavior dashboard as "how often customers repeatedly buy from your brand", while sell.amazon.com/brand-analytics says the same dashboard "shows how often unique customers place multiple orders of the same product". The schema is per-ASIN — uniqueCustomers is the number of unique customers who placed an order containing the asin — so the page follows the per-ASIN reading and treats the "from your brand" phrasing as loose marketing copy about the dashboard.
- repeat customer definition (partial) — sell.amazon.com/brand-analytics — the Repeat Purchase Behavior dashboard shows how often unique customers place multiple orders of the same product, and displays repeat ordered product sales and units, the number of repeat customers, and the percentage of repeat buyers out of all customers who place orders. No lookback window is given.
- console path — sell.amazon.com/amazon-brand-analytics — access Brand Analytics from the Seller Central main menu by selecting Brands, then Brand Analytics. Amazon writes this of Seller Central only; no equivalent Vendor Central route is published anywhere public, and the Vendor Central help pages are login-gated, so the page gives the seller route and says so.
- console path — sell.amazon.com/brand-analytics — the Repeat Purchase Behavior dashboard is under the Customer Behavior Analytics drop-down menu on the Brand Analytics pages, and can be viewed in a Brand View or an ASIN View.