Docs Analytics for WooCommerce Subscriptions Per-Order Deferred Revenue Export

Per-Order Deferred Revenue Export

The recognition export gives finance teams a single CSV of the line-level schedule behind your monthly Revenue Recognition totals: one row for each order in each month, with the cash received, the revenue recognized, and the coverage period that payment relates to.

Read "What the CSV does not contain" before handing this to an accountant. The amounts include tax and shipping and there is no column separating them, so this file on its own is not a tax-ready revenue breakdown.

🎬 Video: the export is shown in the Revenue Recognition video.

Where to find it

  • Open WooCommerce → Analytics → Subscription Report and switch to the Revenue Recognition tab.
  • Set the date range to the period you want to export.
  • Click Export Recognition CSV at the top-right of the Monthly Recognition table.
  • Check the range shown in the Export recognition rows? pop-up and click Export.

The button shows progress while the rows are collected, and the file downloads as revenue-recognition-START_to_END.csv. The export covers whole months: the start and end dates are taken from the first day of the first and last month in your range.

What is in the CSV

Each row is one order’s recognition entry for one month. There are nine columns:

ColumnContents
monthThe month the entry belongs to, as the first day of that month.
order_idThe WooCommerce order ID. On stores using a custom order-numbering plugin this is not the same as the order number shown to customers.
subscription_idThe subscription the order belongs to.
typesignup, renewal, switch or refund.
recognized_amountRevenue recognized from this order in that month. Negative on refund rows.
cash_amountCash received from this order in that month — non-zero only in the month the order was actually paid, and negative on refund rows.
period_startThe first day of the coverage window this payment relates to. On a refund row, this is the refund date.
period_endThe last day of that coverage window. On a refund row, this is also the refund date.
currencyThe order’s currency code.

Because every row carries the coverage dates and both amounts, an accountant can rebuild the schedule for any single order without access to WordPress. Customer details are not included — use the order_id to look them up, or read them in the Orders in this Range table on the tab.

What the CSV does not contain

Not includedWhat to do instead
Tax — amounts include it, with no separate columnTake the tax figures from WooCommerce’s own tax reports for the same period and reconcile outside this file.
Shipping — also included in the amounts, not separatedAs above.
A net vs gross indicatorEvery amount is the order total after discounts, including tax and shipping. There is no other basis in the file.
A deferred balance columnThe per-order deferred balance is shown on screen in the Orders in this Range table, as Remaining Deferred. See the caution below before deriving it yourself.
Deriving a deferred balance from this file only works over an order’s full life. For a given order, total cash_amount − total recognized_amount is the remaining deferred balance only if your export range covers every month that order touches. Export a single month of an annual subscription and you get one partial row — the subtraction then produces a meaningless number. Either export a range wide enough to include the order’s whole coverage period, or read Remaining Deferred from the on-screen Orders table, which is always calculated over full history.

Reading the file

  • The file is comma-separated and UTF-8 encoded, with a header row.
  • Dates are YYYY-MM-DD. Excel may reformat these on open — import the file as text rather than double-clicking it if you need the dates preserved exactly.
  • Amounts are plain decimal numbers with a dot separator and no currency symbol or thousands separator, so they are safe to sum directly.
  • Refund rows carry negative amounts, so a straight SUM over a column already nets refunds off.
On a multi-currency store, do not sum the amount columns across the whole file. Rows in different currencies are not converted. Group by the currency column and total each currency separately.

Using the export for accounting

  • Month-end close — set the date range to the closing month, export, and use the CSV as the line-level backup for that month’s recognized revenue.
  • Tie back to the monthly table — summing recognized_amount and cash_amount by month reproduces the Recognized Revenue and Cash Received figures in the Monthly Recognition table exactly.
  • Posting entries — post the monthly recognized_amount totals as income and the difference against your deferred-revenue liability account, after separating tax using your tax reports.

Frequently asked questions

Can I export only some orders?

No. The export always covers every recognition row in the selected date range. To narrow it, change the date range before exporting, or filter the CSV in your spreadsheet.

Why does an order show a row with zero cash?

Cash is recorded once, in the month the order was paid. Every other month of that order’s coverage period carries recognized revenue with cash_amount of 0. Exporting a range that excludes the payment month is the usual reason a total looks short.

What if a subscription was cancelled mid-period?

The order keeps its original period_start and period_end, but recognition stops at the cancel date: months after it have no rows, and the cancel month is prorated to the days actually delivered.

How large can the export get?

The export reads the pre-aggregated recognition table in batches, so the row count is not usually the constraint — the spreadsheet is. As a rough guide, expect roughly one row per order per month of its coverage, so a year of annual subscriptions produces about twelve rows per subscription. If Excel or Google Sheets struggles, export a narrower range.

Troubleshooting

ProblemWhat to check
The CSV is emptyEither the range contains no paid subscription orders, or the historical import has not been run. See Importing Historical Data.
Totals do not match the Monthly Recognition tableConfirm you exported the same range, and that you are summing every row including negative refund rows. On a multi-currency store the on-screen total is an unconverted mix, so it will not match a per-currency total from the CSV.
Excel has mangled the dates or dropped leading zerosImport the file as text instead of opening it directly, and set the date columns to text on import.
A deferred balance derived from the file looks wrongAlmost always a clipped range — see the caution above. Use the on-screen Remaining Deferred column instead.
The export times out on a very long rangeExport year by year, or month by month, and combine the files in your spreadsheet.
order_id does not match the order number I seeStores using a custom order-numbering plugin display a different number from the underlying ID. Search by ID in the admin, or match on the subscription instead.
Works with both HPOS and legacy post-based order storage. Available from version 1.1.8 onward. For how the amounts are calculated, see Revenue Recognition and Deferred Revenue.