Repair the file first
Broken flate streams and corrupted compression are re-encoded with pdf-lib before parsing begins. A readable file in, every time.
flate stream broken → re-encoded · opened clean
The financial engine reads bank and portfolio statements, rebuilds every transaction into one canonical schema, and refuses to export a ledger that doesn’t reconcile. Filing-grade, not best-effort.
A Capitee statement and an Investec one look nothing alike going in. What comes out is the same six columns every time: date, description, category, debit, credit, running balance.
| Date | Description | Category | Debit | Credit | Balance |
|---|---|---|---|---|---|
| 01 Sep | Salary · client retainer | Income | - | 48 200,00 | 112 480,14 |
| 03 Sep | Card · Shoprite | Debits & Expenses | 1 240,50 | - | 111 239,64 |
| 05 Sep | Debit order · rent | Debits & Expenses | 14 500,00 | - | 96 739,64 |
| 07 Sep | Bank charges · VAT 15% | Bank Charges & Taxes | 46,00 | - | 96 693,64 |
From a skewed photo of a statement to a reconciled workbook, every file runs the same disciplined route. Nothing is guessed twice, and every balance is checked on the way out.
Broken flate streams and corrupted compression are re-encoded with pdf-lib before parsing begins. A readable file in, every time.
flate stream broken → re-encoded · opened clean
Fourteen signatures are matched against headers and footers and scored. Then the file drops through a self-healing chain until it reconciles.
Text layer → OCR → Normalized AI → Vision AI → Hybrid → Spatial rescue
Dedicated extractors for the major banks; spatial-alignment rescue rebuilds tables from coordinates when the text layer lies.
x 112.4 · y 480.9 → row 41 of 87 rebuilt from coordinates
Rows become canonical transactions, and the running balance is re-derived line by line. If it does not reconcile, it is flagged, never silently shipped.
Σ running balance = closing balance verified
Reconciliation here isn’t a model guessing. Each layer is plain arithmetic that re-adds the ledger and blocks the export when a single check fails.
Each line’s balance is recomputed from the last. If it doesn’t match the bank, the row is flagged before it reaches the sheet.
A transaction gets exactly one side, cross-checked against the balance movement.
An amount far outside a row’s context is surfaced for review instead of silently categorised.
Re-imports and overlapping pages are fingerprinted so a single debit never doubles the expense.
The whole ledger must balance from opening to closing before export, the check that makes output filing-grade.
Over a hundred and twenty categorisation rules run in English and Afrikaans. They match how a line really reads on a local statement, BANKKOSTE and all, and land it in the right box.
Anything it can’t match goes to a human to review, not a guess. And each client’s rules stay separate, so one book can’t quietly change another.
15%
Output & input VAT, with the 115 registration gate handled.
R7 000
De minimis asset rule; below it, immediate write-off logic.
PAYE · UIF
Payroll lines recognised alongside salary templates.
Eskom → Santam
Local merchants, vendors and debit-order patterns pre-known.
A phone photo of a statement reads as cleanly as a pristine PDF. These are the banks and fund managers the engine knows by signature.
FNB
Transactional & business
Capitec
Transactional
Nedbank
Transactional & business
ABSA
Transactional & business
Standard Bank
Transactional & business
TymeBank
Transactional
Discovery Bank
Transactional
Investec
Private & wealth
Bidvest
Corporate card
African Bank
Transactional
ICICI
Transactional (India)
Old Mutual
Portfolio & unit trusts
Sanlam
Portfolio & unit trusts
Allan Gray
Portfolio & unit trusts