You cancel a subscription. You hit Export CSV first, because you are sensible. Six months later an accountant asks for an invoice from two years ago, you open the file, and it turns out the export preserved far less than you assumed.
This is a field-by-field account of what invoice exports actually contain, what they throw away, and five checks you can run on your own file today.
What the export usually gives you
Almost every "Export invoices" button produces a flat table, one row per invoice:
| Column | Typical content | How reliable |
|---|---|---|
| invoice number |
INV-0042 or a tool-specific id |
usually |
| issue date / due date | ISO or locale dates | usually |
| client name | display name only | usually |
| client email | sometimes missing | inconsistent |
| amount | a single number, tax treatment unclear | check it |
| currency | often omitted if the account only ever used one | inconsistent |
| status | paid / unpaid / void | inconsistent |
Flat is fine, until you need the parts the flat view had to drop.
The four things that never make it out
1. Line items. An invoice row is a total. The items, quantities, unit prices and per-line tax codes live further down the schema, and a one-row-per-invoice export cannot hold them. For a freelancer this looks harmless, because one line per invoice is common. It stops being harmless the first time a client disputes a total.
2. Tax treatment. This is the one that bites. Whether an amount is tax-inclusive or tax-exclusive is a property of the line, not the invoice, and it is usually not exported. If the column is called amount with no tax note, you are holding a number whose meaning you can no longer prove.
3. Numbering continuity. Invoice numbers are not decoration. In most jurisdictions they have to form a gap-free sequence per seller. Re-importing an export into a new tool frequently restarts the counter, which is how the same INV-0001 ends up issued twice, years apart.
4. Everything attached. PDFs you generated, payment links, recurring schedules, internal notes, whether tax was reverse-charged. None of that fits in a flat CSV.
Five checks to run on your own export
Open the file in a spreadsheet and do these before you cancel anything.
-
Does the total reconcile? If there is a total and a tax column, check
subtotal + tax = totalon every row. Where it fails, tax is probably inclusive on some rows and exclusive on others. -
Are amounts numbers or strings?
1.234,50and1234.50sort differently. If the column imports left-aligned, it is text, and every sum is silently wrong. - Is the invoice number unique and ordered? Sort by number, then by date. They should agree. Disagreement means gaps or reuse.
- Is the currency per row? A client paid in EUR inside a USD-only export is a rounding error you will only find outside the file.
- Does the client column identify a person? Two clients named "Studio Oy" is not a duplicate-key edge case, it is a billing mistake waiting to happen. With no email or business id column, keep the original PDFs.
What "keeps the records usable" looks like
Three tables, not one:
-
invoices- id, number, seller id, client id, issue date, due date, currency, tax regime, status -
invoice_lines- invoice id, description, quantity, unit price, tax rate, tax-inclusive flag -
payments- invoice id, paid date, amount, method
The important part is not the schema. It is that the line table exists at all. An export without lines is a receipt, not a ledger.
For an audit trail you also want the immutable artefact: the PDF exactly as it was issued. A row you can edit is not evidence; a document you sent is.
Why I am writing this
I build FreelanceDesk, a small invoice tool that runs entirely in the browser, keeps your records on your machine, and is sold once instead of by the month. I designed the export format before the UI, because the export should not be the weak part of a tool whose whole pitch is "your records stay yours".
If you are mid-migration, these may help:
- the free demo, no signup: https://freelancedesk-q9fgzh5cp49.qoder.website/
- a converter that takes the CSV your old tool gives you and shows which fields did not map: https://freelancedesk-q9fgzh5cp49.qoder.website/migrate-off-subscription/index.html
- the paid copy, one-time $14: https://payhip.com/b/7cnZP
Disclosure: these are my own products. The links are not affiliate links and I earn nothing if you only use the converter.
Either way, run the five checks against your own export. The time to learn your file is a receipt rather than a ledger is before you cancel, not after.
Top comments (0)