Step-by-step guide to exporting multi-column CSV and XLSX transaction files formatted specifically for major accounting software.
Why "Clean" Matters More Than "Complete"
QuickBooks and Xero reject rows with missing dates, reversed debit/credit signs, or comma-laced amounts like "1,250.00 CR". Generic OCR dumps often export descriptions with line breaks and leave the statement's running balance in the same column as amount, so totals don't reconcile. StatementIQ exports signed amounts (credit: +amount, debit: -amount) so the sheet is directly summable, dates normalized to YYYY-MM-DD, and categories flattened to parent names (e.g., sub "Swiggy" → parent "Food"). This is why our XLSX imports without pre-cleaning, per three CA testimonials.
Choosing Columns: What Accounting Software Wants
The export dialog (Export) lets you pick columns: date, description, merchant, amount, type, category, page, confidence. For Tally use date+description+amount+type; for Xero add category; for custom ledgers include merchant and page. The helper sanitizeColumns validates against EXPORT_COLUMNS and falls back to the full set if empty.
Step-by-Step: From PDF to QuickBooks in 60 Seconds
- Upload the PDF; if locked enter the password. Wait for
status: completeor finalize after reviewing anyneeds_reviewrows flagged by the balance audit. - On
/statements/[id]open Export → choose CSV or XLSX, pick columns, optionally filter byfrom/to(validatedYYYY-MM-DD). Rows are capped at 10,000 to avoid OOM — filter by month if larger. - Hit Download — the file arrives as
statement-bank-2026-07-30.csvwithContent-Disposition: filename*=UTF-8and CSV-injection guard (=→'=). - In QuickBooks: Banking → Upload → map Date→Date, Description→Description, Amount→Amount (signed). For Xero: Bank accounts → Import a statement → upload CSV. Both accept the signed amount column without splitting debit/credit.
Pro Tips for Bulk & API Workflows
Bulk-upload 50 PDFs at once on Pro — each file gets its own progress bar and password modal with "Apply to all". Enterprise firms use the REST API (POST /upload/create via proxy.ts allow-list) plus Enterprise plan to stream 500 statements/month into a nightly ETL. Keep exports incremental by filtering with from/to per statement; the reconciler ensures no row is double-counted even if you re-export the same month.