Subscriptions reports contain information about the current state of your subscriptions, including status, items, billing cycle, billing dates, and customer location.
Use them to understand the shape of your subscription base and discover actionable patterns.
When to use
- Review your subscription base
See how subscriptions break down by status, billing cadence, currency, and country. - Build segments to act on
Find the subscriptions that need attention, like trials that haven't converted, subscriptions with an overdue payment, or subscriptions scheduled to cancel. - Automate reporting workflows
Generate reports via API to feed subscription data into your own dashboards and business intelligence tools.
Report filters
When generating subscriptions reports, you can filter by:
| Field | Description | Use case |
|---|---|---|
subscription_status | Filter by subscription status. Pass one or more of the following statuses: active, canceled, past_due, paused, and trialing. | Reporting on a single part of the base, like subscriptions with an overdue payment. |
subscription_created_at | Filter by the date range when subscriptions were created. Pass an RFC 3339 datetime string with a gte or lt operator, and combine two filters to scope to a specific range. If you don't pass this filter, the report includes every subscription ever created. | Reporting on subscriptions created in a specific period, or limiting the size of the report output. |
customer_country_code | Filter by customer country. Pass one or more two-letter ISO 3166-1 alpha-2 country codes, like US or GB. | Comparing your subscription base in specific markets. |
How customer country is determined
Paddle resolves a customer's country from the country their most recent completed subscription transaction was taxed in. Where that transaction has no tax country recorded, the country on the billing address of that transaction is used. If a subscription doesn't have any completed transactions, Paddle uses the country on the subscription's current billing address.
Because of this, the customer country may differ from the subscription's current billing address.
Subscriptions reports are updated daily and show each subscription's current state. For example, a canceled subscription is displayed with a canceled status, no matter what status it had while it was active. It's not possible to generate a subscriptions report for a past date.
Report columns
Each row in the report is one subscription. Columns cover the details, content, and amounts of the subscription:
- Identifiers: the subscription and the objects it's linked to, like
subscription_id,customer_id,business_id, andaddress_id. - Status and lifecycle: what state the subscription is now and when it got there, like
subscription_status,subscription_created_at, andsubscription_canceled_at. - Billing cycle: how and when the subscription bills, like
subscription_billing_intervalandsubscription_billing_frequency. - Items: what the subscription includes, like
subscription_item_countandsubscription_total_units. - Trials: how the subscription trial was set up and whether it converted, like
subscription_trial_typeandsubscription_trial_amount. - Amounts, discounts, and totals: what the last cycle billed and what discounts take off it, and what the subscription has charged, refunded, and lost to chargebacks overall.
Column headings on subscriptions reports mirror fields in the Paddle API. Data is provided in the following columns:
sub_01h04vsc0qhwtsbsxh3422wjs4sub_.^sub_[a-z\d]{26}$ctm_01grnn4zta5a1mf02jjze7y2ysctm_.^ctm_[a-z\d]{26}$biz_01grrebrzaee2qj2fqqhmcyzajbiz_. null if this subscription isn't billed to a business.^biz_[a-z\d]{26}$add_01gm302t81w94gyjpjpqypkzkfadd_.^add_[a-z\d]{26}$2026-05-12T07:20:50.52Zsubscription_started_at and can be a lot later, so use subscription_started_at for when a subscription began. The subscription_created_at filter matches on this column.2026-05-12T07:25:11.00Zsubscription_created_at for when a subscription began. The two are usually within a second of each other for a subscription that came from a checkout, and can sit years apart for an imported subscription, which was already running before it reached Paddle.2026-06-12T07:25:11.00Z2026-05-12T07:25:11.00Z2026-06-12T07:25:11.00Z2026-04-28T07:20:50.52Znull if this subscription never had a trial.2026-05-12T07:20:50.52Znull if this subscription never had a trial.null if no change is scheduled.null if no cancellation is scheduled.null if no pause is scheduled.null if no resume is scheduled.null if no end is scheduled.2026-05-12T07:25:11.00Znull if this subscription has never billed.active. The subscription_status filter takes these same values.activePaddle is billing for this subscription and it isn't past due.canceledThis subscription is canceled.past_dueThis subscription has an overdue payment.pausedThis subscription is paused.trialingThis subscription is in trial.
null if no change is scheduled.cancelThis subscription is scheduled to cancel.pauseThis subscription is scheduled to pause.resumeThis subscription is scheduled to resume.
automaticPaddle charges a saved payment method automatically.manualPaddle invoices the customer, who pays against the invoice.
checkout or import. This isn't a fixed set of values, so handle unrecognized values gracefully.paddle_classic or stripe. null for subscriptions created in Paddle Billing. This isn't a fixed set of values, so handle unrecognized values gracefully.customer_request, seller_request, or chargeback. A reason isn't always recorded, so null is common even for canceled subscriptions. This isn't a fixed set of values, so handle unrecognized values gracefully.subscription_billing_frequency, which says how many of these units each cycle spans. null if the billing cadence isn't an exact multiple of one of these units.dayBilling cycles are measured in days.weekBilling cycles are measured in weeks.monthBilling cycles are measured in months.yearBilling cycles are measured in years.
subscription_billing_interval units each billing cycle spans. With an interval of month, 1 is monthly and 3 is quarterly. null if subscription_billing_interval is null. The two are always null together.subscription_last_billed_cycle_amount and subscription_discount_amount. Matches subscription_currency_code, except for the few subscriptions whose billing currency changed after their last cycle billed. Amounts are never silently converted. null if this subscription has never billed.subscription_last_billed_cycle_amount_in_balance_currency and subscription_discount_amount_in_balance_currency — the currency the last billed cycle actually settled in. This isn't always balance_currency_code, the currency you're paid out in today, because a subscription's earlier cycles can have settled in a currency you've since changed. null if this subscription has never billed, or if the settlement currency for that cycle couldn't be resolved. If the last billed cycle is the transaction that imported this subscription, this falls back to balance_currency_code instead. That applies only while that import charge is the last billed cycle — once the subscription renews on Paddle, this column resolves from that renewal instead.subscription_trial_amount. null if the trial detail hasn't been processed yet, which can happen for a trial that started recently.noneThis subscription never had a trial.paidThe trial was configured with a price above zero.freeThe trial was configured without a price.
subscription_trial_amount. null if subscription_trial_amount is null.subscription_trial_amount_in_balance_currency — the currency the trial charge actually settled in. This can differ from subscription_last_billed_balance_currency_code on the same subscription, because the trial charge settled on its own, earlier date. null if subscription_trial_amount is null, or if the settlement currency for the trial charge couldn't be resolved. If the trial charge is the transaction that imported this subscription, this falls back to balance_currency_code instead._balance_currency_code column that sits beside each amount. One of USD, GBP, EUR, CAD, or AUD. Paddle can add payout currencies, so treat this as an open set.subscription_total_spend_gross, subscription_total_refunded, subscription_total_charged_back, and subscription_total_spend_net — the single currency that all of this subscription's charges and adjustments share. This isn't always subscription_currency_code: a subscription whose billing currency changed keeps its earlier charges in the earlier currency, and these columns cover those too. null if this subscription's charges and adjustments span more than one currency, and null where those four columns read 0 because this subscription has none._in_balance_currency columns — the currency each charge actually settled in, not balance_currency_code, the currency you're paid out in today. null if this subscription's charges settled in more than one currency over its life, if none of them has a settlement currency Paddle could resolve, or if the four lifetime totals net to exactly 0.UScustomer_country_code filter matches on this column.pro_. That's a property of each item rather than of the subscription, so this stays populated for nearly all canceled subscriptions and for most paused ones — read it together with subscription_status if you want only the subscriptions Paddle bills today. Empty where no item is both recurring and still active.active_recurring_product_id_list, in the same order and of the same length. Holds an empty string if a product has no name.pri_. Same item-level caveat as active_recurring_product_id_list: it stays populated for nearly all canceled subscriptions and for most paused ones.active_recurring_price_id_list, in the same order and of the same length. Usually holds empty strings, because most prices have no name set.pro_. It's a superset of active_recurring_product_id_list, not an addition to it. The two are identical for most subscriptions and differ if items changed. This is the only one of the two that's populated when no item is both recurring and still active.historic_product_id_list, in the same order and of the same length.pri_.historic_price_id_list, in the same order and of the same length.dsc_, ordered by discount ID. Empty if no recurring discount is in force.discount_id_list, in the same order and of the same length. A code is optional, and a discount that you apply directly has none, so its position holds an empty string.true if the subscription later cancels. false also covers not yet converted, like a trial that's still running or a first charge after the trial that's still in flight. null if this subscription never had a trial, or where its trial detail hasn't been processed yet.true after a chargeback is reversed.subscription_item_count covers. Equals subscription_item_count if every item has a quantity of one, and is never lower than it.subscription_last_billed_currency_code. A decimal amount in the major unit of the currency, like dollars rather than cents. It reports what the last completed cycle charged, not what the subscription's current items would bill, so it can be out of date if items changed since. Excludes proration, one-off charges, and card verification charges. For a subscription that's still in a trial, the last billed cycle is the trial charge. May be negative, like where a mid-cycle downgrade prorated the cycle. null if this subscription has never billed.subscription_last_billed_cycle_amount converted to subscription_last_billed_balance_currency_code at the rate Paddle applied when that cycle settled, not at today's rate, so the converted amount doesn't move between reports. Reads the same as subscription_last_billed_cycle_amount if the cycle already billed in its settlement currency. If the last billed cycle is the transaction that imported this subscription, there's no settlement record to take a rate from, so this is an estimate converted into balance_currency_code at the average rate for the day that cycle billed. Because that targets the currency you're paid out in today, changing your payout currency changes the estimate, and once the subscription renews on Paddle this column carries the rate that renewal settled at instead. null if this subscription has never billed, or if no rate could be resolved for the cycle — like a cycle covered entirely by customer credit, a negative mid-cycle proration, or a payment that hasn't settled yet.subscription_trial_currency_code. A decimal amount in the major unit of the currency, like dollars rather than cents. The trial charge is the first cycle billed during the trial. A free trial normally reads 0, which is what it charged, so use subscription_trial_type to tell paid trials from free ones. null if this subscription never had a trial, or where Paddle hasn't resolved the trial charge.subscription_trial_amount converted to subscription_trial_balance_currency_code at the rate Paddle applied when the trial charge settled, not at today's rate. Reads the same as subscription_trial_amount if the trial already billed in its settlement currency. If the trial charge is the transaction that imported this subscription, this is an estimate converted into balance_currency_code at the average rate for the day that charge billed, which is rare, because an imported subscription almost never has a trial charge in Paddle. null if subscription_trial_amount is null, or if no rate could be resolved for the trial charge.0, not null, if there are none.subscription_last_billed_currency_code. A decimal amount in the major unit of the currency, like dollars rather than cents. This is current per-cycle exposure, not a lifetime total or an amount already collected. null if no recurring discount is in force, or if the basis can't be established — like a subscription that has never billed, or whose last cycle credited rather than charged.subscription_discount_amount converted the same way as subscription_last_billed_cycle_amount_in_balance_currency, and labeled by the same currency column, subscription_last_billed_balance_currency_code — the discount applies to that cycle, so it shares its settlement currency and rate. null if subscription_discount_amount is null, or if no rate could be resolved for the cycle.0, not null, if this subscription has never billed.subscription_started_at to the cancellation, or to the last update for a subscription that's still active or paused. Pausing doesn't stop this count. Elapsed time only — uncapped, and not projected forward.subscription_total_spend_currency_code. A decimal amount in the major unit of the currency, like dollars rather than cents. Given as a positive amount, not a negative one. Isn't net of chargebacks — see subscription_total_charged_back. 0, not null, if this subscription has no refunds. null if its charges and adjustments span more than one currency.subscription_total_refunded converted to subscription_total_spend_balance_currency_code — the currency each refund actually settled in, not balance_currency_code. 0, not null, if this subscription has no refunds. null if its charges settled in more than one currency over its life, if any one of them has no settlement currency Paddle could resolve, or, rarely, if a rate hasn't been applied yet.subscription_total_spend_currency_code — chargebacks, minus any that were later reversed. A decimal amount in the major unit of the currency, like dollars rather than cents. Given as a positive amount, not a negative one. May be negative for a subscription whose only chargeback activity is a reversal with no matching chargeback, and subscription_has_chargeback is false on those even though this column isn't 0. 0, not null, if this subscription has no chargebacks. null if its charges and adjustments span more than one currency.subscription_total_charged_back converted to subscription_total_spend_balance_currency_code — the currency each chargeback actually settled in, not balance_currency_code. 0, not null, if this subscription has no chargebacks. null if its charges settled in more than one currency over its life, if any one of them has no settlement currency Paddle could resolve, or, rarely, if a rate hasn't been applied yet.subscription_total_spend_currency_code. A decimal amount in the major unit of the currency, like dollars rather than cents. Includes amounts settled with customer credit. Isn't net of refunds or chargebacks — see subscription_total_spend_net. 0, not null, if this subscription has never charged. null if its charges and adjustments span more than one currency.subscription_total_spend_gross converted to subscription_total_spend_balance_currency_code — the currency each charge actually settled in, not balance_currency_code. 0, not null, if this subscription has never charged. null if its charges settled in more than one currency over its life, if any one of them has no settlement currency Paddle could resolve, or, rarely, if a rate hasn't been applied yet.subscription_total_spend_gross minus subscription_total_refunded minus subscription_total_charged_back, excluding tax, in subscription_total_spend_currency_code. A decimal amount in the major unit of the currency, like dollars rather than cents. Net means net of refunds and chargebacks only: it doesn't deduct Paddle fees, payment fees, chargeback fees, or currency conversion fees. 0, not null, if this subscription has never charged. null if its charges and adjustments span more than one currency.subscription_total_spend_net converted to subscription_total_spend_balance_currency_code — the currency each charge actually settled in, not balance_currency_code. 0, not null, if this subscription has never charged. null if its charges settled in more than one currency over its life, if any one of them has no settlement currency Paddle could resolve, or, rarely, if a rate hasn't been applied yet.