A list gets its own file
An order with three items does not become items/0/sku, items/1/sku, items/2/sku. The items land in their own CSV with the order's ID on every row, so they join back with a lookup.
Paste the JSON you were handed and get CSV files back: one file per list, joined up by ID, with every number written exactly as it was.
id,status,placed_at,total,address.city,address.postcode 1234567890123456789,shipped,2026-10-01 00:00:00,27.50,Pune,411001 1234567890123456790,packing,2026-10-02 00:00:00,12.50,Delhi,110001
order_id,sku,qty,price 1234567890123456789,MUG-RED,2,8.75 1234567890123456789,TEA-500G,1,10.00 1234567890123456790,TEA-500G,1,10.00 1234567890123456790,SPOON,2,1.25
you see the tables it found, and can rename or drop columns, then choose CSV before anything downloads
An order with three items does not become items/0/sku, items/1/sku, items/2/sku. The items land in their own CSV with the order's ID on every row, so they join back with a lookup.
A 19-digit order number is written exactly as it was. A spreadsheet app can still round it when it opens a CSV, so the converter names the columns at risk before you download, and Excel output is one click away.
A text cell that starts with =, +, - or @ gets a leading apostrophe, so it cannot run as a formula. Files are UTF-8 with the marker Excel looks for, so Müller stays Müller.
You see real rows from your own file first, and rename headings or drop columns. Save the setup, and next month's file gives you the same files with the same headings.
The same converter runs offline with Node. draft writes a setup you can read and edit; convert writes one CSV per table.
npx jsonloupe draft orders.json -o spec.json npx jsonloupe convert orders.json --spec spec.json --to csv
The conversion runs inside this tab. There is no server to send your file to, so it keeps working with your wifi off. A file you are not allowed to email is a file you are allowed to convert.