What this report contains
One row is one day in one marketplace: the account added up, with no ASIN, SKU or title anywhere in it. sessions and page_views describe the demand that arrived and buy_box_percentage how often the buy box appeared on the page for a shopper to add your product to the cart; units_ordered, total_order_items and ordered_product_sales describe what it turned into; and unit_session_percentage and order_item_session_percentage are the two ways Amazon divides one by the other.
What makes this grain worth pulling separately is the columns the item grains simply do not have. The shipped side — units_shipped, orders_shipped, shipped_product_sales — sits on the same row as the ordered side. So does the unhappy side: units_refunded, refund_rate, claims_granted, claims_amount, feedback_received, negative_feedback_received and received_negative_feedback_rate. So do the per-order-item averages (average_selling_price, average_sales_per_order_item, average_units_per_order_item) and two columns describing the catalogue itself, average_offer_count and average_parent_items. None of these appear in the by-ASIN or by-SKU grain.
It also drops something. The item grains carry share-of-your-own-catalogue columns — session_percentage, page_views_percentage and friends — which are meaningless once the row is the whole catalogue, and they are absent here.
Every traffic column is split three ways, into a browser figure, an Amazon-app figure and a combined total, and the whole set is repeated for Amazon Business buyers with a _b2b suffix. The B2B columns are a subset of the main ones, never an addition; adding units_ordered_b2b to units_ordered counts every business order twice.
Money is an amount and a currency code together, even for the per-item averages, and one file can hold several currencies at once. reported_marketplace_id is the second half of the row's identity, and the column that keeps those currencies apart.
How to get it
Through the Selling Partner API this comes from Data Kiosk, not the older Reports API. You submit a GraphQL document against the analytics_salesAndTraffic_2024_04_24 dataset selecting salesAndTrafficByDate with a start date, an end date and day-level aggregation, poll the query until Amazon returns a document id, then download the JSONL. In production those queries came back in roughly 20 to 60 seconds end to end.
The trap is the reverse of the one on the item grains. salesAndTrafficByDate at day granularity returns one row per day per marketplace across the whole range you asked for, so a five-day window is one query and five rows per marketplace. Its siblings collapse their range into one row per item, which is why they need a query per day. Code that copies the by-ASIN fetch loop here issues five queries to get what one would have returned.
One query also spans marketplaces. Rows come back per day and per marketplace id, each in its own currency — a four-marketplace query answered Canadian dollar rows beside US dollar ones — so there is nothing to fan out per marketplace and nothing to merge afterwards.
Two limits shape any scheduler around this. Data Kiosk accepts exactly one root field per query ("Versioned domain cannot select multiple query fields"), so the by-date, by-ASIN and by-SKU grains cannot be fetched together and are three separate jobs. And createQuery is rate limited to one a minute with a burst of fifteen per seller, so what you have to keep under control is a single credential's daily total, not the fleet's.
There is no authorization-vintage gate on this one: a credential that returns 403 on the 2024 Finances operations still answers Data Kiosk, so coverage is the whole seller fleet rather than a recently re-authorized subset.
In Seller Central the same numbers appear under Reports → Business Reports, where Sales and Traffic is one of the By date reports.
Sample rows
Illustrative values, not data from a real account. Shown to give the shape of the file.
| start_date | reported_marketplace_id | sessions | page_views | units_ordered | unit_session_percentage | ordered_product_sales | ordered_product_sales_currency_code | units_shipped | refund_rate |
|---|---|---|---|---|---|---|---|---|---|
| 2026-09-14 | ATVPDKIKX0DER | 12000 | 17400 | 1440 | 12.0 | 41760.00 | USD | 1380 | 1.8 |
| 2026-09-14 | A2EUQ1WTGCTBG2 | 1600 | 2240 | 128 | 8.0 | 4480.00 | CAD | 120 | 2.5 |
| 2026-09-15 | ATVPDKIKX0DER | 11500 | 16200 | 1265 | 11.0 | 36685.00 | USD | 1310 | 2.1 |
| 2026-09-15 | A2EUQ1WTGCTBG2 | 1500 | 2050 | 105 | 7.0 | 3675.00 | CAD | 115 | 2.4 |
| 2026-09-16 | ATVPDKIKX0DER | 12500 | 18000 | 1500 | 12.0 | 43500.00 | USD | 1425 | 1.9 |
Field reference
| Column | Type | Description |
|---|---|---|
start_date | timestamp_ms | The first day the row covers. Pulled at day granularity, which is how this report is fetched, it is the day itself and equals end_date. |
end_date | timestamp_ms | The last day the row covers. Amazon carries both bounds even when they are the same, so that a row from a widened query window says it is a range total rather than masquerading as a day. |
reported_marketplace_id | string | The marketplace the row belongs to, as a literal marketplace id rather than a proxy for one. It is half of the row's identity, and the column to partition or group on. |
ordered_product_sales | decimal | Revenue from every unit ordered that day across the account, before returns and before Amazon's fees. Stated in the marketplace's own currency, never converted. |
ordered_product_sales_currency_code | string | The currency ordered_product_sales is in. Money arrives as an amount and a currency code together, and one file can hold several currencies, so a sales total that does not group on this column is adding dollars to Canadian dollars. |
ordered_product_sales_b2b | decimal | The part of ordered_product_sales that came from Amazon Business buyers. A subset of the total, not something to add to it. |
ordered_product_sales_b2b_currency_code | string | The currency ordered_product_sales_b2b is in. |
average_sales_per_order_item | decimal | Average value of an order item for the day — roughly ordered product sales spread over total_order_items. It is money, so it carries its own currency code. No equivalent column exists at the ASIN or SKU grain. |
average_sales_per_order_item_currency_code | string | The currency average_sales_per_order_item is in. |
average_sales_per_order_item_b2b | decimal | The Amazon Business equivalent of average_sales_per_order_item, computed from B2B sales and B2B order items. |
average_sales_per_order_item_b2b_currency_code | string | The currency average_sales_per_order_item_b2b is in. |
average_selling_price | decimal | Average price of a unit ordered that day. It sits below average_sales_per_order_item by whatever multiple average_units_per_order_item reports, which is the cheapest way to see whether a price move or a basket-size move drove revenue. |
average_selling_price_currency_code | string | The currency average_selling_price is in. |
average_selling_price_b2b | decimal | Average unit price paid by Amazon Business buyers. Business pricing and quantity discounts are set separately, so this can sit well below the consumer figure. |
average_selling_price_b2b_currency_code | string | The currency average_selling_price_b2b is in. |
average_units_per_order_item | float64 | Mean units in an order item. Anything above 1 means shoppers are buying multiples, and it is the bridge between total_order_items and units_ordered. |
average_units_per_order_item_b2b | float64 | The Amazon Business equivalent of average_units_per_order_item, which is usually the higher of the two. |
claims_amount | decimal | The monetary amount of A-to-z guarantee claims filed against the account that day, with its own currency code beside it. Amazon's schema puts filed on the money column and granted on the count beside it, so claims_amount and claims_granted do not describe the same set of claims and this is not the value of the claims you lost. |
claims_amount_currency_code | string | The currency claims_amount is in. |
claims_granted | int64 | The number of A-to-z guarantee claims granted against the account that day — the granted count, where claims_amount beside it is the filed value. An account-health number, and one of the columns that exists only at this grain. |
orders_shipped | int64 | Orders shipped that day. Counted on the shipping event, not the order event, so it does not line up with total_order_items for the same date. |
refund_rate | float64 | Amazon's refund rate for the day, travelling beside units_refunded. Amazon's schema defines it as units_refunded divided by units_ordered over the period the row covers, so both operands are on the row — but they are counted on different clocks, a refund landing on the day it was issued rather than the day of the order. It is the day's refunds against the day's orders, not the share of that day's orders that came back. |
shipped_product_sales | decimal | Revenue of product shipped that day, as opposed to ordered. This is the only grain of the report that puts the ordered and shipped sides of the same day on one row. |
shipped_product_sales_currency_code | string | The currency shipped_product_sales is in. |
total_order_items | int64 | Order items placed that day across the account. One order item can contain several units, so this sits below units_ordered wherever people buy multiples. |
total_order_items_b2b | int64 | The Amazon Business subset of total_order_items. |
units_ordered | int64 | Units ordered that day across the account. The numerator of unit_session_percentage, and the number most people mean when they say daily sales. |
units_ordered_b2b | int64 | The Amazon Business subset of units_ordered. |
units_refunded | int64 | Units refunded that day, counted on the refund date. A refund lands on the day it was issued, not on the day the unit was ordered, so it does not net against the same row's units_ordered. |
units_shipped | int64 | Units shipped that day, counted on the shipping event. Comparing it with units_ordered over a week shows how much of the gap between the two is fulfilment lag. |
average_offer_count | float64 | The average number of offers you had live across the day, which Amazon calculates from the total number of offers and the number of days in the period. Every value in fawcett's production file was a whole number, and Amazon's schema types the field as an integer; nothing establishes that a fractional value here would be meaningful, so read the float64 as the column's storage type rather than as a promise of fractions. |
average_parent_items | float64 | The average number of parent items in your catalogue across the day, standing in the same place as average_offer_count — whole numbers in the production file, an integer in Amazon's schema, float64 in the table. Together the two give you catalogue size as a time series, which no item-grain report can. |
browser_page_views | int64 | Detail page views that arrived through a web browser, on desktop or mobile web. Excludes the Amazon shopping app. |
browser_page_views_b2b | int64 | The Amazon Business subset of browser_page_views. |
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 page views where the buy box — the add-to-shopping-cart link — appeared on the page for customers to add your product to their cart, here as one number for the whole account. 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. |
feedback_received | int64 | Seller feedback entries received that day. No item-grain version of this report carries feedback at all. |
mobile_app_page_views | int64 | Detail page views from the Amazon shopping app. With browser_page_views this adds up to page_views. |
mobile_app_page_views_b2b | int64 | The Amazon Business subset of mobile_app_page_views. |
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. |
negative_feedback_received | int64 | The negative subset of feedback_received, not an additional count. |
order_item_session_percentage | float64 | Order items divided by sessions, as a percentage. Because its numerator counts order items rather than units, a multipack cannot push it above 100 the way it can unit_session_percentage — which makes it the steadier of the two conversion series. It has no counterpart at the ASIN or SKU grain. |
order_item_session_percentage_b2b | float64 | The Amazon Business equivalent of order_item_session_percentage. |
page_views | int64 | Total detail page views for the day, browser plus app. One session can produce several page views, so this is always at least sessions. |
page_views_b2b | int64 | The Amazon Business subset of page_views. |
received_negative_feedback_rate | float64 | Amazon's negative feedback rate for the day. Its schema defines it as the number of orders that received negative feedback divided by the number of orders for the period — orders, not the feedback_received count sitting beside it. The row carries no order count, so unlike refund_rate this is a figure you cannot rebuild from the other columns. |
sessions | int64 | Visits to your detail pages that day, as Amazon's deduplicated visitor count rather than a raw visit count. It is the denominator of both conversion columns. |
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 the whole account that day. Units in the numerator and sessions in the denominator means it can exceed 100 on multipack-heavy catalogues. |
unit_session_percentage_b2b | float64 | The Amazon Business conversion rate, built the same way from B2B units and B2B sessions. |
Use cases
Reading a revenue move as price, basket or volume. Revenue is average_selling_price × average_units_per_order_item × total_order_items, and this is the only Amazon report that hands you all three for the same day. A drop with a flat unit price and fewer order items is a demand story; the same drop with steady order items and a lower average selling price is a pricing or coupon story.
Watching conversion without letting one ASIN speak for the account. unit_session_percentage here is the whole account. Tracked beside order_item_session_percentage it separates a real conversion change from a mix shift into multipacks, because only the first of the two moves when basket size does.
A daily refund and claims watch. refund_rate, units_refunded, claims_granted and claims_amount land on the same row as the sales they will eventually erode. A rising refund rate against flat orders is a quality or listing-accuracy problem showing up days before it reaches account health.
Fulfilment lag, measured. units_ordered against units_shipped and orders_shipped over a couple of weeks shows how much of a soft sales week was demand and how much was shipping backing up. The item grains cannot answer this at all — they have no shipped columns.
Sizing Amazon Business honestly. The _b2b columns give B2B's real share of sessions, units and revenue, plus a separate buy_box_percentage_b2b and average_selling_price_b2b. That is the input to whether business pricing and quantity discounts are worth configuring, and it does not require reconciling anything at item level.
A catalogue-size denominator. average_offer_count and average_parent_items turn "we added 400 listings in March" into a daily series you can put underneath sessions, which is how you tell catalogue growth apart from listing performance.
Limitations and gotchas
This file cannot name a listing. It is the correct file for an account trend and the wrong one for a diagnosis. The moment the question is "which ASIN", you need the by-ASIN or by-SKU grain, which is a different report and a different query.
Recent days get restated. Amazon keeps changing the last few days, which is why the by-date query re-states a rolling lookback window on every run rather than fetching yesterday once. Anything that snapshots a day and never revisits it will drift away from Seller Central.
One file, several currencies. Each row is in its marketplace's own currency and nothing is converted. Summing ordered_product_sales without grouping on ordered_product_sales_currency_code and reported_marketplace_id produces a number with no meaning.
Ordered, shipped and refunded are three different clocks. ordered_product_sales is counted on the order, shipped_product_sales and units_shipped on the shipment, units_refunded on the refund. Netting them within one row gives you a figure that describes no real day.
Sessions do not add up across days. They are a deduplicated visitor count, so a month's sessions are not the sum of the month's daily sessions — a shopper who returned on five days is counted five times in that sum.
The B2B columns are a subset. Every _b2b column is already inside its parent. Adding them is the most common way this report is read wrong.
unit_session_percentage can exceed 100. Units over sessions, and one session can buy several units. On multipacks and consumables this is expected, not corrupt data.
Do not expect the grains to tie out. The by-ASIN and by-SKU grains demonstrably do not reconcile with each other — the same seller on the same day answered 234 child-ASIN rows and 168 SKU rows, because Amazon attributes traffic to SKUs more narrowly than to ASINs. Against this grain the traffic side cannot tie at all: Amazon counts an item's sessions as the sessions that contained at least one page view of that item, so a shopper who looked at three of your ASINs is one session on this row and three in the by-ASIN sum. The sales side is a separate question and an untested one: nothing here establishes whether a day's units_ordered and ordered_product_sales equal the sum of that day's by-ASIN rows.
FAQ
The by-date grain is the whole account on one row a day and names no listing, while the by-ASIN grain is one row per child ASIN per day. The by-date grain also carries columns the item grains do not have at all: units shipped, orders shipped, shipped product sales, units refunded, refund rate, claims granted, seller feedback, average selling price and average offer count.
They are counted on different events. Ordered product sales are recognised when the order is placed, shipped product sales when the shipment goes out, so the two only converge over a period long enough for fulfilment lag to wash out.
No. Sessions are a deduplicated visitor count for the day, so a shopper who visited on five separate days is counted once on each of them and five times in the sum. Daily sessions are comparable to one another, not additive.
Yes. Rows come back per day and per marketplace id, each in its own currency, so a single query can answer Canadian dollar rows beside US dollar ones. Group on the reported marketplace id before you total anything.
Data Kiosk allows exactly one root field per query and rejects a document that selects two, so each grain is its own query and its own job. Watch the create-query limit while you schedule them: it is one a minute with a burst of fifteen, counted per seller.
Partly, and not netted. Units refunded, refund rate, claims granted and claims amount are on the row, but ordered product sales and units ordered stay gross of them, because the refund is recorded on the day it happened rather than against the day of the order.