Statement → Xero a Laravel demo

Bank statement to Xero manual journals

Upload a bank statement CSV, or a transaction export from an old ledger. Rules and code mappings do the bulk of the coding, anything left goes to a review queue for a person, duplicates and unreadable rows are held back with a reason, and the totals are reconciled before the file can be exported as Xero manual journals, one per month.

or

Both samples are made up: a café's bank account, and a mechanic's ledger export where every line already carries its old MYOB-style account code. Your own file needs a header row with Date, Description and either Amount or Debit/Credit, plus optionally Account Code/Account Name (or P&L Code, Category). Dates are read day-first. Up to 10,000 rows. Please don't upload real customer data to a demo.

How it works

  1. Parse. Amount, Debit/Credit, "$1,234.50" and "(12.00)" are all read as whole cents with string maths, so no float rounding. A row whose date or amount can't be read is kept and flagged, never silently dropped.
  2. De-duplicate. A second line with the same date, amount and description is held back until someone confirms it is real.
  3. Map old codes. If the file already carries account codes from the old system, each code is mapped to a Xero account once and every line follows, across all your imports.
  4. Code. Otherwise rules match on the description, first by priority. A shared income rule never codes money going out, so a Square refund doesn't land in Sales.
  5. Review. What's left is grouped by its leading words; one click turns a group into a rule. Single lines can be coded by hand. Export is blocked until the queue is empty.
  6. Reconcile and export. Statement total = journals + held-back duplicates + anything still waiting. Each month's journal is checked to net to zero against the bank account before the CSV is written.