Run everything you never had time to implement. Define your process once, and keep it running with Qore.

All reports
Amazon Seller Central
Replenishment & Subscribe and Save

Amazon Subscribe & Save Offer Metrics Report (Replenishment API)

Amazon's Replenishment API offer metrics give you one row per Subscribe & Save offer per day, identified by ASIN and SKU, carrying the subscriptions active on the offer, the subscription units and revenue that shipped, the revenue lost to out-of-stock deliveries, and the share of the offer's revenue and subscriptions that run through the program. It is pulled live from the listOfferMetrics endpoint rather than as a Reports API file, and since December 2025 it is the only programmatic source of per-ASIN Subscribe & Save performance Amazon offers.

Known upstream as
listOfferMetrics
One row is
One row per offer
Refreshed
Daily
Columns
22
Marketplaces
United States, Canada, Mexico, Brazil, United Kingdom, Germany, France, Italy, Spain, Netherlands, United Arab Emirates, India, Japan, Australia
History
Two years. Amazon's reference states that only data for the trailing two years is supported on this endpoint's time interval. Within that window recent days are restated after they first appear, so a day read once will not match what the endpoint answers for it later.
Latency
Subscribe & Save figures are restated late, so a day's numbers are not settled when they first appear. Amazon publishes no freshness or refresh statement for this operation, and how soon after a day ends Amazon first reports it has not been confirmed.
Requires

What this report contains

One row is one Subscribe & Save offer on one day. The offer is identified by asin and sku (vendors get no SKU, so on their rows asin alone is the identity), and the day is bounded by time_interval_start_date and time_interval_end_date, which on this endpoint always enclose a single day because Amazon will only answer an interval of exactly one aggregation unit.

The columns fall into four groups. Descriptive columns — brand_name, product_group, fulfillment_channel_type, currency_code — say what the offer is. Performance columns say what happened to it that day: active_subscriptions (a standing count, not an event count), shipped_subscription_units and total_subscriptions_revenue (both flows that add across days), and the two out-of-stock columns, lost_revenue_due_to_oos and not_delivered_due_to_oos. Rate columns — revenue_penetration, coupons_revenue_penetration, share_of_coupon_subscriptions — say how much of the offer's business runs through the program and through coupons.

The fourth group is six forecast columns, next_30_day_…, next_60_day_… and next_90_day_… for both units and revenue. The API declares them, so they are in the schema, but a PERFORMANCE pull — the only kind this report makes — can never carry a value in them. Amazon's reference marks only TOTAL_SUBSCRIPTIONS_REVENUE and SHIPPED_SUBSCRIPTION_UNITS as applying to both timePeriodType values; every other metric, these six included, is PERFORMANCE-only, and a forecast is a separate FORECAST request covering the next 30, 60 and 90 days. So these are always null here — not a gap in the data, but the shape of the request.

Money is decimal so sums reconcile; counts are int64; rates are float64. All three rate columns are percentages on a 0–100 scale in Amazon's own schema, and so is not_delivered_due_to_oos: it is the percentage of items that went unshipped out of total shipped units because the offer was out of stock, a share rather than a count of missed deliveries.

How to get it

There is no report type for this data. It comes from the Selling Partner API's Replenishment API (v2022-11-07), Amazon's programmatic view of Subscribe & Save, through the synchronous listOfferMetrics operation: a POST with a JSON body rather than the usual createReport/getReport flow, answering pages of offers directly. You ask for PERFORMANCE metrics, a DAY aggregation frequency, and a time interval, and page through the result with limit and offset.

The trap is the interval. Amazon accepts only an interval covering a single unit of the aggregation frequency, so at the day grain that means one day per request; ask for a week or a month and the call is refused with InvalidInput rather than answered. To build history you issue one request per marketplace per day, and recent days are worth requesting more than once: Subscribe & Save figures are restated late, so a day read once has no second chance at it.

The second trap is the page ceiling. offset is capped at 9000, so one request series returns at most roughly 9,500 rows and then stops silently — nothing tells you rows were dropped. At one row per offer per day that is ample headroom; over a multi-day interval (if Amazon allowed one) it would truncate any seller with more than about 315 offers.

The client has to be built against the marketplace being requested, because that is what selects the regional endpoint. Replenishment is not a US-only API: Amazon documents the supported stores as US, CA, ES, UK, FR, IT, IN, DE and JP for sellers and vendors alike, plus BR, AU, MX, AE and NL for vendors only.

The two Reports API flat files that used to carry this data, GET_FBA_SNS_PERFORMANCE_DATA and GET_FBA_SNS_FORECAST_DATA, were removed by Amazon on 2025-12-11, and Amazon named this API as the replacement. Requests for the old report types end CANCELLED or return header-only files.

