A statement says when. It never says what.
Import the statement and each line finds the receipt it belongs to. Confirming a match records that the thing was paid, and stops there. The amount, the VAT and the date stay exactly as they were classified, because a bank line is not evidence of what you bought.
Confirming a match writes two things.
That is the whole list, and a test enforces it rather than a convention. A product that let a bank line rewrite a classified figure would be handing the bank authorship of your VAT return.
Tiliote · 12.07.2026
- The payment status, with its source recorded as the statement rather than a person.
- A payment row: bank transfer, dated, noted as having come from the statement.
- The amount, the net and the VAT
- The transaction date
- The category and the VAT treatment
Payment status feeds nothing in the VAT logic. That is why the import can be confident and still be safe: the worst a wrong match can do is mark the wrong receipt as paid, which you can see and undo, rather than move a figure inside a return you have already filed.
Matched, ambiguous, and missing.
The deterministic pass matches on amount within a cent, date within three days, and the counterparty name. Where both currencies are known and they differ, it refuses: a dollar row does not match a euro receipt.
One obvious candidate
Amount, date and name all line up. Confirm the batch and those receipts are marked paid.
More than one, or not quite
Two receipts from the same vendor for the same amount in the same week. The screen shows the candidates and you choose. Nothing is picked for you.
Money left with no receipt
Not a failure of the import. It is the most useful thing the import produces, because a payment with nothing behind it is exactly the receipt you have to go and find.
After the deterministic pass, one batched call looks at the leftovers and proposes matches with a confidence score. A proposal above the threshold arrives pre-selected on the screen and still waits for you to confirm it. The model never marks anything paid, never writes a transaction, and when no key is configured it simply returns nothing.
Four formats, in order of how much guessing they need.
Take the highest one your bank offers. The difference is not convenience, it is how much of the file has to be inferred rather than read.
camt.053
no guessingThe ISO 20022 XML your bank exports. Every field is where the standard says it is, the sign comes from the credit or debit indicator rather than a minus sign, and the parser is version agnostic. No AI, no tokens, no column guessing.
CSV
profiles and manual mappingNine Finnish bank layouts are recognised outright, including two-column debit and credit and Revolut’s multi-currency export. An unrecognised file falls back to mapping the columns yourself, which takes a minute and then parses exactly.
PDF with real text
AI extractionA PDF whose text is genuinely text gets read and structured. It works, and it is the one place in this list where the file has to be interpreted rather than parsed.
Scanned PDF
refused, permanentlyA photograph or a scan is rejected, with a message telling you where to get a better file. This will not change: OCR misreading one digit in a financial document produces a confident wrong match instead of an obvious failure, and that is the worst outcome on offer.
Three things to know before the first import.
It is not a live bank connection yet. You export the file from your bank and upload it. A PSD2 connection is researched and planned, and until it exists we would rather you knew than assumed.
It does not move money. Nothing here pays anything or talks to your bank, and the file travels in one direction only.
Your accountant can reconcile but cannot mark anything paid. They can upload your statement and read the three outcomes, which is what turns a missing line into a request for the receipt. Applying is a change to the books and stays with you.
An uploaded statement is deleted after ninety days. It did its job the moment the rows were matched, and a bank file lying around after that is a liability rather than an asset.
Before the first import.
What if I upload the same statement twice?
Nothing happens. The file is fingerprinted, and a second upload of the same bytes tells you it is a duplicate instead of creating a second set of rows to reconcile.
My bank’s CSV is not recognised.
Map the columns once. You pick which column is the date and which is the amount, or the debit and credit pair, and the file re-parses exactly. The automatic detection is a convenience, not a requirement.
Can it handle more than one currency?
Yes, and it refuses to match across them. A Revolut export with dollar and euro rows matches the euro rows to euro receipts and leaves the dollar ones alone rather than guessing a rate.
Does a matched payment change my VAT return?
No. Payment status does not feed the VAT logic at all. The return is built from the classified amounts, and whether an invoice has been paid yet is a different question from what VAT it carried.
What about my own sales invoices?
The reference number is what lets an incoming line find its own invoice. Same mechanism, running from the other direction.
Let the statement close the loop.
Every line matched to its receipt, every payment without one made visible, and not a single figure moved.