tallyscope

Methodology: how a statement is checked, and what is not guaranteed

One rule drives every status: a number is trusted only when the statement’s own arithmetic supports it. This page states the rule, the statuses, and the limits.

Open TallyscopeSee pricing

Last updated:

The rule

Most statements print a balance after each transaction. Tallyscope recomputes every balance as the previous balance plus the row’s amount and compares it with the printed one. A row is proven when the two agree. A status is never raised without that arithmetic evidence.

The check runs in your browser tab, on the data in memory. Nothing about it needs a server, and no statement content is sent anywhere to perform it; see converting without uploading.

Steps, in order

  1. Read. Text PDFs are read from their word positions. Scans and photos go through OCR first (Tesseract compiled to WebAssembly, in your tab). Bank files such as CSV, OFX, QIF, MT940 and camt.053 are read directly. Guides exist for 16 languages, and the parser recognises column headers in more languages than that: Latin-script European languages, Cyrillic and Greek, Chinese, Japanese, Korean and Southeast Asian languages, right-to-left scripts such as Arabic, Persian, Urdu and Hebrew, and Indic languages. Each guide’s worked example is run through the real parser in the test suite. For scans, OCR can use the English model that ships with the site plus 16 language models that are downloaded from the jsDelivr CDN only when needed. The reader is not tied to a list of banks.
  2. Recompute. For each row, the expected balance is the previous balance plus the amount read. The direction of a row (money in or out) follows from the sign of the balance change, so it works whichever column layout the statement uses.
  3. Compare. The expected balance is compared with the printed one. Opening, closing and any printed totals are compared with the sums of the rows. The first row that breaks the chain is marked, and the app can jump to it.
  4. Repair, only with proof. A lost decimal point or thousands separator is restored only when the digits equal what the balance requires, and the row is tagged as repaired. Any other suggested fix is offered to you, never applied silently.
  5. Set the status. The result is one of four statuses, set from the evidence above.

The worked example on the verification page shows these steps with real figures: an opening balance of 1,000.00, a payment that proves to 954.80, and a salary row whose printed balance of 2,500.00 more than the amount read shows a digit was lost.

What do the four statuses mean?

Verified means the printed running balance proves the statement: every row is proven, or at least 80% of the rows are proven and the closing balance matches, and no row disagrees with the balances.

Verified
The rule above is met.
Partly verified
Some of the statement is proven and some is not, or a condition below holds it back from Verified.
Needs review
One or more rows disagree with the balances, or the closing balance or printed totals do not match.
Unverified
There is no balance information to check against, so rows are extracted but not proven.

A statement with no running balance column can still be Verified when its printed opening balance plus the money in, minus the money out, equals its printed closing balance, provided no direction had to be guessed and no row was left out.

Even when the balances line up, a statement is held at Partly verified if an amount could not be read, a dated row was left out, rows repeat exactly without being proven one by one, a direction contradicts the balances, or the transaction count printed on the statement differs from the rows read.

StatusWhat backs itWhat you should do
VerifiedThe rule above is met: amounts and directions agree with the printed balances and totals.Still check dates; arithmetic cannot prove them.
Partly verifiedSome rows are proven; the page says which are not.Look at the rows that are not proven.
Needs reviewRows disagree with the balances.Compare the flagged rows with the original.
UnverifiedNo running balance or printed totals to check against, as in some credit card exports.Check the figures yourself; direction comes from headers, signs and wording.

Checks beyond a single statement

What is not guaranteed

The check shows that the rows are consistent with the balances printed on the document. It does not prove dates, descriptions, or that a statement is genuine, and it is not an audit. For scans, it cannot rescue an image too poor to read; it flags the rows it cannot prove.

Where this is encoded

The reconciliation logic is pure code with no user-interface dependencies, and it is tested against synthetic statements with known correct answers, including scans generated with ground truth. The tests use synthetic data only. We do not claim a percentage of statements that will verify, because layouts vary.

Exports keep the evidence: every row carries its status and any review note in CSV, Excel, PDF and JSON, and a reconciliation report (PDF and an Excel sheet) summarises the checks. OFX, QuickBooks CSV and Xero CSV are files for importing into accounting software; see pricing for which plans include them.

Questions or a statement that behaves unexpectedly: contact us, describing the layout rather than sending the document. Or open Tallyscope and see the statuses on your own statement.

Frequently asked questions

Does Verified mean a statement is genuine?

No. It means the rows are arithmetically consistent with the balances printed on the document. It is not an audit and does not test authenticity.

Can a Verified statement still contain a wrong date?

Yes. Arithmetic cannot prove a date, so check dates on any statement you rely on.

Are repairs to scanned numbers applied automatically?

Only when the digits equal what the running balance requires; those rows are tagged repaired. Other fixes are offered and need your click.

Try it on your own statement

Free to start. Your files are read in your browser and are not uploaded.

Open Tallyscope See pricing