Sellers have a console route to the program itself: hover Growth in the Seller Central main menu, click Explore Programs, then Increase conversion, and pick the Subscribe & Save card. Amazon says that tool's Dashboard tab shows Subscribe & Save performance and offers a performance report to download, but it does not publish that download's columns, so do not assume its columns are the ones here.

Sample rows

Illustrative values, not data from a real account. Shown to give the shape of the file.

time_interval_start_dateasinskubrand_nameactive_subscriptionsshipped_subscription_unitstotal_subscriptions_revenuelost_revenue_due_to_oosrevenue_penetrationcurrency_code
2026-09-14B0EXAMPLE01EX-SKU-001Example Brand420961919.040.0031.5USD
2026-09-14B0EXAMPLE02EX-SKU-002Example Brand185401199.600.0022.0USD
2026-09-14B0EXAMPLE03EX-SKU-003Example Brand608119.9274.959.8USD
2026-09-14B0EXAMPLE04EX-SKU-004Example Brand1200.000.000.0USD

Field reference

ColumnTypeDescription
asinstringThe ASIN the Subscribe & Save offer is for. Together with sku and the interval dates it is the row's identity; on vendor rows, where sku is null, it is the whole identity.
skustringThe seller SKU behind the offer. Null on vendor rows — the endpoint serves sellers and vendors both, and vendors have no SKU here — so never join on this column alone.
brand_namestringThe brand Amazon has on record for the ASIN. Repeated across every offer of that brand, so grouping on it gives brand-level Subscribe & Save totals.
product_groupstringAmazon's product group for the ASIN, its top-level catalogue classification. Amazon documents the field as supported for vendors only — the exact mirror of sku — so expect it empty on seller rows even though the column is in the schema.
fulfillment_channel_typestringHow the offer is fulfilled, as Amazon labels it: AMAZON where Amazon fulfils the offer's orders and MERCHANT where the seller does. Amazon documents the field as valid for sellers only, so expect it empty on vendor rows.
currency_codestringThe currency every money column in the row is in. The pull is one request per marketplace, so a file should be uniform, but group on it before summing revenue all the same.
time_interval_start_datetimestamp_msThe start of the interval the row covers. Amazon only accepts an interval of exactly one aggregation unit on this endpoint, and this report asks at the DAY grain, so the interval is a single day.
time_interval_end_datetimestamp_msThe end of that one-day interval. With time_interval_start_date it bounds the day the row describes.
active_subscriptionsint64The number of live Subscribe & Save subscriptions on the offer in the interval. A count of standing subscriptions, not of events, so it does not add across days.
shipped_subscription_unitsint64Units shipped against subscriptions during the interval. Unlike active_subscriptions, this does add across days.
total_subscriptions_revenuedecimalRevenue from the subscription units that shipped in the interval, in currency_code. Stored as a decimal so sums reconcile to the cent.
lost_revenue_due_to_oosdecimalRevenue Amazon attributes to subscription deliveries that could not ship because the offer was out of stock, in currency_code.
not_delivered_due_to_oosfloat64Amazon's percentage of items that went unshipped, out of total shipped units, because the offer was out of stock. A share on a 0–100 scale rather than a count of missed deliveries, which is why it is typed as a float.
revenue_penetrationfloat64Subscribe & Save revenue as a share of the offer's revenue — how much of what the offer sells goes out on subscription. Amazon defines it as total program revenue over total product revenue, as a percentage on a 0–100 scale.
coupons_revenue_penetrationfloat64The percentage of revenue from ASINs carrying coupons out of total revenue from all ASINs, on the same 0–100 scale.
share_of_coupon_subscriptionsfloat64The percentage of new subscriptions that came from coupons, on the same 0–100 scale.
next_30_day_shipped_subscription_unitsint64Declared by the API as a forecast of subscription units shipping in the next 30 days. Always null here: Amazon marks this metric PERFORMANCE-only, and forecasts come from a separate FORECAST request that this report does not make.
next_60_day_shipped_subscription_unitsint64The 60-day version of the forecast column. Always null here.
next_90_day_shipped_subscription_unitsint64The 90-day version of the forecast column. Always null here.
next_30_day_total_subscriptions_revenuedecimalDeclared by the API as forecast subscription revenue for the next 30 days. Always null here, for the same reason as the 30-day units column.
next_60_day_total_subscriptions_revenuedecimalThe 60-day version of the forecast revenue column. Always null here.
next_90_day_total_subscriptions_revenuedecimalThe 90-day version of the forecast revenue column. Always null here.

Use cases

Finding which offers your Subscribe & Save revenue actually rests on. Rank offers by total_subscriptions_revenue and active_subscriptions over a month of daily rows. A handful of ASINs usually carry most of the recurring revenue, and those are the ones whose stock and price you protect first.

