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

running with Qore.
All reports
Amazon Seller Central
Account Health

Amazon Seller Performance Report (Account Health)

Amazon's Seller Performance report (GET_V2_SELLER_PERFORMANCE_REPORT) is the Seller Central Account Health page as a JSON file: one snapshot per marketplace, holding roughly twenty named metrics, each with its own status, its own target and its own counts. Trellis lands it as three tables mirroring the page's own sections — customer service performance, policy compliance and shipping performance — so one row is one metric, for one marketplace, over the rolling window Amazon measured it on rather than a date range you asked for.

Known upstream as
One row is
One row per account
Refreshed
Point-in-time snapshot
Columns
50
Marketplaces
not-published
History
Not established. There is no date range to request and no time series inside the file: every window in it is the trailing window Amazon chose for that metric. Amazon's entry for the report type states no retention and no earliest date either. A history of your account health is something you build by keeping each pull, not something you can ask Amazon for.
Latency
Not established. The file carries no data date range, so every pull is a snapshot stamped with the date it was taken — Trellis happens to request it daily, but that is our schedule, not a period the rows cover. How soon Amazon refreshes each metric's own rolling window is not in the evidence, and no Amazon page was found stating it.
Requires

What this report contains

The Seller Performance report is Seller Central's Account Health page handed over as JSON. One document is one marketplace, holding a top-level list of account statuses and a list of performance metrics whose entries carry roughly twenty named metric objects of a few recurring shapes. Trellis lands those as three tables mirroring the sections the page itself draws — customer service performance, policy compliance and shipping performance — so a table can be reconciled against the screen it restates.

One row is one metric, for one marketplace, over that metric's own measurement window. The window is in reporting_date_from and reporting_date_to, and it is Amazon's rolling trailing window for that metric, different from row to row in the same file. It is not a range you asked for, and nothing here is safe to partition by day.

The tables are long rather than wide: metric says which metric a row is, and only the columns belonging to that metric's shape carry values. A metric a marketplace does not have simply emits no row — the US and DE documents carry unitOnTimeDeliveryRate and the CA and BR ones do not, and that shows up as absent rows, not as a half-null column. Late shipment rate is the one metric that arrives as a list of windows rather than a single number, so it lands as several rows that differ only in their window; the figure the Account Health page headlines is the 30-day one.

Every rate and every target in the file is a measurement rather than money — rate, target_value and ahr_score are float, the counts are integers, and nothing here is a currency amount. The targets travel with the rows, so a check can compare rate against the target_value in the same row instead of carrying a number of its own around in code.

How to get it

Through the Selling Partner API, this is the Reports API report type GET_V2_SELLER_PERFORMANCE_REPORT, which answers a JSON document rather than a flat file. You ask for it with a marketplace and nothing else: Trellis requests it bare, with no date range and no report options at all.

That bareness is the trap, and it is one Trellis fell into first. The request used to send ShowSalesChannel — an option that belongs to the order reports — together with a dataStartTime and dataEndTime both set to today. That is a zero-width window asked of a report that measures fixed trailing windows of its own. There is no date range to set here, because every window in the answer is Amazon's choice, not yours.

One document is one marketplace. Every file fawcett has validated carried exactly the requested marketplace's entries in both of its lists, so a multi-marketplace picture is several pulls, not one. The extractors still read each entry's own reported_marketplace_id instead of stamping the requested one on, which means a file that ever did span marketplaces would land visibly rather than quietly mislabelled — and it means your code should read that column too.

In Seller Central, the same numbers are the Account Health page, which sits under the Performance tab — and which the top menu links to directly, since it shows the account health status.

Sample rows

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

reported_marketplace_idmetricreporting_date_fromreporting_date_tostatustarget_valuetarget_conditionrateorder_countlate_shipment_count
ATVPDKIKX0DERlateShipmentRate2026-08-11T00:00:00Z2026-09-10T00:00:00ZGOOD0.0500LESS_THAN0.0120250030
ATVPDKIKX0DERunitOnTimeDeliveryRate2026-08-11T00:00:00Z2026-09-10T00:00:00ZGOOD0.9000GREATER_THAN0.9600
A1PA6795UKMFR9lateShipmentRate2026-08-11T00:00:00Z2026-09-10T00:00:00ZGOOD0.0500LESS_THAN0.0240125030
A2EUQ1WTGCTBG2lateShipmentRate2026-08-11T00:00:00Z2026-09-10T00:00:00ZGOOD0.0500LESS_THAN0.00004000

