Subscription Billing month reporting (reasons, markets, timing)
Returns the requested month’s failure reporting: decline reasons, market splits, timing buckets, and the daily revenue trend.
Reasons are bucketed through the same category list the Home >
Overview recovery card uses, and recoverability is
Commerce::BillingEvent.retriable_failure? — the predicate the
retry cron itself gates on — so nothing is reported as
recoverable that the chain would refuse to attempt.
Rates are withheld rather than estimated below a sample floor:
a timing bucket reports sufficient_sample: false and a null
rate, and a thin market reports a null top_decline_reason.
Cohort retention is deliberately absent. It has no source in the platform today and is tracked as its own phase.
Authorizations
Bearer token authentication. Requires a company-admin token
whose role holds reports.view.
Query Parameters
Calendar month to report on, as YYYY-MM. Defaults to the
current month. A value that is not this exact shape (or names
a month that does not exist, such as 2026-13) returns 400
rather than being coerced.
^\d{4}-\d{2}$"2026-09"
ISO alpha-2 code of one of the requesting company's configured
countries (see GET /countries). When present, every service
on this endpoint filters its data to that country and reports
money in the country's own currency. Omit (or send "all")
for the aggregate-across-countries view, which is the default
and matches pre-Phase-004 behavior. Unknown ISO codes or ones
the company is not configured for return 400.
"US"
Response
Month reporting payload
"2026-09-01"
ISO 4217 three-letter code (uppercase).
3"USD"
Charges that ran and reached an outcome. Staged and attempted events are excluded — they have no outcome yet, and counting them would deflate every rate here.
x >= 0x >= 0x >= 0A percentage share, expressed as a decimal string rounded to
one decimal place. "100.0" when a single bucket accounts for
the full total; "0.0" when the divisor was zero.
"42.5"
Decimal amount, expressed as a string to preserve arbitrary
precision across the wire. Parsed to Number on the client and
formatted with Intl.NumberFormat. Once the in-flight
money-cents-migration lands, this will switch to a
{ amount_cents: integer, currency: string } object.
"180.25"
Decimal amount, expressed as a string to preserve arbitrary
precision across the wire. Parsed to Number on the client and
formatted with Intl.NumberFormat. Once the in-flight
money-cents-migration lands, this will switch to a
{ amount_cents: integer, currency: string } object.
"180.25"
Cleared money per date, zero-filled across the month.
Ordered by count descending.
Ordered by money descending.
Four six-hour windows partitioning the day, in UTC. These describe when the billing pipeline ran a charge, which is a property of the platform rather than of the reader — unlike the calendar's scheduled half.
Thirds of the month.