HomeBilling Exports

Exporting subscription data from WooCommerce Subscriptions for churn analysis

A WooCommerce subscription lives in the site's own database rather than in a hosted billing platform, which means the data is fully available and entirely unnormalised. Its status vocabulary carries two values that mislead: pending-cancel is still serving, and on-hold can mean several different things.

TL;DR: WooCommerce keeps subscriptions in the WordPress database with statuses like pending-cancel and on-hold that do not mean what they sound like. Here is how to export and read them.

Every churn calculation needs the same seven things: a stable customer identifier, subscription status, recurring amount and currency, billing interval and term, start date, cancellation or end date, and ideally the date of the last successful payment. (Why each one, and what breaks without it →) What changes between platforms is where those fields live and which status values mislead you.

How WooCommerce Subscriptions models this

WooCommerce Subscriptions stores each subscription as a record in the WordPress database with a status, a parent order, renewal orders and line items. Recurring revenue is on the line items rather than in a single price field, and each renewal produces its own order. Because the store is self-hosted, the export depends on whichever plugin or query produced it, so the provenance of the file matters more here than with a hosted platform.

Field mapping for WooCommerce Subscriptions

NeededWhere it lives in WooCommerce SubscriptionsWatch out for
Account identifierWordPress user ID, or billing email for guest checkoutsGuest checkouts break the user-ID link. Expect both.
Subscription statuswc-active, wc-on-hold, wc-pending-cancel, wc-cancelled, wc-expired, wc-pendingpending-cancel is still serving to period end. on-hold is ambiguous.
Amount and currencySum of recurring line items, plus store currencyNot a single price field. Shipping and tax lines may be included.
Billing interval and termBilling period and billing intervalInterval can be greater than one, e.g. every 3 months.
Start dateSubscription start date, and the parent order dateUsually the same; check for backdated imports.
Cancellation or end dateEnd date, cancelled date, and next payment datepending-cancel subscriptions have a future end date.
Last successful payment dateMost recent completed renewal orderRenewal orders are the reliable payment record.

WooCommerce Subscriptions-specific traps

These are the errors we see repeatedly on this platform. Each one is silent: the analysis completes and returns a number that is wrong.

1. pending-cancel is a decision already made

A subscription in pending-cancel has been cancelled by the customer and continues to serve until the paid period ends. It should count as churn from the cancellation date, not the end date, and it should be excluded from forward MRR. Reports that count it as active overstate the book.

2. on-hold means at least three different things

It can indicate a failed renewal payment, a manual suspension, or a customer-initiated pause depending on how the store is configured and which payment gateway is in use. Ask which, because failed payment is involuntary churn, a manual hold is an operational matter, and a pause is a retention save. They should not share a bucket.

3. Revenue is on line items, with tax and shipping mixed in

There is no single recurring-amount field. Recurring revenue has to be summed from line items, and physical-goods stores may have shipping and tax lines in the same total. Isolate the subscription product lines explicitly.

4. The export's provenance determines what is missing

Because WooCommerce is self-hosted, the file could come from a plugin export, a database query or a REST API call, and each includes different fields. Always ask how the file was produced, and ask specifically whether cancelled and expired subscriptions were included.

What to ask for, in words you can paste

Vague requests produce filtered exports. This wording asks for the complete set in the platform's own vocabulary, which is what gets you a usable file first time:

Please export all WooCommerce subscriptions in every status including cancelled, expired, on-hold and pending-cancel, for the full history, with user ID or billing email, status, recurring line items with amounts, currency, billing period and interval, start date, next payment date, end date and cancellation date. Please also export renewal orders. Please say how the export was produced and what on-hold means on this store.

Before you trust the file

One check first, and it is the same on every platform: count the rows that carry a cancellation or end date. If none do across a multi-year WooCommerce Subscriptions export, the file was filtered to active subscriptions and every churn figure you compute from it will come out at zero. That single defect causes more wrong churn numbers than every definitional argument put together, and it is fixed with one email rather than with analysis. The three further checks — row count, MRR reconciliation and history length — take another five minutes.

What to do with the file

Once you have a clean export, the analysis is the same regardless of where it came from: recompute churn in both logo and revenue terms, build the renewal calendar, check concentration on parent entities rather than accounts, and test whatever the seller has claimed. The seller-claims pages cover the twelve claims worth testing and the arithmetic for each, and the 23-point checklist is the short version.

Official WooCommerce Subscriptions documentation: https://woocommerce.com/document/subscriptions/. Export layouts change; the data model and the traps above do not.

Other billing systems

All billing platforms →  ·  Already integrated: Stripe, ChartMogul, ProfitWell, QuickBooks.

Verify it against the raw rows

Every check on this page can be run by hand in a spreadsheet, and if you have the time you should. If you would rather not: send us the target's subscription export and we run the full human-reviewed analysis — logo churn, revenue churn, customer concentration, annual-plan decay, zombie MRR and an A–F revenue-quality grade. The free Starter tier covers one CSV per month, which is enough to check a single deal.

See a sample report →  ·  Get the free 23-point checklist →

Frequently asked questions

What does pending-cancel mean in WooCommerce Subscriptions?

The customer has cancelled and the subscription continues to serve until the end of the period already paid for. It is churn from the cancellation date, not from the end date, and it should be excluded from any forward MRR figure. Counting it as active is a common way WooCommerce books get overstated.

Why are some WooCommerce subscriptions on-hold?

On-hold covers at least three distinct situations: a failed renewal payment, a manual suspension by the store, and a customer-initiated pause. Which one it means depends on the store's configuration and payment gateway, so it has to be asked rather than inferred. They are involuntary churn, an operational matter and a retention save respectively.

How do I get the recurring amount from a WooCommerce subscription?

Sum the recurring line items, since there is no single price field. Be careful to isolate subscription product lines from tax and shipping lines, which appear in the same totals on stores that also ship physical goods.

9%
Median B2B SaaS revenue churn
88%
Median gross revenue retention
23
Audit Checklist Points

The seller's churn number is almost always wrong. Send the CSV and find out before you wire.

Get the Free Checklist →

🛡️ Free Starter tier: 1 CSV analysis per month. No credit card. Verify a seller's churn claims before you commit.