Field reference

customer_service

ColumnTypeDescription
reported_marketplace_idstringCustomer service table. The marketplace the metric entry names, carried from the entry rather than from the request, exactly as in the other two tables.
metricstringCustomer service table. Which customer service metric the row restates. Amazon's report-type reference names these metric objects as invoiceDefectRate and orderDefectRate, the second of which is split into afn and mfn entries; which of them a given file carries is not established here, and only lateShipmentRate and unitOnTimeDeliveryRate are observed anywhere in the evidence. A metric the marketplace does not carry produces no row at all.
reporting_date_fromtimestamp_msCustomer service table. The start of the metric's measurement window — Amazon's own trailing window for that metric, not a range you asked for.
reporting_date_totimestamp_msCustomer service table. The end of the metric's measurement window. Different metrics in the same file end their windows on different dates.
statusstringCustomer service table. Amazon's verdict on this metric against its target, on the same GOOD, BAD and NONE vocabulary as the other two tables.
target_valuefloat64Customer service table. The target Amazon ships with the row, for this metric and this window. Compare the row's own rate against it rather than carrying a number around in code. Never money.
target_conditionstringCustomer service table. Which side of target_value counts as meeting it — GREATER_THAN, LESS_THAN or EQUALS in Amazon's schema. The direction matters, because some metrics pass by being low and others by being high.
fulfillment_typestringCustomer service table. The fulfilment channel the row covers, on the metrics Amazon splits by channel — Amazon splits the order defect rate into afn and mfn objects and writes those two values. Which of them a real file carries is not established here, so treat it as a grouping key rather than a filter with known contents.
order_countint64Customer service table. Orders in the window, on the metrics measured over orders.
ratefloat64Customer service table. The metric's rate for its window. Never money, and the scale is not established here — compare it against the target_value in the same row rather than against a number of your own.
order_with_defects_countint64Customer service table. Orders in the window counted as carrying a defect. This counts orders, while the three component columns below count events, so they do not necessarily add up to it.
order_with_defects_statusstringCustomer service table. Amazon's status for the orders-with-defects component of the row.
claims_countint64Customer service table. Claims counted against the account in the window.
claims_statusstringCustomer service table. Amazon's status for the claims component of the row.
chargebacks_countint64Customer service table. Chargebacks counted against the account in the window.
chargebacks_statusstringCustomer service table. Amazon's status for the chargebacks component of the row.
negative_feedback_countint64Customer service table. Negative feedback entries counted in the window. Feedback itself, entry by entry, is a different report; this is only the count that feeds this metric.
negative_feedback_statusstringCustomer service table. Amazon's status for the negative feedback component of the row.
invoice_defect_countint64Customer service table. Invoice defects counted in the window. The two columns that follow name kinds of invoice problem, but nothing in the evidence establishes that they sum to this one.
invoice_defect_statusstringCustomer service table. Amazon's status for the invoice defect component of the row.
missing_invoice_countint64Customer service table. Invoices counted as missing in the window.
missing_invoice_statusstringCustomer service table. Amazon's status for the missing invoice component of the row.
late_invoice_countint64Customer service table. Invoices counted as late in the window.
late_invoice_statusstringCustomer service table. Amazon's status for the late invoice component of the row.

policy_compliance

ColumnTypeDescription
reported_marketplace_idstringPolicy compliance table. The marketplace the metric entry names, carried from the entry rather than from the request, exactly as in the other two tables.
metricstringPolicy compliance table. Which policy metric the row restates. Amazon's report-type reference names these metric objects as listingPolicyViolations, the product authenticity, condition and safety complaint metrics, receivedIntellectualPropertyComplaints, suspectedIntellectualPropertyViolations, restrictedProductPolicyViolations, foodAndProductSafetyIssues, customerProductReviewsPolicyViolations and otherPolicyViolations, alongside accountHealthRating; which of them a given file carries is not established here. A metric the marketplace does not carry produces no row at all.
reporting_date_fromtimestamp_msPolicy compliance table. The start of the metric's measurement window — Amazon's own trailing window for that metric, which on the policy metrics is typically far longer than the shipping ones.
reporting_date_totimestamp_msPolicy compliance table. The end of the metric's measurement window.
statusstringPolicy compliance table. Amazon's verdict on this metric against its target, on the same GOOD, BAD and NONE vocabulary as the other two tables.
target_valuefloat64Policy compliance table. The target Amazon ships with the row, for this metric and this window. Compare the row's own count against it rather than carrying a number around in code. Never money.
target_conditionstringPolicy compliance table. Which side of target_value counts as meeting it — GREATER_THAN, LESS_THAN or EQUALS in Amazon's schema.
defects_countint64Policy compliance table. The policy defects counted in the metric's window.
ahr_scorefloat64Policy compliance table. The Account Health Rating score Amazon reports for the marketplace. The scale it is on, and what any particular value means for an account, are not established by the evidence behind this page — read it against target_value and status in the same row.

