Home » How it works
How Bank2XL works
Drop, extract, verify. Most converters skip the verify step.
Short version: drop a PDF, the AI extracts every transaction (we keep the original column labels and currency symbols), and we reconcile the totals against the statement's reported opening and closing balance. If the numbers don't match, the result page shows a colored badge so you know to review before importing.
1. Drop the PDF
Open the Bank2XL Chrome side panel and drag your bank statement PDF onto the drop zone. The file goes over TLS to our API and we process it in memory. By default we also keep a copy for 24h in an encrypted debug vault to investigate failed extractions; opt out in Settings and nothing is written to disk. Full retention details.
- Supported: any PDF, including scanned and image-based statements.
- Size limit: 25 MB. During the free beta the per-file page cap is 50 pages (covers virtually all consumer statements).
- One file at a time in the side panel; batch upload is on the roadmap.
2. AI extraction
Our extractor pre-routes each document by whether it has a real text layer or is image-only:
- Text-layer PDFs — extracted with PyMuPDF for layout-aware parsing, then validated by a Gemini 3.1 vision model.
- Scanned PDFs and image PDFs — rasterized page-by-page and run through Datalab Chandra OCR + Gemini for table reconstruction.
In parallel, a "judge" model identifies the bank, country, and document structure. If it disagrees with the pre-route choice, we cancel and retry on the right path. This catches edge cases like rasterized statements that have a fake text layer.
What we extract
- Every transaction row: date, description, amount, polarity (debit/credit), balance after.
- Cover-page metadata: account number, holder, period, sort code, IBAN, BIC, branch, anything labeled on the PDF.
- Original column headers, verbatim. "Débito" stays "Débito". We don't translate.
- Source page numbers, so you can jump from a transaction back to the PDF.
3. Balance verification
This is the step most converters skip. For every account in the statement, we compute:
opening_balance + sum(credits) − sum(debits) = closing_balance ?
The result determines the badge color on the result page:
| Status | Meaning |
| reconciled | Totals match within 0.5%. Usually safe to import; still verify before tax, audit, or legal use. |
| no_balance | No opening / closing balance found in the PDF. Sums shown but not verified. |
| insufficient_data | No transactions extracted (header-only document). |
| incomplete_source | The PDF says more pages should exist than were uploaded. Re-export. |
| mismatch | Totals differ by more than 0.5%. Investigate. |
| tx_extraction_incomplete | The statement's own Activity Summary reports more transactions than we extracted. |
4. Output
- Excel (.xlsx), multi-sheet workbook with Account info, Transactions, and a Validation sheet showing the reconciliation status and any deltas.
- CSV, a single flat file ready for QuickBooks, Xero, or any spreadsheet tool.
- QBO (.qbo) for QuickBooks Desktop. Open the file with File » Utilities » Import » Web Connect.
- OFX (.ofx), generic OFX 1.0.3 SGML, for any accounting tool that supports OFX imports.
- QFX (.qfx) for Quicken. Same OFX shape as the .qbo, with the Quicken extension.
What we don't do
- We don't categorize transactions (groceries / dining / etc.). Bank2XL extracts; you categorize in your accounting tool.
- We don't keep statement files long-term. By default, uploaded PDFs sit in an encrypted debug vault for up to 24 hours, then auto-delete. Opt out in extension Settings and the file is held in memory during conversion and never written to disk. See Data retention.
- We don't train AI on your content or share it. See Security.
Join the waitlist See a sample output