What this report contains
One row is one Subscribe & Save offer, identified by sku and asin, as it stands at the moment you pull it. The other two Replenishment API reports say what the program did — subscriptions active, units shipped, revenue lost to stock-outs. This one is the state behind those metrics: whether the offer is eligible at all (eligibility, program_type), what it costs (price, price_currency_code), how much inventory backs it (inventory, stock_risk), how many subscriptions it carries (subscriptions), and how it got into the program (enrollment_method, auto_enrollment).
Four percentage columns say who funds which discount. amazon_funded_base_discount_percentage and selling_partner_funded_base_discount_percentage split the base Subscribe & Save discount between Amazon and you; the two _tiered_discount_percentage columns do the same for the tiered, higher rate. The seller-funded pair is the part you control.
Four delivery columns look forward: next_15_days_deliveries, next_30_days_deliveries, next_60_days_deliveries and next_90_days_deliveries. They are nested windows, not buckets — every delivery in the 15-day count is also in the other three — so adding them together counts the near-term deliveries four times.
Each offer also carries a variable-length list of delivery conditions, which is not one schema with the offer row, so it lands in a second table: sku, asin, condition and a next_30_days_deliveries per condition. That is where you see how many of the coming month's deliveries are paused or at risk rather than simply due. Amazon enumerates five conditions: paused on a pricing issue, paused because the offer is not buyable, at low-inventory risk (two variants), and no issues at all.
Money is decimal so sums reconcile; counts are int64; percentages are float64. Amazon keeps no history of any of this, so a time series of price, discount, inventory or subscriptions exists only because it was snapshotted — and a stored copy has to stamp each pull with the day and marketplace it was taken in.
How to get it
There is no report type for this data and nothing to poll. It comes from the Selling Partner API's Replenishment API (v2022-11-07) through the synchronous listOffers operation: a POST with a JSON body that answers pages of offers directly, rather than the usual createReport/getReport flow. You page through the result with limit and offset. The client has to be built against the marketplace being requested, because that is what selects the regional endpoint, so a multi-marketplace account is one request series per marketplace. Replenishment is available in many marketplaces, not only the US: Amazon's reference names US, CA, ES, UK, FR, IT, IN, DE and JP as the stores supported for sellers, and BR, AU, MX, AE and NL as vendor-only.
The operation is sellers only. Amazon documents it as not supporting vendors, which is why every row here has a SKU where the offer metrics report sometimes does not.
The trap is the page ceiling. offset is capped at 9000, so one request series returns a little over nine thousand offers and then stops silently — no error, no flag, the result simply ends. A catalogue with more Subscribe & Save offers than that cannot be pulled whole through this operation.
The second trap is time. listOffers answers only the present, and Amazon keeps no history of it. If you want to know what an offer's price, discount split or subscription count was last month, the only place that can exist is a snapshot you took last month. History here is something you decide to build, not something that accumulates.
This API family replaced the two Reports API flat files, GET_FBA_SNS_PERFORMANCE_DATA and GET_FBA_SNS_FORECAST_DATA, which Amazon removed on 2025-12-11; those carried performance and forecast figures, and the offer configuration on this page has no flat-file predecessor to fall back on. The offers themselves are visible in the console — Amazon documents reaching the Subscribe & Save page by hovering Growth in the Seller Central main menu, clicking Explore Programs, then Increase conversion, and selecting the Subscribe & Save card, which is where subscription products, discounts, metrics and recommendations are managed — but Amazon documents no export from that page, so the API is the only route to the file.
Sample rows
Illustrative values, not data from a real account. Shown to give the shape of the file.
| sku | asin | price | price_currency_code | inventory | subscriptions | amazon_funded_base_discount_percentage | selling_partner_funded_base_discount_percentage | next_30_days_deliveries | next_90_days_deliveries |
|---|---|---|---|---|---|---|---|---|---|
| EX-SKU-001 | B0EXAMPLE01 | 24.99 | USD | 1800 | 420 | 5.0 | 10.0 | 380 | 1140 |
| EX-SKU-002 | B0EXAMPLE02 | 39.99 | USD | 650 | 185 | 5.0 | 5.0 | 160 | 470 |
| EX-SKU-003 | B0EXAMPLE03 | 14.99 | USD | 40 | 60 | 5.0 | 0.0 | 55 | 165 |
| EX-SKU-004 | B0EXAMPLE04 | 89.00 | USD | 0 | 12 | 5.0 | 0.0 | 10 | 30 |
Field reference
Main table
| Column | Type | Description |
|---|---|---|
sku | string | The seller SKU the Subscribe & Save offer is attached to. With asin it is the row's identity within a marketplace, and that pair is what the delivery conditions table joins back on. The operation serves sellers only, so unlike the offer metrics report there are no vendor rows with the SKU missing. |
asin | string | The ASIN the offer is for. One ASIN can carry several offers if several SKUs sell it, so key on sku and asin together rather than on either alone — and that same pair is the join back from the delivery conditions table. |
program_type | string | The replenishment program the offer belongs to. The Replenishment API is Amazon's programmatic view of Subscribe & Save, and SUBSCRIBE_AND_SAVE is the only value Amazon's reference enumerates — the column exists for the programs it may add later. |
eligibility | string | Whether the offer is eligible for the program at all. This is the first thing to check on an offer that carries no subscriptions: an ineligible offer cannot be subscribed to, whatever its discount. Amazon enumerates four values: ELIGIBLE takes new subscriptions and fulfils existing ones; SUSPENDED fulfils existing subscriptions but takes no new ones; REPLENISHMENT_ONLY_ORDERING is SUSPENDED plus a block on one-time purchases, to keep the inventory for subscribers; and INELIGIBLE takes no new subscriptions and cancels the existing ones. |
price | decimal | The offer's price at the moment of the pull, in price_currency_code. Stored as a decimal so sums reconcile. Because Amazon keeps no history, a price change is visible only by comparing two snapshots. |
price_currency_code | string | The currency price is in. A pull is one request per marketplace, so a file should be uniform, but group on it before comparing prices across marketplaces. |
inventory | int64 | The units of inventory backing the offer when the pull was made. Read it beside next_30_days_deliveries: inventory below the deliveries due is the plain-arithmetic version of what stock_risk labels. |
stock_risk | string | Amazon's own label for whether the offer's stock is at risk against its upcoming deliveries. The values it takes are not documented here yet. |
subscriptions | int64 | The number of subscriptions the offer carries at the moment of the pull. A standing count, not an event count: it does not add across snapshots, and two snapshots differ by net signups minus cancellations. |
fulfillment_network_id_type | string | The type of identifier the fulfilment network uses for this offer, as Amazon labels it. The values it takes are not documented here yet. |
vendor_codes | string | Vendor codes attached to the offer — Amazon defines each as an alphanumeric code representing a relationship between Amazon and a vendor. Present in the schema, but the operation is documented by Amazon as not supporting vendors, so on the seller rows this report actually produces do not expect it populated. |
enrollment_method | string | How the offer came to be enrolled in the program: AUTOMATIC where Amazon enrolled it, MANUAL where someone did. Read with auto_enrollment. |
auto_enrollment | string | Whether the offer is opted in to Amazon's auto-enrolment feature. Typed as a string rather than a boolean, and Amazon's values are OPTED_IN and OPTED_OUT, so test against those rather than against true and false. |
amazon_funded_base_discount_percentage | float64 | The base Subscribe & Save discount on the offer that Amazon funds, as a percentage on a 0-100 scale. One of four columns that together say who pays for which part of the shopper's discount. |
amazon_funded_tiered_discount_percentage | float64 | The tiered Subscribe & Save discount — the rate an order qualifies for beyond the base — that Amazon funds, as a percentage on a 0-100 scale. Whether it is stated on top of the base or inclusive of it is not confirmed from a file. |
selling_partner_funded_base_discount_percentage | float64 | The share of the base discount that you fund, as a percentage on a 0-100 scale. With amazon_funded_base_discount_percentage it makes up the base discount the shopper sees, and it is the lever you actually control — Amazon's own program page describes the seller-funded discount as 0%, 5% or 10%. |
selling_partner_funded_tiered_discount_percentage | float64 | The share of the tiered discount that you fund, as a percentage on a 0-100 scale. The seller-funded counterpart of amazon_funded_tiered_discount_percentage. |
next_15_days_deliveries | int64 | Subscription deliveries scheduled for the offer in the next 15 days. The shortest of four nested windows: every delivery counted here is also counted in the 30, 60 and 90-day columns, so the four are never summed. |
next_30_days_deliveries | int64 | Subscription deliveries scheduled in the next 30 days, including the 15-day window. This is the figure the delivery conditions table breaks down by condition, and the one to hold inventory against — though Amazon nowhere states that the conditions add back up to it. |
next_60_days_deliveries | int64 | Subscription deliveries scheduled in the next 60 days, including the 30-day window. |
next_90_days_deliveries | int64 | Subscription deliveries scheduled in the next 90 days, the widest window and a superset of the other three. Roughly the offer's committed demand for the coming quarter. |
deliveries_conditions
| Column | Type | Description |
|---|---|---|
sku | string | On the delivery conditions table, the SKU of the offer the condition row belongs to. Join it, with asin, back to the offer table. |
asin | string | On the delivery conditions table, the ASIN of the offer the condition row belongs to. |
condition | string | The condition a slice of the offer's upcoming deliveries is under. Amazon enumerates five: NEXT_30_DAYS_DELIVERIES_PAUSED_PRICING (paused on a pricing issue), NEXT_30_DAYS_DELIVERIES_PAUSED_NON_BUYABLE (paused because the offer is not buyable), NEXT_30_DAYS_DELIVERIES_AT_LOW_INVENTORY_RISK and NEXT_30_DAYS_DELIVERIES_AT_LOW_INVENTORY_RISK_ONLY (at risk from low inventory), and NO_ISSUES_FOR_NEXT_30_DAYS_DELIVERIES. Each offer carries a variable-length list of them, which is why they live in their own table. |
next_30_days_deliveries | int64 | On the delivery conditions table, the number of the offer's upcoming deliveries in the next 30 days that are under this condition — Amazon's wording, on the same horizon as the offer table's next_30_days_deliveries. That the conditions add up to exactly that figure is the obvious reading, but it is not stated and is not confirmed on a file. |
Use cases
Finding out why an offer has no subscribers. Before touching the discount, check eligibility and program_type. An offer that is not eligible cannot be subscribed to at any price, and a row with subscriptions at zero and an ineligible flag is a listing or enrolment problem, not a demand problem.
Catching a stock-out before it skips deliveries. inventory beside next_30_days_deliveries is the plain arithmetic; stock_risk is Amazon's own label for the same thing. An offer whose inventory is below its next month of deliveries is about to miss subscriptions, and the offer metrics report will show the lost revenue only after it has happened.
Seeing what the funding split actually is. The four _discount_percentage columns are the only per-offer record of who pays for the shopper's discount. Grouping offers by selling_partner_funded_base_discount_percentage tells you which tier each SKU is in, and joined to the offer metrics report it is the input to whether the extra points you fund buy anything.
Sizing committed demand. next_90_days_deliveries is, per offer, the deliveries already scheduled for the coming quarter — demand that exists before any advertising. Summed by asin (one window only, never all four) it is a floor for the purchase order.
Separating paused deliveries from stock risk. The delivery conditions table breaks next_30_days_deliveries down by condition. A month with many deliveries paused by subscribers reads very differently from one where the same number are at risk because you have no stock, and the offer row alone does not tell them apart.
Tracking configuration changes over time. Because Amazon keeps no history, a daily snapshot of price, subscriptions and the discount columns is the only way to see a price change land, an auto-enrolment happen, or a subscription base drift down. Two snapshots differ by exactly what changed between them.
Limitations and gotchas
There is no history. Amazon states the current configuration and nothing else. A pipeline that starts snapshotting today has no data for yesterday and never will. Anything that assumes it can backfill will find nothing to backfill from.
Nothing refreshes on a schedule. listOffers is answered when it is called, and Amazon publishes no freshness or refresh statement for the operation — neither the reference nor the Replenishment API overview says how current the figures inside the answer are. If you want a time series, something on your side has to call it every day, and that frequency is yours, not the data's: the rows cover no period at all — each one is a position at the instant of the call — which is why this report is a snapshot however often you take it.
The delivery windows nest. next_15_days_deliveries is inside next_30_days_deliveries, which is inside next_60_days_deliveries, which is inside next_90_days_deliveries — Amazon defines each as the projected deliveries in the next 15, 30, 60 or 90 days, all counted forward from now. Sum any one of them across offers; never sum the four together.
Pagination truncates silently. The offset ceiling of 9000 caps a request series at a little over nine thousand rows. Past it the result simply ends, with nothing on the file to say rows were dropped.
Standing counts do not add across days. subscriptions and inventory are positions at the moment of the pull. Summing a month of snapshots gives a number that means nothing; take the latest, or difference two.
Two tables, not one. The delivery conditions are a variable-length list per offer and land in their own table keyed by sku and asin. Reading the offer table alone, you see how many deliveries are due; only the conditions table says how many of them are paused or at risk.
Two label columns have no documented value set. Amazon enumerates program_type, eligibility, enrollment_method, auto_enrollment and condition, and those values are given in the column descriptions above. stock_risk and fulfillment_network_id_type it declares as plain strings with no value list at all, so check a real file before filtering on either. auto_enrollment in particular is a string — OPTED_IN or OPTED_OUT — not a boolean.
Sellers only. Vendors cannot call this operation, and vendor_codes should not be expected to carry anything on the rows this report produces.
Money is not converted. price is in price_currency_code, which follows the marketplace.
This is not the AWD Replenishment Orders report. That report covers inventory moves from Amazon Warehousing and Distribution into FBA and shares nothing with this one but the word.
FAQ
This one is configuration: eligibility, price, inventory, subscription count, who funds the discount, and the deliveries coming up. The offer metrics report is performance: units shipped, subscription revenue and revenue lost to stock-outs per offer per day. Both come from the Replenishment API and join on SKU and ASIN.
Only if you snapshotted it last month. The listOffers endpoint answers the current state and Amazon keeps no history of it, so a time series of any column on this page exists only where someone pulled and stored it day after day.
No. Amazon documents the listOffers operation as not supporting vendors, so this is a Seller Central report and every row carries a seller SKU.
The operation paginates by limit and offset, and offset is capped at 9000. Past that the result ends silently with no error, so a catalogue with more Subscribe & Save offers than that cannot be pulled whole.
No. They are nested windows, each containing the shorter ones, so adding them counts the nearest deliveries four times. Pick the window that matches your planning horizon and sum that one across offers.
The Replenishment API as a whole is. Amazon removed GET_FBA_SNS_PERFORMANCE_DATA and GET_FBA_SNS_FORECAST_DATA on 11 December 2025 and named this API the successor, but those files carried performance and forecast figures; the offer configuration on this page had no flat-file predecessor.
Sources
Every researched claim on this page, and the Amazon or Walmart page it came from.
- marketplaces — developer-docs.amazon.com/listoffers — the MarketplaceId schema in the listOffers OpenAPI definition states: `The supported marketplaces for both sellers and vendors are US, CA, ES, UK, FR, IT, IN, DE, and JP. The supported marketplaces for vendors only are BR, AU, MX, AE, and NL.` This page is the seller-side report, so the nine seller stores are enumerated and the five vendor-only ones (BR, AU, MX, AE, NL) are deliberately left off. All nine have terms in _taxonomy.yaml.
- marketplaces (supporting) — developer-docs.amazon.com/replenishment-api — the Replenishment API page states `The Replenishment API is available wherever Amazon Subscribe & Save is live` and gives listOffers regions NA, EU and FE, which is consistent with the nine-store list but names no stores itself.
- cadence — developer-docs.amazon.com/listoffers — `snapshot`, because cadence records the period the rows themselves cover and these rows cover none. ListOffersRequest takes pagination, filters and a sort and no date, period or as-of parameter, so a row is the offer's configuration at the instant of the call. That listOffers is also a synchronous POST to /replenishment/2022-11-07/offers/search returning `the details of a selling partner's replenishment program offers` directly, with no report to create, schedule or poll, describes the publication mechanism, which cadence does not; it is not a reason to call the data on-demand. Amazon publishes no refresh statement for the operation, so a `daily` value here would record a calling frequency rather than the rows.
- history_window — developer-docs.amazon.com/listoffers — ListOffersRequest requires only `pagination` and `filters`, and the filters are marketplaceId, programTypes, skus, asins, eligibilities, preferences, promotions and deliveriesConditions, with an optional sort. There is no date, period or as-of parameter anywhere in the request, so the endpoint cannot be asked for anything but the present.
- requires — sell.amazon.com/subscribe-and-save — Amazon's own program page: `To participate in Subscribe & Save, your products need to be part of a brand enrolled in Amazon Brand Registry, and you need to be a Brand Representative`, and again in its FAQ: `To be enrolled in Subscribe & Save, your products also need to be part of a brand enrolled in Brand Registry and meet additional eligibility requirements.`
- fields (program_type, eligibility, enrollment_method, auto_enrollment, condition) — developer-docs.amazon.com/listoffers — the OpenAPI definition enumerates ProgramType (SUBSCRIBE_AND_SAVE), EligibilityStatus (ELIGIBLE, INELIGIBLE, SUSPENDED, REPLENISHMENT_ONLY_ORDERING), EnrollmentMethod (MANUAL, AUTOMATIC), AutoEnrollmentPreference (OPTED_IN, OPTED_OUT) and DeliveriesCondition.condition (NEXT_30_DAYS_DELIVERIES_PAUSED_PRICING, NEXT_30_DAYS_DELIVERIES_PAUSED_NON_BUYABLE, NEXT_30_DAYS_DELIVERIES_AT_LOW_INVENTORY_RISK_ONLY, NEXT_30_DAYS_DELIVERIES_AT_LOW_INVENTORY_RISK, NO_ISSUES_FOR_NEXT_30_DAYS_DELIVERIES), each value with its own description. stockRisk and fulfillmentNetworkIDType are declared as plain strings with no enum, which is why those two are still open.
- fields (the four discount percentages) — developer-docs.amazon.com/listoffers — OfferProgramConfigurationPromotionsDiscountFunding.percentage is `The percentage discount on the offer` with `minimum: 0` and `maximum: 100`, so the four columns are on a 0-100 scale.
- fields (delivery windows) — developer-docs.amazon.com/listoffers — ForecastDeliveries is `the projected subscriber demand for the offer over different time horizons` and defines each column as `The projected number of subscriber deliveries in the next 15 / 30 / 60 / 90 days`, all measured forward from now, so each window contains the shorter ones. DeliveriesCondition.next30DaysDeliveries is `The number of upcoming deliveries in the next 30 days associated with this delivery condition`, the same horizon as the offer row's next_30_days_deliveries.
- how-to-get-it (pagination ceiling) — developer-docs.amazon.com/listoffers — ListOffersRequestPagination makes limit and offset both required, with `maximum: 100` on limit and `maximum: 9000` on offset.
- how-to-get-it (console path) — sell.amazon.com/subscribe-and-save — step 5 of Amazon's own program page: `Visit the Subscribe & Save page in Seller Central to manage your subscription products and discounts, review metrics, and get recommendations. You can access the Subscribe & Save page anytime by hovering over Growth in the Seller Central main menu, then clicking Explore Programs. On the next page, click Increase conversion, then select the Subscribe & Save card.` The page documents no export from that view.
- conflict, sellers only (nothing changed) — developer-docs.amazon.com/replenishment-api gives the Replenishment API availability `Sellers and Vendors`; developer-docs.amazon.com/listoffers says `The API is available to vendors and FBA selling partners` and restricts only the `sku` property and the `skus` filter to sellers. The operation behaves as sellers only, and the page follows the sellers-only reading.
- requires (why `fba` is not listed) — sell.amazon.com/subscribe-and-save — Amazon makes FBA the condition for *auto*-enrolment only: `Your products must be sold through Fulfillment by Amazon (FBA) to be auto-enrolled in Subscribe & Save`, and in the same passage `you can also request to enroll a product you fulfill directly by contacting Seller Support`. A merchant-fulfilled product can therefore hold an offer, so `fba` would overstate the entitlement and is deliberately left off `requires`. The Replenishment API overview's `The API is also available to vendors and Fulfillment by Amazon (FBA) selling partners` (developer-docs.amazon.com/replenishment-api) says who the API serves, not that an offer must be FBA-fulfilled. No taxonomy term covers Subscribe & Save enrolment itself, and none was invented.
- latency (Amazon publishes nothing) — developer-docs.amazon.com/listoffers and developer-docs.amazon.com/replenishment-api — re-checked, and neither carries an as-of or freshness statement for the figures inside the answer. `inventory` and `subscriptions` are declared only as the offer's available inventory and its count of active subscriptions. The page therefore claims a live endpoint with no publication lag and explicitly declines to say how current those two figures are.
- fields (stock_risk, fulfillment_network_id_type — no value list) — developer-docs.amazon.com/listoffers — re-checked. Amazon declares both as plain strings with no enum: stockRisk is `The stock risk level of the offer, indicating the risk of the offer going out of stock` and fulfillmentNetworkIDType is `The fulfillment network identifier type for the offer, indicating how the offer is fulfilled`. The vocabularies are not published anywhere on Amazon's domains, so the page says so rather than guessing them; a real file would settle it.
- fields (do the delivery conditions partition the total?) — developer-docs.amazon.com/listoffers — deliveriesConditions is `A list of delivery conditions for the offer, indicating the health of upcoming deliveries`, and `Each condition describes the quantity of upcoming deliveries associated with a particular delivery condition type`. Amazon nowhere states that the list partitions the offer row's next_30_days_deliveries or that the conditions are mutually exclusive, so the page describes each condition's own count and stops short of promising they add up.
- fields (vendor_codes) — developer-docs.amazon.com/listoffers — vendorCodes is `A list of vendor codes associated with the offer`, each entry `An alphanumeric code that represents a relationship between Amazon and a vendor`. That is the whole definition; whether a seller row ever carries one is documented neither way, and the page claims only that it should not be expected to.
- fields (base versus tiered discount) — sell.amazon.com/subscribe-and-save — `Products are enrolled with a 0% seller-funded discount that you can increase to 5% or 10%. Amazon also funds a 5% discount on Subscribe & Save orders of five items or more.` That is additive across funders and says nothing about whether a tiered rate is stated on top of a base rate or inclusive of it within one funder, which is why the two tiered columns stay hedged.
- upstream.report_type — developer-docs.amazon.com/listoffers — this data has no Reports API report type, so Amazon's own name for it is the operation name: `listOffers`, a synchronous POST to /replenishment/2022-11-07/offers/search in the Replenishment API v2022-11-07. That is the identifier the page already states in its title, its summary and the how-to-get-it section. Checked 2026-10-02.