shipping

ColumnTypeDescription
reported_marketplace_idstringShipping table. The marketplace the metric entry names, carried from the entry rather than from the request, exactly as in the other two tables.
metricstringShipping table. Which shipping metric the row restates. Two values are observed in the evidence, lateShipmentRate and unitOnTimeDeliveryRate; Amazon's report-type reference names the shipping metric objects as lateShipmentRate, onTimeDeliveryRate, unitOnTimeDeliveryRate, validTrackingRate and preFulfillmentCancellationRate, which is what the values are rather than which ones a given file carries. A metric the marketplace does not carry produces no row at all.
reporting_date_fromtimestamp_msShipping table. The start of the metric's measurement window. Late shipment rate arrives as a list of windows rather than a single figure, so several rows of the same metric differ only here and in reporting_date_to.
reporting_date_totimestamp_msShipping table. The end of the metric's measurement window. The headline late shipment rate on the Account Health page is the 30-day entry of that list.
statusstringShipping table. Amazon's verdict on this shipping metric against its target, on the same GOOD, BAD and NONE vocabulary as the other two tables.
target_valuefloat64Shipping table. The target Amazon ships with the row, for this metric and this window. Compare the row's own rate against it rather than carrying a number around in code. Never money.
target_conditionstringShipping table. Which side of target_value counts as meeting it — GREATER_THAN, LESS_THAN or EQUALS in Amazon's schema. The direction matters here, because some shipping metrics pass by being low and others by being high.
ratefloat64Shipping table. The metric's rate for its window. Never money, and the scale is not established here — compare it against the target_value in the same row rather than against a number of your own.
order_countint64Shipping table. Orders in the window, on the metrics measured over orders.
late_shipment_countint64Shipping table. Shipments counted as late in the window — the count behind the late shipment rate rows.
cancellation_countint64Shipping table. Cancellations counted in the window.
shipment_countint64Shipping table. Shipments in the window, on the metrics measured over shipments rather than orders.
valid_tracking_countint64Shipping table. The count of valid tracking behind the valid tracking rate: Amazon's reference pairs validTrackingCount with shipmentCount on validTrackingRate rows. It is not the same column as shipment_count_with_valid_tracking, which belongs to the on-time delivery rate.
shipment_count_with_valid_trackingint64Shipping table. Shipments in the window carrying valid tracking, as the denominator of the on-time delivery rate: Amazon's reference pairs shipmentCountWithValidTracking with onTimeDeliveryCount on onTimeDeliveryRate rows, where valid_tracking_count belongs to validTrackingRate rows instead.
on_time_delivery_countint64Shipping table. Deliveries counted as on time in the window, measured against shipment_count_with_valid_tracking rather than shipment_count — that is the pair Amazon's reference gives the on-time delivery rate.
total_unit_countint64Shipping table. Units in the window — the denominator of the unit-grain delivery metric, which counts units rather than shipments.
unit_on_time_delivery_countint64Shipping table. Units delivered on time in the window. This pair only appears where the marketplace carries the unit on-time delivery metric at all: the US and DE documents did, the CA and BR ones did not.

Use cases

Reconciling a dashboard against the Account Health screen. The three tables were drawn to mirror the page's own three sections, so a customer service number that does not match the screen is a bug in one row, not a modelling argument. metric, reporting_date_from and reporting_date_to identify exactly which figure on the page a row is restating.

Watching a metric move without a time series. The file has no history in it — each pull is a snapshot. Keeping the snapshots and comparing rate for the same metric across them is the only way to see a trend, and it is worth starting before you need it, because a snapshot you did not keep is gone.

Alerting without hardcoding thresholds. target_value and target_condition ride along with each row, so a check can ask whether rate is on the right side of the target Amazon shipped today rather than the one someone typed into a config last year. status carries Amazon's own verdict on the same comparison.