Putting a dollar figure on stock-outs. lost_revenue_due_to_oos is Amazon's own estimate of the subscription revenue that did not ship because the offer had no stock, and a subscription delivery that fails is a subscriber who may cancel. Summed by asin across the fortnight it makes the case for a restock far better than a units-on-hand number does.

Measuring how deep the program has reached into an ASIN. revenue_penetration shows how much of an offer's sales already run on subscription. A high-velocity consumable with low penetration is where a Subscribe & Save discount or coupon has room to move demand; one already at high penetration is where a discount mostly gives margin away.

Judging whether coupons are buying subscriptions or just discounting them. share_of_coupon_subscriptions beside coupons_revenue_penetration tells you what fraction of the subscriber base arrived on a coupon and how much revenue that slice carries.

Brand- and category-level roll-ups. brand_name repeats on every offer, so grouping on it gives Subscribe & Save totals for a brand without a separate catalogue join. product_group does the same for a category, but only where it is populated: Amazon documents it as supported for vendors and not for sellers, so check it on your own rows before building a category roll-up on it. Either way, bear in mind the standing-versus-flow distinction below.

Limitations and gotchas

The forecast columns are empty. All six next_30/60/90_day_… columns come back with no value on a PERFORMANCE pull, which is the only pull made. Any dashboard built on them will show nulls, not zeros. A FORECAST pull would be a separate report and table, deliberately not mixed into this one under a flag, because a table holding both forecast and actuals is how a consumer ends up summing both.

One day per request, no exceptions. A multi-day interval is refused with InvalidInput. Anything that assumes it can pull a month in one call will fail on the first request.

Pagination truncates silently. The offset ceiling of 9000 caps a request series at roughly 9,500 rows. Past it the result simply ends; there is no error and no flag on the file.

Recent days get restated, late. Amazon revises Subscribe & Save figures well after the day, and publishes no statement of when a day settles. A day pulled once and never revisited will drift away from what Amazon later reports.

active_subscriptions is a standing count. It is the subscriptions live on that day, not an event. Summing it over a month does not give monthly subscriptions; it gives a number that means nothing. Average it, or take the latest day.

sku is null on vendor rows. The endpoint serves sellers and vendors both, and vendor rows have no SKU. Joins keyed on sku will drop every vendor row.

Account-level Subscribe & Save measures are not here. Subscriber retention, lifetime value by customer segment, and revenue penetration and signup conversion by seller-funding band come from a different operation, getSellingPartnerMetrics, and cannot be derived from these per-offer rows. They are also awkward to store at a day grain, because Amazon states each over its own trailing window rather than over the day that was requested.

Money is not converted. Every money column is in currency_code. Sum across marketplaces only after grouping on it.

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

Is this the same as the old Subscribe & Save Performance report?

It is the replacement. Amazon removed the GET_FBA_SNS_PERFORMANCE_DATA and GET_FBA_SNS_FORECAST_DATA flat files on 11 December 2025 and named the Replenishment API as the successor. Requests for the old types now end cancelled or return header-only files.

Why are the next 30, 60 and 90-day columns empty?

The API declares them, but a PERFORMANCE pull carries no value in any of them. They most likely need a separate FORECAST pull, which this report does not make, so expect nulls rather than zeros.

Can I pull a whole month in one request?

No. On this operation Amazon accepts an interval covering only a single unit of the aggregation frequency, so at the day grain it is one day per request. A longer interval is refused with an InvalidInput error.

Why is the SKU blank on some rows?

The endpoint serves sellers and vendors both, and vendor rows carry no SKU. Identify those rows by ASIN instead.

Does this report include subscriber retention or lifetime value?

No. Retention, lifetime value by customer segment and the seller-funding-band breakdowns are account-level measures from the getSellingPartnerMetrics operation and cannot be derived from per-offer rows.

How often should I re-pull it?

A row covers a single day, so a daily pull is what keeps the history complete — and over a rolling window rather than a single day, because Subscribe & Save figures are restated late. Amazon publishes no statement of how long a day takes to settle, so how wide that window needs to be is a judgement call.

Sources

