What this report contains
One row is one seller SKU, on one day, in one marketplace. The row carries the demand side — sessions, page_views split between browser and the Amazon app, and the buy_box_percentage that records how often the buy box appeared on the page for a shopper to add your product to the cart — beside the outcome side: units_ordered, total_order_items and ordered_product_sales. Every traffic and sales column is repeated for Amazon Business buyers with a _b2b suffix, and those columns are a subset of the main ones rather than an addition to them.
Column for column this is the child-ASIN report with sku added; upstream the two tables share one extractor. What the extra column buys you is a join. Traffic and conversion arrive keyed on the identifier your cost, price, repricer and inventory systems already speak, so you can put sessions next to landed cost without a SKU-to-ASIN mapping table in between.
parent_asin and child_asin still travel on every row, so a SKU tells you which listing it sits on. Two of your SKUs listed against the same child ASIN — an FBA and an FBM offer, say — appear as two rows here and as one row in the ASIN report. What that does not mean is that this report is the ASIN report broken down further; see the first gotcha below, which is the single most important sentence on this page.
How to get it
Through the Selling Partner API, this comes from Data Kiosk, Amazon's GraphQL successor to GET_SALES_AND_TRAFFIC_REPORT, rather than the older Reports API. You submit a GraphQL document to createQuery against the analytics_salesAndTraffic_2024_04_24 dataset, asking for sales and traffic at SKU granularity with a start and end date, poll the query until Amazon hands back a document id, then download a JSONL document — the familiar create, poll, download shape with a query language in front of it. In production these queries come back in roughly 20 to 60 seconds. Data Kiosk checks roles per field at query creation, and Amazon lists Brand Analytics as the required role for every one of its operations — that is an authorisation the calling application holds, not a subscription the seller buys.
Two traps sit in the query itself. Data Kiosk allows exactly one root field per query — an aliased document asking for two is rejected outright with "Versioned domain cannot select multiple query fields" — so the by-date, by-ASIN and by-SKU grains have to be three separate queries. And the by-SKU query aggregates its whole date range into one row per SKU. Ask for a month and you get one row per SKU for the month, not thirty daily rows. Daily grain means one query per day, which is what Trellis issues: a rolling five-day window, re-requested every day because Amazon keeps restating recent days.
A third thing is worth knowing before you plan the fan-out: one query spans marketplaces. Rows come back per day and marketplace, each in its own currency, so there is no need to issue a query per marketplace — partition on reported_marketplace_id afterwards instead. Budget against the createQuery quota, which is one per minute with a burst of fifteen per seller; a day of all three grains for one credential is eleven creates, inside the burst.
In Seller Central the same family of numbers lives under Reports → Business Reports, where Amazon names the detail-page reports as Detail Page Sales and Traffic, Detail Page Sales and Traffic By Parent Item and Detail Page Sales and Traffic By Child Item. It names no by-SKU view among them, so the SKU grain is documented on the API path and nowhere public in the console.
Sample rows
Illustrative values, not data from a real account. Shown to give the shape of the file.
| sku | start_date | child_asin | sessions | page_views | buy_box_percentage | units_ordered | unit_session_percentage | ordered_product_sales | ordered_product_sales_currency_code |
|---|---|---|---|---|---|---|---|---|---|
| EXAMPLE-TEE-BLK-M | 2026-09-14 | B0EXAMPLE01 | 1200 | 1700 | 96.0 | 144 | 12.0 | 2880.00 | USD |
| EXAMPLE-TEE-BLK-M-FBM | 2026-09-14 | B0EXAMPLE01 | 250 | 300 | 40.0 | 10 | 4.0 | 200.00 | USD |
| EXAMPLE-TEE-BLK-L | 2026-09-14 | B0EXAMPLE02 | 800 | 1050 | 98.0 | 72 | 9.0 | 1440.00 | USD |
| EXAMPLE-MUG-12OZ | 2026-09-14 | B0EXAMPLE03 | 400 | 520 | 100.0 | 0 | 0.0 | 0.00 | USD |
Field reference
| Column | Type | Description |
|---|---|---|
sku | string | Your own seller SKU — the offer the row is about, and the only column this report has that the child-ASIN version does not. It is the join key to the cost, price and inventory data that ASIN-keyed reports cannot reach. |
start_date | timestamp_ms | First day the row covers. A by-SKU query folds its entire requested range into one row per SKU, so this reads as a date only because the pull asks for one day at a time. |
end_date | timestamp_ms | Last day the row covers. Equal to start_date on a day-at-a-time pull; if the requested range is ever widened, these two bounds are the only thing that says the row is a range total rather than a day. |
reported_marketplace_id | string | The marketplace Amazon attributed the row to, as a literal marketplace id rather than a proxy. One query answers every marketplace at once, so a single file routinely holds several. |
parent_asin | string | Parent ASIN of the variation family this SKU is listed against. Repeated across every SKU in the family, so grouping on it gives family-level totals. |
child_asin | string | The child ASIN this SKU is listed against — the buyable variation a shopper actually sees. Two of your SKUs on the same variation carry the same value here, which is how this grain separates offers that the ASIN grain shows as one. |
ordered_product_sales | decimal | Revenue from units of this SKU ordered on the day, before returns and before Amazon's fees. Data Kiosk returns money as an amount beside its own currency code and converts nothing. |
ordered_product_sales_currency_code | string | Currency of ordered_product_sales, carried per row because one file can mix marketplaces. Summing sales without grouping on this adds pounds to dollars. |
ordered_product_sales_b2b | decimal | The part of ordered_product_sales bought by Amazon Business buyers. A subset of the total, never an addition to it. |
ordered_product_sales_b2b_currency_code | string | Currency of ordered_product_sales_b2b, which is the row's marketplace currency like every other money column on the row. |
total_order_items | int64 | Order items that contained this SKU. One order of four units is a single order item, so this sits below units_ordered wherever shoppers buy multiples. |
total_order_items_b2b | int64 | The Amazon Business subset of total_order_items. |
units_ordered | int64 | Units of this SKU ordered on the day. The numerator of unit_session_percentage, and the column most people mean when they say sales. |
units_ordered_b2b | int64 | The Amazon Business subset of units_ordered. |
browser_page_views | int64 | Page views that reached this SKU from a web browser, desktop or mobile web. The Amazon shopping app is counted separately in mobile_app_page_views. |
browser_page_views_b2b | int64 | The Amazon Business subset of browser_page_views. |
browser_page_views_percentage | float64 | This SKU's browser page views as a percentage of your account's browser page views that day. A share of your own catalogue rather than the category, so it moves when other SKUs move. |
browser_page_views_percentage_b2b | float64 | The Amazon Business equivalent of browser_page_views_percentage. |
browser_session_percentage | float64 | This SKU's browser sessions as a percentage of your account's browser sessions that day. |
browser_session_percentage_b2b | float64 | The Amazon Business equivalent of browser_session_percentage. |
browser_sessions | int64 | Sessions that arrived through a web browser rather than the Amazon shopping app. |
browser_sessions_b2b | int64 | The Amazon Business subset of browser_sessions. |
buy_box_percentage | float64 | Amazon defines this as the percentage of this SKU's page views where the buy box — the add-to-shopping-cart link — appeared on the page for a customer to add your product to their cart. It measures the buy box being present, not the share you won against other sellers, so do not read it as a Featured Offer win rate. |
buy_box_percentage_b2b | float64 | The same measure over page views by Amazon Business customers — the percentage of those views where the buy box appeared for the customer to add your product to their cart. Amazon populates it only for sellers enrolled in Amazon Business. |
mobile_app_page_views | int64 | Page views from the Amazon shopping app. Together with browser_page_views this makes up page_views. |
mobile_app_page_views_b2b | int64 | The Amazon Business subset of mobile_app_page_views. |
mobile_app_page_views_percentage | float64 | This SKU's app page views as a percentage of your account's app page views that day. |
mobile_app_page_views_percentage_b2b | float64 | The Amazon Business equivalent of mobile_app_page_views_percentage. |
mobile_app_session_percentage | float64 | This SKU's app sessions as a percentage of your account's app sessions that day. |
mobile_app_session_percentage_b2b | float64 | The Amazon Business equivalent of mobile_app_session_percentage. |
mobile_app_sessions | int64 | Sessions that arrived through the Amazon shopping app. |
mobile_app_sessions_b2b | int64 | The Amazon Business subset of mobile_app_sessions. |
page_views | int64 | All detail page views attributed to this SKU, browser plus app. One session can load a page several times, so this is always at least sessions. |
page_views_b2b | int64 | The Amazon Business subset of page_views. |
page_views_percentage | float64 | This SKU's page views as a percentage of your account's page views that day, across browser and app. |
page_views_percentage_b2b | float64 | The Amazon Business equivalent of page_views_percentage. |
session_percentage | float64 | This SKU's sessions as a percentage of your account's sessions that day. Useful for seeing which offers absorb your traffic, but it is a ratio against a moving denominator. |
session_percentage_b2b | float64 | The Amazon Business equivalent of session_percentage. |
sessions | int64 | Visits attributed to this SKU, and the denominator of unit_session_percentage. Amazon attributes traffic to SKUs more narrowly than to ASINs, so these do not add up to the same total the child-ASIN report reports. |
sessions_b2b | int64 | The Amazon Business subset of sessions. |
unit_session_percentage | float64 | Units ordered divided by sessions, as a percentage — Amazon's conversion rate for this offer. Units over sessions means a multipack or a bulk order can push it past 100% with nothing wrong. |
unit_session_percentage_b2b | float64 | The Amazon Business conversion rate, computed the same way from B2B units and B2B sessions. |
Use cases
Telling two offers on one listing apart. An FBA SKU and an FBM SKU on the same child ASIN are one row in the ASIN report and two rows here. unit_session_percentage, units_ordered and ordered_product_sales per SKU show which offer the demand actually went to, which is the question behind most "should I keep the merchant-fulfilled offer" arguments. buy_box_percentage sits beside them as how often the buy box appeared on the page at all — Amazon's own definition — rather than as a win rate between your two offers.
Putting margin next to conversion. ordered_product_sales and units_ordered land on the same key your cost table uses, so realised average selling price per SKU per day — sales divided by units — can sit beside unit cost without a mapping step. The ASIN grain cannot do this for a listing you sell under more than one SKU.
Watching a repricer's effect on demand, not just on price. A price move shows up in this report as sessions and unit_session_percentage on the SKU the repricer acted on, rather than averaged across every offer on the listing — so a week where traffic held and conversion fell can be read against the offer whose price actually moved.
Feeding replenishment with the demand signal, not just the shipment signal. units_ordered per SKU per day is the series most forecasting models want, and it arrives already keyed to the SKU the purchase order will be written against.
Sizing Amazon Business demand per offer. The _b2b columns show whether business buyers concentrate on particular SKUs — typically case packs and multipacks — which is the honest input to whether B2B pricing or quantity discounts are worth configuring, and on which offers.
Limitations and gotchas
The SKU grain is not a superset of the ASIN grain, and the two do not reconcile. This is the thing to take away from this page. The same seller, on the same day, answered 234 child-ASIN rows and 168 SKU rows: Amazon attributes traffic to SKUs more narrowly than it does to ASINs, so the SKU file is not the ASIN file with more rows in it, and the columns you might expect to tie out do not. Pick the grain that matches the question. Do not sum SKU sessions and expect the ASIN total, do not use one report to audit the other, and do not build a pipeline whose correctness check is that they agree. Amazon documents the SKU grain only as a granularity of the same query and says nothing about why the two row counts differ, so this page reports the difference and offers no mechanism for it.
Recent days get restated. Attribution settles over several days, so yesterday's numbers will move. Anything that snapshots a day once and never revisits it drifts away from Seller Central; a re-pulled rolling window is the fix.
The percentage columns share a moving denominator. session_percentage, page_views_percentage and their browser, app and B2B variants are shares of your own account's total for the day, not of the category — Amazon's schema defines each one against the total "for all products". A SKU's share can fall in a week where its own sessions rose. Amazon does not say whether that account total is enumerated over SKUs or over ASINs, and since the two grains do not answer the same number of rows, a SKU share and an ASIN share should not be treated as shares of one denominator.
Money is never converted. Every money column ships beside its own currency code, and because one query answers every marketplace, a single file mixes currencies freely — a four-marketplace query returned CAD rows next to USD ones. Group on ordered_product_sales_currency_code, or on reported_marketplace_id, before you sum anything.
The B2B columns are a subset. Adding units_ordered to units_ordered_b2b, or either sales pair, double counts every business order.
start_date equals end_date only because the query asked for one day. Widen the range and the same row shape comes back as a range total — the dates say so, and nothing else does.
unit_session_percentage can exceed 100%. It divides units by sessions, and one session can buy several units. On multipacks and consumables this is ordinary.
Sessions are de-duplicated per shopper over 24 hours. Amazon counts all browser and mobile app activity by one user within a 24-hour period as a single session, so summing daily sessions across a month overstates the month. Whether a SKU with no activity comes back as a zero row or no row at all is not documented at this grain — Amazon states the omit-it behaviour only for the separate salesAndTrafficTrends query — so code that wants a dense SKU-by-day grid should fill gaps itself rather than rely on either shape.
FAQ
They carry the same columns, and the SKU version adds your seller SKU. The important difference is not the column but the counting: Amazon attributes traffic to SKUs more narrowly than to ASINs, so the two are genuinely different reports rather than two views of one number.
Because that is how the data comes back. One seller's single day answered 234 child-ASIN rows and 168 SKU rows. The SKU grain is not a superset of the ASIN grain and consumers should not expect the two to reconcile.
No. Data Kiosk accepts exactly one root field per query and rejects a document that selects two with "Versioned domain cannot select multiple query fields". Three grains means three queries.
The by-SKU query aggregates its whole requested range into a single row per SKU. To get daily rows you issue one query per day, and the row's start and end dates are what tell you which you got.
Yes. Rows come back per day and per marketplace, each in its own currency, so there is no need to run a query per marketplace. Partition on the reported marketplace id and group on the currency code before summing money.
Not in what we have seen. A credential that is refused on the 2024 Finances operations answers Data Kiosk normally, so coverage looks like the whole seller fleet rather than a recently reauthorised subset.