Reconciliation
The reconciliation workbench puts two lists of money side by side — a bank statement and the cash ledger, a supplier's statement and the purchase ledger, card settlements and orders — and matches them. Rules run in order: same amount and reference, same amount on close dates, within a small fee, one payment for several items, several paid together, and groups sharing a reference. Each match carries a confidence; the sure ones are confirmed, the rest wait for review.
Match the rest by hand, with suggestions and a running difference, and record any difference as an adjustment (a fee, a discount, a rounding). Unmatched items are aged; the summary says what nothing explains. Submit for approval and a second person signs it off, with every step in the log. Lists come in from CSV; matches, adjustments and what is left go out as CSV.
A month's bank reconciliation
The bank statement of a fictional joinery business against its cash ledger for September. Choose Run rules and review what they propose; match the Harbour Joinery payment by hand with an adjustment for its early-payment discount; then submit it, and approve it as the second person.
Get the code
<script src="/assets/bmx-components.min.js"></script>
<bmx-select id="rc-user" label="Working as" value="Priya Shah" style="inline-size: 16rem">
<bmx-option value="Priya Shah">Priya Shah (prepares)</bmx-option>
<bmx-option value="Tom Reid">Tom Reid (approves)</bmx-option>
</bmx-select>
<bmx-reconciliation id="rc-bank" label="Main current account, September 2026" user="Priya Shah" style="inline-size: 100%"></bmx-reconciliation>
<script>
const reconciliation = document.getElementById('rc-bank');
reconciliation.data = [ /* your data */ ];
</script>
A thousand receipts against twelve hundred invoices
A month of customer payments against open invoices: most quote the invoice, some only the customer's name, some arrive short of a bank fee, and some pay two invoices at once. The rules ran as the page opened. Confirm the likely ones in one go, then work through what is left.
// Node 18 or later: the matching engine, from the Gold package.
import { readRecon, itemsFromCsv, runRules, reconSummary, unmatchedToCsv } from './dist/node/bmx-reconciliation.mjs';
const recon = readRecon({
currency: 'GBP',
asOf: '2026-09-30',
left: { name: 'Receipts', items: itemsFromCsv(await readFile('bank.csv', 'utf8'), { dateOrder: 'dmy' }).items },
right: { name: 'Open invoices', items: await openInvoices() },
});
const { data } = runRules(recon, { by: 'overnight run' });
const figures = reconSummary(data);
console.log(`${Math.round(figures.matchedShare * 100)}% matched, ${figures.proposed} to review`);
await writeFile('unmatched.csv', unmatchedToCsv(data));
await saveForReview(data); // open it in the workbench in the morning