Every researched claim on this page, and the Amazon or Walmart page it came from.

  • fields (the six next_30/60/90_day columns) — developer-docs.amazon.com/getsellingpartnermetrics — the metric list marks only TOTAL_SUBSCRIPTIONS_REVENUE and SHIPPED_SUBSCRIPTION_UNITS as applicable to both PERFORMANCE and FORECAST timePeriodType; every other metric is PERFORMANCE-only, and FORECAST is a separate request for the next 30/60/90 days. Found while verifying the sibling selling-partner-metrics page, which shares this API.
  • marketplaces — developer-docs.amazon.com/listoffermetrics — the `MarketplaceId` schema in the operation's 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.` The value is the union of the two, and all fourteen have terms in _taxonomy.yaml
  • marketplaces — developer-docs.amazon.com/replenishment-api — `listOfferMetrics` carries `Regions: NA, EU, FE`, but the same page qualifies it: `The Replenishment API is available wherever Amazon Subscribe & Save is live`. That qualifier is why the value is the enumerated list from the reference rather than `all`
  • seller_type — developer-docs.amazon.com/replenishment-api — the version table gives `Availability: Sellers and Vendors`, and the page states `The API is also available to vendors and Fulfillment by Amazon (FBA) selling partners`. Hence `both` rather than sellers only, which the null `sku` on vendor rows in the production files already implied
  • history_window — developer-docs.amazon.com/listoffermetrics — the `TimeInterval` schema states `Note that only data for the trailing 2 years is supported`
  • fields (revenue_penetration, coupons_revenue_penetration, share_of_coupon_subscriptions) — developer-docs.amazon.com/listoffermetrics — all three are `type: number`, `format: double`, `minimum: 0`, `maximum: 100`, so the scale is 0–100 rather than 0–1, matching the sample. Amazon's denominators are `The percentage of total program revenue out of total product revenue`, `The percentage of revenue from ASINs with coupons out of total revenue from all ASINs`, and `The percentage of new subscriptions from coupons`
  • fields (not_delivered_due_to_oos) — developer-docs.amazon.com/listoffermetrics — `The percentage of items that were not shipped out of the total shipped units over a period of time due to being out of stock`, with `minimum: 0` and `maximum: 100`. A share on a 0–100 scale, not a count, which is consistent with the float64 typing the production schema records
  • fields (fulfillment_channel_type) — developer-docs.amazon.com/listoffermetrics — the `FulfillmentChannelType` enum is `AMAZON` (`Orders for this offer are fulfilled by Amazon.`) and `MERCHANT` (`Orders for this offer are fulfilled by the merchant.`), and the schema adds `this is only valid for sellers and not for vendors`
  • how-to-get-it — sell.amazon.com/subscribe-and-save — `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.`
  • how-to-get-it — sell.amazon.com/subscribe-and-save — `You can track the results of your program participation on the Dashboard tab of the Subscribe & Save tool in Seller Central` and `You can also download a performance report on the Dashboard tab of the Subscribe & Save tool in Seller Central`. Amazon does not publish that download's columns, so the page does not claim they match this API's
  • requires (left empty) — sell.amazon.com/subscribe-and-save — `Your products must be sold through Fulfillment by Amazon (FBA) to be auto-enrolled in Subscribe & Save. But you can also request to enroll a product you fulfill directly by contacting Seller Support.` and `To participate in Subscribe & Save, your products need to be part of a brand enrolled in Amazon Brand Registry`. The first rules `fba` out as a hard requirement; the second is a seller-side program rule that does not hold for the vendor half of `seller_type: both`
  • requires (`professional-plan` not claimed) — sell.amazon.com/subscribe-and-save — the enrolment steps say `We recommend using a Professional selling plan so you can take advantage of a full range of services`, and the footnote on sell.amazon.com/subscribe-and-save only prices it (`A Professional selling plan is $39.99 a month + selling fees`). Amazon recommends the plan rather than requiring it for Subscribe & Save, so it is not an entitlement this report depends on
  • latency (not published) — developer-docs.amazon.com/listoffermetrics — the operation's OpenAPI definition carries no freshness, refresh or publication statement at all. The nearest sentence is the `TimeInterval` note `The end date may be adjusted to a lower value based on the data available in our system`, which says a request can run past the data but not when a given day first appears. developer-docs.amazon.com/replenishment-api and sell.amazon.com/subscribe-and-save were checked too and describe the Dashboard without stating how current it is. The late restatement of recent days is an observation from the production files, not a published figure
  • fields (product_group) — developer-docs.amazon.com/listoffermetrics — the `productGroup` property is documented as `The product group associated with the offer. This property is only supported for vendors and not for sellers.`, the exact mirror of `sku` (`only supported for sellers and not for vendors`). The production schema carries the column, so the column list is unchanged; what Amazon documents is which half of `seller_type: both` populates it, and the column description and the roll-up use case now say so. Only a real seller file settles whether it is in fact empty there
  • upstream.report_type — developer-docs.amazon.com/listoffermetrics — Amazon's own name for this data is the operation, not a Reports API report type: the reference page is titled `listOfferMetrics`, and its OpenAPI definition gives `"operationId": "listOfferMetrics"` on `POST /replenishment/2022-11-07/offers/metrics/search` under `"title": "Replenishment v2022-11-07"`