Splitting late shipment rate by window. Because late shipment rate arrives as a list of windows, the shipping table holds several rows for it. Comparing the shorter window against the 30-day one is how you tell a metric that is recovering from one that is still sliding, before the headline figure catches up.

Comparing marketplaces honestly. Pulls from different marketplaces land in the same tables, each row naming its own reported_marketplace_id. Bear in mind the metric set differs — a marketplace with no unitOnTimeDeliveryRate row does not have a worse delivery record, it has a different metric set.

Separating the invoice metrics from the order ones. invoice_defect_count, missing_invoice_count and late_invoice_count sit beside the order-based components in the same table but answer a different operational question, usually owned by a different team than the one watching shipments.

Limitations and gotchas

Nothing here is safe to day-partition on. Every timestamp in the file is a metric's own rolling measurement window, not a requested data range, and the windows differ per metric and per row. Treating reporting_date_to as "the day this data is about" silently invents a time series that does not exist. The report is a snapshot, and the date that identifies a pull is the snapshot date stamped on it.

A missing row is not a zero. Metrics that a marketplace does not carry emit no row at all. Code that reads a metric's rate by looking up a row and defaulting to 0 when it finds none will report a perfect score for a metric that was never measured.

One file is one marketplace. Do not stamp rows with the marketplace you requested — read reported_marketplace_id. That is the column the extractors carry precisely so a file that ever spans marketplaces is visible rather than silently relabelled.

The warning states are not in the tables. The document has a warningStates list that was empty in the production files fawcett has observed, so its element shape has never been seen and it is deliberately not profiled. Because the JSON extractors write only profiled fields, a populated element would be invisible — it would not land anywhere and nothing would complain. If you are looking for a warnings table, that is why there is not one; check a real file before assuming there are no warnings.

Do not sum a column across metrics. The tables are long, and rate, order_count and the count columns mean whatever the row's metric says they mean. Summing order_count over a table adds together denominators from different metrics measured over different windows.

The targets are Amazon's, and the consequences are not in the file. target_value, status and ahr_score say how a metric stands against the threshold Amazon shipped with it. What Amazon does at any given value — and what counts as at risk — is policy, and this file does not carry it. Read the account's own Account Health page and Amazon's policy pages for that.

Do not assume the component counts add up to the headline one. order_with_defects_count counts orders while the claim, chargeback and negative feedback columns count events, and nothing in the evidence settles the arithmetic between them — in Amazon's own schema example those three components together exceed the orders-with-defects count. The invoice columns may run the other way: that schema describes the invoice defect count as the total "due to missing invoice and late invoice", and its example does add up exactly. A document's example is not evidence about a real file, so check one before a report relies on either.

Check the scale before anything compares against a number of its own. Amazon's report schema writes every rate in its examples as a decimal below 1, and then describes the value as a rate "in percentage". The document contradicts itself, so this page does not settle whether rate and target_value arrive as fractions or as percentages. Comparing rate against the target_value in the same row is safe either way, because both come out of the same file; a comparison against a hardcoded figure is not.

The example rows on this page are illustrative. The marketplace ids in them are real, but every number beside them — including target_value — was made up to show the shape of a row. Amazon ships the target with each row for exactly this reason: read it from your own file, never off this page.

FAQ

What is the SP-API report type for the Amazon Seller Performance report?

GET_V2_SELLER_PERFORMANCE_REPORT. It answers a JSON document rather than a flat file, and it takes no date range — every window inside it is a trailing window Amazon chose for that metric.

Is the Seller Performance report the same thing as the Account Health page?

It is that page as a file. The document mirrors the page's own three sections, which is why it lands as three tables: customer service performance, policy compliance and shipping performance.

Why does my file have no unit on-time delivery rate?

Because the metric set varies by marketplace. The US and DE documents carried unitOnTimeDeliveryRate and the CA and BR ones did not, and a metric a marketplace does not carry emits no row rather than an empty one.

Can I pull my account health history from this report?

No. There is no date range to request and no history inside the file, so each pull is a snapshot of where the metrics stood. A history is something you build by keeping every pull.

Why does one file only cover one marketplace?

Every validated document carried exactly the requested marketplace's entries, so several marketplaces means several pulls. Read the reported marketplace id column on each row rather than assuming the marketplace you asked for.

Does this report tell me whether my account is at risk?

It gives you Amazon's own status and target for each metric, plus the account health rating score, which is what the Account Health page compares. What Amazon does at a given value is policy rather than data, and it is not in this file.