Bank reconciliation calculator
A statement balance of 12,450, with deposits in transit added and outstanding checks taken off, comes to 12,775.25, exactly what the books show, so the difference is zero. When it is not zero, an item is still missing. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Statement balance
- 12,450
- Outstanding checks
- 875.25
- Deposits in transit
- 1,200.5
- Book balance
- 12,775.25
- Adjusted balance
- 12,775.25
- Difference
- 0
Bank reconciliation is the month-end control that explains why the cash figure printed on a bank statement almost never equals the cash figure sitting in the general ledger on the same date. Timing items — checks the company has written but the bank has not yet paid, and deposits the books have already recorded that have not yet posted to the statement — sit between those two totals until they clear. This bank reconciliation calculator accepts four finite amounts: the ending statement balance, outstanding checks, deposits in transit, and the book (cash-ledger) balance. It forms the adjusted bank figure as statement plus deposits in transit minus outstanding checks, then reports that adjusted balance and the difference versus the books. A zero difference means the two records meet on the same cash total; a non-zero difference flags an unrecorded bank charge, an NSF check, a transposition, or another item that still has to be booked.
What the four figures mean and how the adjusted balance is formed
A bank statement is a third-party snapshot of cash the depository has posted through a cutoff date. The cash book, or cash ledger, is the company's own running record of the same cash. Those two numbers disagree on most closing days for reasons that are ordinary, not fraudulent: checks the company has already recorded as disbursements but that payees have not yet presented, and deposits the company has already recorded as receipts that arrived at the bank after the statement cutoff.
Those two timing items are called outstanding checks and deposits in transit. The textbook bank-side adjustment is therefore mechanical. Start with the ending statement balance, add every deposit in transit, and subtract the total of outstanding checks.
The result is the adjusted bank balance — the cash figure both records should share after timing items are recognized. This calculator treats the book balance as already complete on the ledger side, so the adjusted balance it returns is that bank-side figure, and the difference is adjusted balance minus book balance. When the difference is zero, the statement and the books have been reconciled to the same cash total.
When it is not zero, something besides timing remains: a service charge or interest the books have not yet recorded, an NSF check, a deposit recorded at the wrong amount, a check the bank paid that is not on the outstanding list, or a simple transposition. The calculator does not invent those book-side items; it surfaces the dollar gap so a bookkeeper can find them.
Amounts may be positive, negative, or zero so a reversing correction can be entered as a signed number; the only hard rule is that every amount must be a finite number.
Where a bank reconciliation calculator earns its keep
Controllers and bookkeepers run a bank reconciliation calculator at month-end so they can confirm cash before they close the period, without rebuilding a spreadsheet each time the bank file is late. Accounting classrooms and exam-prep courses use the same four-field contract so learners can check that they added deposits in transit and subtracted outstanding checks in the right order, and so a grader can treat a non-zero difference as a signal to look for a missing fee instead of a silent pass. Failed validation does not consume balance.
Keep requests small, pin the rounded cents in tests, and you get a reproducible adjusted balance and difference for close packages, course plugins, and edge workers without standing up a general ledger of your own. Use the difference as a tick mark: zero means the timing items explain the gap; anything else means another reconciling item still has to be found and booked.
What you can do with it
Month-end cash close
Enter the statement balance, outstanding checks, deposits in transit, and book balance to confirm the adjusted cash figure before you close the period.
Classroom and exam checks
Let students submit the four amounts for a textbook bank reconciliation and verify the adjusted balance and whether the difference is zero.
FAQ
What does a non-zero difference mean?
Timing items did not fully explain the gap. Look for unrecorded bank charges or interest, NSF checks, deposits recorded at the wrong amount, missing outstanding checks, or a transposition, then book the missing item and rerun.
What happens if an amount is not a finite number?
Missing values, empty strings, NaN, and infinities are rejected and are not billed.
Can outstanding checks or deposits in transit be zero?
Yes. Zero is valid when nothing is outstanding or in transit. Signed negatives are also accepted so a reversing correction can be entered as a number.
What are outstanding checks and deposits in transit?
They are timing items. Outstanding checks are payments already recorded in your books that payees have not yet presented; deposits in transit are receipts you recorded that reached the bank after the statement cutoff.
Does the calculator book bank fees or interest for me?
No. It treats your book balance as complete and only shows the gap. A service charge, interest or a bounced check that is not yet in your books appears as a difference you then need to record.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/bank-reconciliation \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"statement_balance":12450,"outstanding_checks":875.25,"deposits_in_transit":1200.5,"book_balance":12775.25}'const res = await fetch("https://api.kit.forhosting.com/fin/bank-reconciliation", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"statement_balance": 12450,
"outstanding_checks": 875.25,
"deposits_in_transit": 1200.5,
"book_balance": 12775.25
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/bank-reconciliation",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"statement_balance": 12450,
"outstanding_checks": 875.25,
"deposits_in_transit": 1200.5,
"book_balance": 12775.25
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/bank-reconciliation", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"statement_balance":12450,"outstanding_checks":875.25,"deposits_in_transit":1200.5,"book_balance":12775.25}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"statement_balance":12450,"outstanding_checks":875.25,"deposits_in_transit":1200.5,"book_balance":12775.25}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/bank-reconciliation", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"statement_balance": 12450,
"outstanding_checks": 875.25,
"deposits_in_transit": 1200.5,
"book_balance": 12775.25
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.bank_reconciliation",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Any amount that is missing or is not a finite number fails with invalid_input and is not billed.
Input contract, response shape, and non-finite errors
Example: a statement of twelve thousand four hundred fifty, deposits in transit of one thousand two hundred and fifty cents, outstanding checks of eight hundred seventy-five and twenty-five cents, and a book balance of twelve thousand seven hundred seventy-five and twenty-five cents produce an adjusted balance of twelve thousand seven hundred seventy-five and twenty-five cents and a difference of zero. POST a JSON body with four required finite numbers. statement_balance is the ending cash on the bank statement (aliases bank_statement_balance, bank_balance, statement). outstanding_checks is the total of issued checks that have not yet cleared the bank (aliases checks_outstanding, outstanding). deposits_in_transit is the total of receipts already in the books that have not yet appeared on the statement (aliases deposits, transit_deposits). book_balance is the cash-ledger balance on the same date (aliases books, ledger_balance, cash_book_balance). Each field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, nulls, and any value that is not a finite number — including NaN and infinities — fail with invalid_input naming the field, and those failures are not billed. On success the body echoes the four inputs rounded half-up to cents, returns adjusted_balance as statement plus deposits in transit minus outstanding checks, returns difference as adjusted_balance minus book_balance, sets reconciled to true only when that difference is exactly zero after rounding, and includes a short formula string restating the identity. Pair the response with your own list of uncleared items if you need a line-by-line tick-and-tie; this endpoint totals the four figures and does not parse a statement file or a check register.
Where a bank reconciliation calculator earns its keep
Small-business tools, close-management checklists, and internal-audit workpapers call the JSON endpoint to flag accounts whose adjusted bank figure still disagrees with the ledger.
Integration use cases
Close dashboards and workpapers
Call the same JSON contract from scripts at $0.002 per success to flag ledgers whose adjusted bank figure still disagrees with the books.
Technical questions
How is the adjusted balance computed?
adjusted_balance equals statement_balance plus deposits_in_transit minus outstanding_checks. difference equals that adjusted figure minus book_balance. reconciled is true only when the difference is exactly zero after rounding to cents.
What does the bank reconciliation calculator cost?
The browser widget is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid_input failures are not billed.