What this report contains
A replenishment order is a move of your own stock out of Amazon Warehousing and Distribution (AWD) and into FBA. This is the flow behind the AWD inventory position: listInventory tells you what is standing in AWD, and this tells you what left it, when, and whether it got there.
One pull answers four row grains at once, and the field reference below is grouped by the table each column lands in, so a repeated column such as order_id is listed once under every table it appears in and described for the table it sits in:
- The orders — order_id, status, created_at, updated_at, confirmed_on. One row per replenishment order. This is the headline table, and order is the grain this page is filed under; the other three are described here rather than given grains of their own. - The products — order_id, kind, sku, quantity. One row per SKU on an order. - The shipments — order_id, shipment_id, shipment_status, created_at, updated_at. One row per outbound shipment the order produced. - The ineligibility reasons — order_id, sku, failure_code, failure_reason. One row per SKU AWD refused to move.
order_id is the join key across all four, and the only column that appears in every one. The order's own status runs over CREATED, VALIDATING, ELIGIBLE, INELIGIBLE, CONFIRMED, EXECUTING, INVENTORY_OUTBOUND, SUCCESS and FAILURE; shipment_status is a separate lifecycle on a separate table and does not take the same values. Amazon documents the outbound shipment set as CREATED, IN_TRANSIT, DELIVERED, RECEIVING, RECEIVED, CLOSED, CANCELLED and FAILED, with CLOSED, CANCELLED and FAILED each described as a final state.
How to get it
Through the Selling Partner API there is no report to create. AWD has no report type and no createReport/getReport flow at all — the data exists only behind the synchronous listReplenishmentOrders endpoint, which answers live and paginated. Calling it means filtering on updatedAt over a rolling window, draining every page in one pass, and rendering the four grains out of the combined JSON document.
Three details catch people, all of them places the endpoint differs from the prose around it:
- The response collection is orders, not replenishmentOrders. - The order's status field is status. Inbound orders call the same concept orderStatus, so a client written for inbound and aimed at replenishment silently reads nothing. - Pagination is an opaque cursor followed until it comes back null, and a cursor that repeats itself is a real failure mode — the loop has to guard against one rather than trust the endpoint to terminate.
python-amazon-sp-api does not wrap this endpoint, so the client is yours to write.
All of this presupposes enrolment in AWD. Amazon's own getting-started path is to log in to Seller Central, review AWD's product requirements there, and then create and send shipments to AWD; for an FBA seller there is no fee to enrol, and a Professional selling account is recommended rather than required.
Amazon's account of the console side is thin. Seller Central's Amazon Warehousing and Distribution page is where you "create and track shipments, view and move your AWD inventory, and track replenishments to the Amazon fulfillment network", and the AWD API guide warns that interoperability between the API and Seller Central is currently limited. Neither names a menu path, an export or a console report for replenishment orders, so there is no console route to this data that Amazon documents.
Sample rows
Illustrative values, not data from a real account. Shown to give the shape of the file.
| order_id | status | sku | quantity | created_at | updated_at | confirmed_on | shipment_id |
|---|---|---|---|---|---|---|---|
| AWD-REPL-EXAMPLE-01 | SUCCESS | SKU-EXAMPLE-01 | 600 | 2026-03-02T09:00:00Z | 2026-03-11T14:00:00Z | 2026-03-02T17:30:00Z | SHIP-EXAMPLE-01 |
| AWD-REPL-EXAMPLE-02 | EXECUTING | SKU-EXAMPLE-02 | 240 | 2026-03-08T11:15:00Z | 2026-03-12T08:45:00Z | 2026-03-08T19:00:00Z | SHIP-EXAMPLE-02 |
| AWD-REPL-EXAMPLE-03 | CONFIRMED | SKU-EXAMPLE-03 | 120 | 2026-03-11T07:40:00Z | 2026-03-11T16:20:00Z | 2026-03-11T16:20:00Z | |
| AWD-REPL-EXAMPLE-04 | INELIGIBLE | SKU-EXAMPLE-04 | 60 | 2026-03-12T06:05:00Z | 2026-03-12T06:20:00Z |
Field reference
Main table
| Column | Type | Description |
|---|---|---|
order_id | string | The replenishment order's identity, and the key the other three tables join back on. Amazon lists it among the order's required fields. Together with updated_at it is also the dedupe key here, because an open order is re-emitted on every pull that touches it. |
status | string | Where the order sits in its lifecycle, over CREATED, VALIDATING, ELIGIBLE, INELIGIBLE, CONFIRMED, EXECUTING, INVENTORY_OUTBOUND, SUCCESS and FAILURE. Note the column name — on a replenishment order this is status, not the orderStatus that AWD inbound orders use, so code written against inbound and pointed here reads nothing. Amazon's reference also notes that CREATED is shown as DRAFT in the UI, so a new order is not called the same thing in the console and in the data. |
created_at | timestamp_ms | When the order itself was created — Amazon's createdAt on the replenishment order, not the date of the pull that captured it. The shipments table has a column of the same name holding a different clock. Nothing here carries a data date range, so a stored copy has to be filed by its ingest date instead. |
updated_at | timestamp_ms | When the order last changed. This is the column the pull's rolling window filters on, so it decides whether an order appears in a given run at all, and it is the second half of the (order_id, updated_at) pair a consumer has to dedupe on. The shipments table's updated_at is the shipment's own clock and is not what the window filters. |
confirmed_on | timestamp_ms | When the order was confirmed, as distinct from when the record was first created or last touched. It is the lifecycle timestamp rather than a bookkeeping one. |
products
| Column | Type | Description |
|---|---|---|
order_id | string | The order these product lines belong to. It repeats once per SKU on the order, so here it is a foreign key rather than a row identity — counting rows is not counting orders, and a distinct count is. Amazon's product object carries no order id of its own; the column repeats the parent's. |
kind | string | How AWD classifies this product line on the order. Amazon publishes no field of this name and no value list for one; what a replenishment order does carry is three separate product collections — the requested products, the eligible ones, and the ones shipped once execution completed — which is the likeliest thing the column distinguishes, though nothing confirms it. Group on the column rather than matching against a list. |
sku | string | The seller SKU being moved out of AWD and into FBA — Amazon's "seller/merchant stock keeping unit", required on every product line. Grouping these products rows by this column over a trailing window is what makes a SKU's auto-replenishment share computable. |
quantity | int64 | How much of this SKU the order line covers. Amazon's product object is a bare integer with no unit of measurement on it, and an order's requested products are described as single product units, so this counts individual units rather than cases or pallets. Whether a given row is the requested figure or what actually shipped follows from kind, which is unresolved, so do not read it as units received. |
shipments
| Column | Type | Description |
|---|---|---|
order_id | string | The order this outbound shipment belongs to, carried on Amazon's shipment summary rather than on the order. One order can produce several shipments, so the column is not unique here: it is what joins a shipment back to its order. |
shipment_id | string | The identifier of one outbound shipment created to fulfil the order, and the identity of a shipments row. One order can produce several, so counting shipments rows is not counting orders. |
shipment_status | string | Where this shipment sits in its own lifecycle, tracked separately from the order's status. Amazon documents the outbound set as CREATED, IN_TRANSIT, DELIVERED, RECEIVING, RECEIVED, CLOSED, CANCELLED and FAILED, the last three of them final, and it is neither the order's enum nor the inbound shipment's. Which of the values a real file carries is not something the evidence settles. |
created_at | timestamp_ms | When this shipment was created — a different clock from the orders table's column of the same name, and Amazon defines it separately on the shipment summary. It is the shipment record's own date, not the date of the pull that captured it. |
updated_at | timestamp_ms | When this shipment last changed. It is the shipment's own clock, not the order's: the pull's rolling window filters on the order's updated_at, so this column is not what decides whether the row appears in a given run. |
ineligible
| Column | Type | Description |
|---|---|---|
order_id | string | The order whose validation produced this reason. It repeats once per refused SKU, so it joins back to the orders table rather than identifying the row; an order with nothing refused has no rows here at all. |
sku | string | The SKU AWD would not move on this order — the refusal side of the same SKU that appears on the products table, but not the same guarantee. Amazon's ineligibility object requires only the failure code and its reasons and leaves the SKU optional, so do not assume every reason row names one. |
failure_code | string | The machine-readable reason AWD would not replenish this SKU. Rows exist in the ineligibility grain only where something was refused, so an order with none had nothing rejected. |
failure_reason | string | The readable form of failure_code, meant for a person rather than for matching. Amazon's object carries the reasons as an array of strings under a single code while this table holds one string, so how several reasons under one code are flattened is not established here. Group and alert on the code; show the reason. |
Use cases
Computing the auto-replenishment ratio. The share of a SKU's FBA replenishment that came through AWD over the trailing 90 days is what decides whether Amazon waives its low-inventory-level fee and its 181-365 day aged-inventory surcharge. Amazon exposes no trend for that anywhere — grouping the products rows by sku over the window is how you get one.
Explaining an AWD position that will not move. When stock sits in AWD and nothing reaches FBA, the ineligibility grain names it directly: failure_code and failure_reason per sku, per order. That is the difference between "the order was never placed" and "AWD refused this SKU four times".
Finding orders that have stalled. Everything that has not reached SUCCESS or FAILURE is still open. Pair status with updated_at and an order that has sat in the same state for a fortnight is visible without opening the console.
Tying outbound shipments back to the order that created them. The shipments grain joins on order_id, so a replenishment that arrived in three shipments reconciles against the one order and the quantity it covered.
Seeing what is in flight when FBA looks thin. An order that is confirmed but has not reached SUCCESS or FAILURE is stock already committed out of AWD, which is the number a restock decision needs and the one an FBA inventory snapshot cannot show.
Limitations and gotchas
Duplicates are the design, not an anomaly. Orders stay open for weeks and are re-emitted on every run that touches them, so the same order appears many times across pulls. Dedupe on (order_id, updated_at) before counting anything.
There is no data date on the record. Each pull is filed by its ingest date, and none of the four tables is day-partitioned — partitioning on an order's own dates would scatter one run's duplicates across historical partitions. A count over a date range therefore counts pull copies, not orders, unless you dedupe first.
This is not the Replenishment API. That one is Subscribe and Save, and shares nothing with this but the word. Reports built from the wrong one look plausible and answer a different question entirely.
The four grains do not sum to each other. Products rows are not orders, shipments rows are not orders, and an order appears in the ineligibility grain once per refused SKU. Counting rows in a flattened join overstates all three.
created_at and updated_at exist on two of the grains — the order and the shipment — with different meanings and different clocks, under the same two names. A join that does not disambiguate them quietly picks one and reads as if it were the other.
An untouched order is absent, not closed. The window filters on updatedAt, so an order that has not changed inside it simply does not appear in that pull even though it is still open. An order's history is assembled across runs, never read out of a single one.
FAQ
No. AWD has no report type and no asynchronous createReport flow. The only way to get this data is the synchronous listReplenishmentOrders endpoint, which answers live and paginated.
CREATED, VALIDATING, ELIGIBLE, INELIGIBLE, CONFIRMED, EXECUTING, INVENTORY_OUTBOUND, SUCCESS and FAILURE. The field holding them is called status, not orderStatus as it is on AWD inbound orders.
Because the pull filters on updatedAt over a rolling window and orders stay open for weeks, so every run that touches an order emits it again. Dedupe on the order id together with updatedAt.
It is the share of a SKU's FBA replenishment that came through AWD over the trailing 90 days, which is what decides whether Amazon waives its low-inventory-level fee and its 181 to 365 day aged-inventory surcharge. These orders are the only source for the numerator.
No. The Replenishment API is Subscribe and Save and has nothing in common with AWD replenishment beyond the word replenishment.
Yes. Each order carries per-SKU ineligibility rows with a failure code and a readable failure reason, so a partly rejected order shows exactly which SKUs were refused and why.
Sources
Every researched claim on this page, and the Amazon or Walmart page it came from.
- marketplaces — developer-docs.amazon.com/amazon-warehousing-and-distribution-api-use-case-guide — the AWD API guide carries the callout "This API is available in the Amazon US store", and its availability table gives v2024-05-09 as sellers only. The listReplenishmentOrders host in the reference is sellingpartnerapi-na.amazon.com, the NA endpoint. Amazon publishes no other store for this API.
- fields (status) — developer-docs.amazon.com/listreplenishmentorders — the `ReplenishmentOrderStatus` schema enumerates exactly the nine values the production data carries: CONFIRMED, CREATED, ELIGIBLE, EXECUTING, FAILURE, INELIGIBLE, INVENTORY_OUTBOUND, SUCCESS and VALIDATING. Of CREATED it says "On UI, this status is called DRAFT".
- fields (status, not orderStatus) — developer-docs.amazon.com/listreplenishmentorders — `ReplenishmentOrder` lists `status` in its required fields while `InboundOrder` lists `orderStatus`, and the two enums share no value set, which corroborates the gotcha on this page rather than contradicting it.
- fields (shipment_status) — developer-docs.amazon.com/listreplenishmentorders — `OutboundShipmentSummary.shipmentStatus` is an `OutboundShipmentStatus`, enumerated CREATED, IN_TRANSIT, DELIVERED, RECEIVING, RECEIVED, CLOSED, CANCELLED and FAILED, with CLOSED, CANCELLED and FAILED each described as a final state. It is a different enum from the inbound shipment one.
- fields (quantity) — developer-docs.amazon.com/listreplenishmentorders — `DistributionProduct.quantity` is "Quantity of the product" as a bare int32 with no unit-of-measurement field, unlike AWD inventory quantities which take PRODUCT_UNITS, CASES or PALLETS; the order's `products` array is "Requested amount of single product units to be replenished", so the figure counts individual units.
- fields (kind) — developer-docs.amazon.com/listreplenishmentorders — a `ReplenishmentOrder` carries three separate product collections — `products` (requested), `eligibleProducts` ("List of product units that are eligible for replenishment") and `shippedProducts` ("Outbound product units that are shipped after the execution has completed post confirmation"). Amazon publishes no field named `kind` and no value list for one.
- use cases (SUCCESS and FAILURE as the terminal pair) — developer-docs.amazon.com/listreplenishmentorders — the enum table gives SUCCESS as "If all the shipments are successfully received at the destination channel, the order is marked successful" and FAILURE as "If any of the shipment reports failure or does not reach the destination, the order status is marked as failed". Neither is labelled a final state in the words the outbound shipment enum uses for its own.
- how-to-get-it (response shape) — developer-docs.amazon.com/listreplenishmentorders — `ReplenishmentOrderListing` has `orders` and `nextToken`, and the `nextToken` description says to call the operation until the token is null and warns that "this operation can return empty pages".
- how-to-get-it (Seller Central) — sell.amazon.com/warehousing — "Visit the Amazon Warehousing and Distribution page in Seller Central to create and track shipments, view and move your AWD inventory, and track replenishments to the Amazon fulfillment network." No menu path, no export and no console report is named there.
- requires (fba) — developer-docs.amazon.com/listreplenishmentorders — `getReplenishmentOrder` describes the order as "a set of shipments containing items that is/was planned to be replenished into an FBA node", and sell.amazon.com/warehousing adds that "If you're an FBA seller, there are no fees for enrolling in AWD".
- marketplaces (nothing published at operation level) — developer-docs.amazon.com/awd_2024-05-09-reference — the human-readable AWD reference documents only the inbound and inventory operations. It carries no /awd/2024-05-09/replenishmentOrders path, no listReplenishmentOrders entry, and so no usage plan and no store line for this operation. The `us` value therefore follows Amazon's statement about the AWD API as a whole, not an operation-level one.
- history_window (no retention published) — developer-docs.amazon.com/listreplenishmentorders — the operation documents `updatedAfter` and `updatedBefore` as inclusive ISO-8601 filters, `maxResults` of 1-100 with a default of 25, `nextToken` paged until null, and a default sort of updatedAt descending. It publishes no retention figure and no earliest date the endpoint will answer, and developer-docs.amazon.com/awd_2024-05-09-reference does not carry the operation at all, so the page claims no history window.
- cadence and latency — developer-docs.amazon.com/listreplenishmentorders — listReplenishmentOrders is a synchronous GET over /awd/2024-05-09/replenishmentOrders that returns orders as they stand; nothing in the reference names a publication schedule or refresh interval. `snapshot` describes the data's own period.
- fields (order_id, by table) — developer-docs.amazon.com/listreplenishmentorders — `ReplenishmentOrder.orderId` is "Order Id of the replenishment order" and is one of the order's three required fields, while `OutboundShipmentSummary.orderId` is described as the order "this ... shipment belongs to" (the schema's own wording says "inbound order", which is a copy-paste artefact of the inbound summary it was cloned from). `DistributionProduct` and `DistributionIneligibleReason` carry no order id at all, so the column on the products and ineligibility tables repeats the parent key.
- fields (created_at, updated_at, by table) — developer-docs.amazon.com/listreplenishmentorders — `ReplenishmentOrder` defines createdAt as "Date on which this replenishment order was created" and updatedAt as "Date on which this replenishment order was last updated", while `OutboundShipmentSummary` defines its own createdAt as "Timestamp denoting when the shipment was created" and updatedAt as "Timestamp denoting when the shipment was updated". Two clocks on two objects under one pair of column names, which is why each is described against the table it sits in.
- fields (sku on the ineligibility table) — developer-docs.amazon.com/listreplenishmentorders — `DistributionProduct.sku` is "The seller/merchant stock keeping unit (SKU)" and is required on a product line, but on `DistributionIneligibleReason` the SKU is "SKU associated with the error" and is optional — only `failureCode` and `failureReasons` are required there. The two columns are not the same guarantee, so the ineligibility one is not described as though it were.
- fields (failure_code, failure_reason — doc and evidence differ, the page follows the evidence) — developer-docs.amazon.com/listreplenishmentorders — Amazon's `DistributionIneligibleReason` carries `failureReasons` as an array of strings under a single `failureCode`; the production schema has one `failure_reason` string beside the code. The column list is the production file's and is unchanged. How several reasons under one code are flattened, and whether a reason with no SKU reaches the table, is not settled by either source.
- requires (AWD enrolment, which has no taxonomy term) — sell.amazon.com/warehousing — the real precondition is enrolment in AWD. Amazon's getting-started steps are to log in to Seller Central, "Review requirements ... by reviewing AWD requirements in Seller Central", then "Create and send shipments to AWD", and it adds "If you're an FBA seller, there are no fees for enrolling in AWD" and that a Professional selling account is recommended rather than required. `requires` in this directory carries seller entitlements only and _taxonomy.yaml has no AWD term, so enrolment is stated in the prose and recorded here; the field keeps `fba`.
- upstream.report_type — developer-docs.amazon.com/listreplenishmentorders — Amazon's own name for this data is the operation, not a Reports API report type: the reference page is titled `listReplenishmentOrders`, and the OpenAPI definition behind it gives `"operationId": "listReplenishmentOrders"` for `GET /awd/2024-05-09/replenishmentOrders` under the "Amazon Warehousing and Distribution v2024-05-09" API.