Bank Reconciliation
Reconciles a bank statement against the GL cash detail for one account and one period. Best run in Cowork — two files in, workbook out.
Required inputs
- Bank statement — CSV, XLSX, or PDF. Must contain date, description, amount (with sign), and ideally a reference/check number.
- GL cash detail — CSV or XLSX. Must contain posting date, description, debit, credit (or signed amount), and entry/reference number.
- Period — the close period being reconciled (e.g.,
2026-04).
If any of these is missing, output what's missing instead of guessing.
Workflow
Load and validate. Open both files. Confirm period and currency match. Confirm the bank account in the statement matches the GL account in the cash detail (compare to
firm-config/references/chart-of-accounts.csv).Match transactions. Run
scripts/match_transactions.pywith priority order:- Exact amount + exact date (
HIGHconfidence) - Exact amount + date within ±3 days (
HIGH) - Exact amount + matching reference/check number (
HIGH) - Fuzzy description match + same amount (
MEDIUM— never auto-confirmed)
- Exact amount + exact date (
Bucket the output. The script returns four sets:
exact_matches— auto-included in the reconciliationprobable_matches— go to aProbable_Matchesreview tab; preparer confirmsunmatched_bank— bank items with no GL matchunmatched_book— GL items with no bank match
Age unmatched items. Run
scripts/age_items.py. Buckets:0–30,31–60,61+days from period end. Items aged 61+ get a red flag and go toReview_Notes.Classify unmatched items. For each, pick the best fit from
workpaper-standards/references/review-flags.md:OUTSTANDING_CHECK— book debit (cash out), no bank match, recentDEPOSIT_IN_TRANSIT— book credit (cash in), no bank match, recentBANK_FEE_NOT_BOOKED— bank debit, no book match, small/recurring description (SERVICE CHARGE,WIRE FEE, etc.)NSF_RETURN— bank credit reversal withNSF/RETURNEDin descriptionDUPLICATE_ENTRY— same amount, same date appearing twice on one sideUNKNOWN— anything else, escalated toMANUAL_REVIEW_REQUIRED
Propose adjusting JEs. For each classifiable item that requires a book adjustment (bank fees, NSF returns, missed deposits), draft a JE using
workpaper-standards/references/je-template.md. Bank fees credit cash and debit6900 - Bank Fees. NSF returns reverse the original deposit. Outstanding checks and deposits in transit are not booked — they're reconciling items.Build the reconciliation summary. Tie GL balance to bank balance:
Balance per bank (statement) X Plus: deposits in transit + Less: outstanding checks - Plus/less: other reconciling items ± Balance per books (after adjustments) Y Less: GL balance per cash detail - = Unreconciled difference (should be 0) ZIf
Zis withinmateriality.bank_rec_difference_tolerance(default $0.01), the rec ties. If not, the skill says so and quantifiesZ— it does not plug to force a tie.Output workbook tabs per
workpaper-standards:Cover— header, period, accounts, statusSource_Bank— raw bank fileSource_GL— raw GL detailMatched— exact matches with confidence columnProbable_Matches— review-required matchesUnmatched_Bank,Unmatched_Book— with aging columnsReconciling_Items— classified, with proposed JEsSummary— the tie-out shown aboveJEs_Proposed— feeds directly toje-reviewEvidence— every number onSummarytraced backReview_Notes— questions, flagged items, aged items
Invariants
- Probable matches are never auto-confirmed. They appear on their own tab.
- If the rec doesn't tie, say so. Never plug.
- The proposed JEs go through
je-reviewbefore posting. That is the composition pattern. - One account, one period per workpaper. If the user has multiple accounts, run once per account.
When to say "I don't know"
- Bank statement and GL appear to be different accounts → stop and ask.
- Bank statement is in a different currency than GL → stop and ask about FX treatment.
- More than 30% of items are
UNKNOWNafter classification → likely a data quality issue with the inputs; surface inReview_Notesand don't pretend the rec is healthy.