Data Exports (CSV)
Learnomy's admin list pages can hand you a clean CSV download of what you are looking at -- transactions, students, subscriptions, plans, and your question bank -- ready to open in a spreadsheet.
What you can do
- Export your transactions as a CSV audit and accounting feed.
- Export the enrolled student list as a CSV.
- Export subscriptions, filtered to exactly the status and plan you have on screen.
- Export your membership plans catalog.
- Export your question bank, filtered the same way the bank list filters it (and re-import a CSV to add questions in bulk).
- Get a file that opens correctly in Excel or Google Sheets -- every row in its own cells, not crammed into one cell.
- Export from large sites without silent truncation, because exports stream row by row instead of capping the result.

How to use it
Step 1 -- open the list you want to export
Go to the matching admin page: Transactions, Students, Subscriptions, Membership Plans, or the Question Bank.
Step 2 -- filter to what you need (where supported)
On the Subscriptions and Question Bank lists, set the filters first (subscription status and plan; question bank category and type). The export mirrors the filters, so you get "exactly what you see" rather than the whole table.
Step 3 -- export
Use the export action on the page. The file downloads as an attachment with a dated filename (for example learnomy-transactions-YYYY-MM-DD.csv), so repeated exports do not overwrite each other.
Step 4 -- open it
Open the file in Excel, Numbers, or Google Sheets. Because the download is served as real text/csv, each value lands in its own cell.
Settings and options
- What can be exported -- transactions, students, subscriptions, membership plans, and the question bank each have their own export. Earnings-side lists (commissions, withdrawals, and instructor applications) also export by requesting the list with
format=csv. - Filters carry through -- subscriptions export honors the status and plan filters; the question-bank export honors the bank's category and type filters.
- Dated filenames -- every export is named with the date (or date-and-time) so exports are self-labeling and never clobber a previous file.
- Large lists -- the transaction, student, subscription, and plan exports iterate rows with a cursor rather than loading everything into memory, so a site with tens of thousands of rows exports fully instead of being cut off.
- No spreadsheet corruption -- files are streamed as raw
text/csvwith a download disposition, so the whole file is never JSON-wrapped into a single cell.
For developers
The shared streaming mechanism lives in Learnomy\API\Api::stream_csv_responses(), hooked on rest_pre_serve_request. Any REST response whose Content-Type is text/csv and whose body is a string is emitted raw (with its own headers) instead of being JSON-encoded by WP_REST_Server. This fixes every CSV export at once while keeping REST auth and middleware intact.
Helper Learnomy\API\Csv_Formatter builds CSV bodies and downloadable responses: to_string( array $headers, array $rows ) and respond( array $headers, array $rows, string $filename ) (which sets text/csv, a dated Content-Disposition attachment filename, and no-store).
Export endpoints (namespace learnomy/v1, admin-gated):
GET /admin/transactions/export--Admin_Controller::export_transactions_csv()(cursor-iteratesTransaction::iterate_all()).GET /admin/students/export--Admin_Controller::export_students_csv()(streams the enrolled-user list).GET /admin/memberships/export--Membership_Controller::export_subscriptions_csv()(honorsstatus+plan_id).GET /admin/membership-plans/export--Membership_Controller::export_plans_csv().GET /questions/export--Questions_Controller::export_csv()(honors the bank filters); paired withPOST /questions/import(import_csv()) for bulk import.
List endpoints that emit CSV when called with format=csv (via Csv_Formatter::respond()): Admin_Controller::list_commissions(), list_withdrawals(), and list_applications().