Startup CFO

Bank Reconciliation Across 3 Entities β€” 500 Transactions Matched in 60 Seconds

3 full days/month β†’ 60 seconds + reviewStartup Finance5 min read

Key Takeaway

Our AI agent reconciled 500 transactions across PyratzLabs, Zama, and a subsidiary entity β€” matching Qonto bank feeds to Pennylane bookings β€” in 60 seconds, flagging 16 discrepancies that would have taken an accountant 3 full days to find.

The Problem

PyratzLabs runs three entities. Each has its own Qonto bank account. Each is booked in Pennylane. Every month, someone has to reconcile them β€” match every bank transaction to a booking entry, find the mismatches, and investigate.

For one entity, that's a manageable day of work. For three entities, it's a three-day project. And it's the most mind-numbing work in finance. You're literally comparing two lists, row by row, looking for amounts that don't match, dates that are off by a day, or entries that exist in one system but not the other.

Our accountant was doing this monthly. Three days of reconciliation per month is 36 days per year. That's almost two months of a person's working time spent on a comparison task. Not analysis. Not strategy. Comparison.

The Solution

Warren's reconciliation module pulls transaction data from Qonto and booking data from Pennylane for each entity. It runs a three-pass matching algorithm β€” exact match, fuzzy match, and unmatched identification β€” then produces a reconciliation report with action items for every discrepancy.

The agent doesn't just match amounts. It matches by date proximity, counterparty name similarity, and reference codes. A transaction at €4,999.50 on March 3rd matches a booking of €5,000 on March 4th with a note about rounding β€” a fuzzy match that a simple VLOOKUP would miss.

The Process

Reconciliation config:

yamlShow code
# bank-recon config
schedule: "0 8 5 * *"  # 5th of each month, 8AM UTC
entities:
  - name: "PyratzLabs SAS"
    bank: qonto
    account_id: "pyrlabs_main"
    accounting: pennylane
    ledger_id: "pyrlabs_gl"
  - name: "Zama SAS"
    bank: qonto
    account_id: "zama_main"
    accounting: pennylane
    ledger_id: "zama_gl"
  - name: "PyratzLabs Subsidiary"
    bank: qonto
    account_id: "pyrlabs_sub"
    accounting: pennylane
    ledger_id: "pyrlabs_sub_gl"

matching:
  exact:
    fields: ["amount", "date", "reference"]
  fuzzy:
    amount_tolerance: 0.5%   # Β±0.5% for rounding
    date_tolerance_days: 3    # bank vs booking date lag
    name_similarity: 0.85     # Levenshtein threshold
  flags:
    - duplicates
    - misclassifications
    - intercompany_leakage

Matching algorithm:

pythonShow code
def reconcile(bank_txns, accounting_entries):
    matched = []
    unmatched_bank = list(bank_txns)
    unmatched_accounting = list(accounting_entries)

    # Pass 1: Exact match (amount + date + reference)
    for txn in bank_txns:
        exact = find_exact_match(txn, accounting_entries)
        if exact:
            matched.append(Match(txn, exact, confidence="exact"))
            unmatched_bank.remove(txn)
            unmatched_accounting.remove(exact)

    # Pass 2: Fuzzy match (amount tolerance + date window + name sim)
    for txn in list(unmatched_bank):
        fuzzy = find_fuzzy_match(
            txn, unmatched_accounting,
            amount_tol=0.005, date_tol=3, name_sim=0.85
        )
        if fuzzy:
            matched.append(Match(txn, fuzzy.entry, confidence="fuzzy",
                                 reason=fuzzy.explanation))
            unmatched_bank.remove(txn)
            unmatched_accounting.remove(fuzzy.entry)

    # Pass 3: Flag remaining + detect patterns
    duplicates = detect_duplicates(matched + unmatched_accounting)
    misclassified = detect_misclassification(unmatched_accounting)
    intercompany = detect_intercompany_leakage(unmatched_bank, entities)

    return ReconciliationReport(
        matched=matched,
        unmatched_bank=unmatched_bank,
        unmatched_accounting=unmatched_accounting,
        flags={"duplicates": duplicates,
               "misclassified": misclassified,
               "intercompany": intercompany}
    )

Sample output:

View details
πŸ“Š MONTHLY RECONCILIATION β€” February 2026

ENTITY: PyratzLabs SAS
Bank transactions: 187 | Bookings: 189
Exact matches: 171 | Fuzzy matches: 12
Unmatched bank: 4 | Unmatched bookings: 6

ENTITY: Zama SAS
Bank transactions: 203 | Bookings: 201
Exact matches: 188 | Fuzzy matches: 11
Unmatched bank: 4 | Unmatched bookings: 2

ENTITY: PyratzLabs Subsidiary
Bank transactions: 110 | Bookings: 112
Exact matches: 101 | Fuzzy matches: 5
Unmatched bank: 4 | Unmatched bookings: 6

SUMMARY ACROSS ALL ENTITIES
Total transactions: 500
Total matched: 488 (97.6%)
Total unmatched: 16 (3.2%)

⚠️ FLAGS
β€’ 3 duplicates detected (Zama β€” same vendor invoice booked twice)
β€’ 1 misclassification (PyratzLabs β€” software subscription booked as
  consulting, affects cost center reporting)
β€’ 12 unmatched transactions requiring manual review
  - 8 appear to be timing differences (will match next month)
  - 4 require investigation (no corresponding entry found)

ACTION ITEMS
1. [URGENT] Reverse duplicate Zama bookings: Invoice #Z-2026-0341
2. [MEDIUM] Reclassify PyratzLabs txn #PL-0892 from consulting to SaaS
3. [LOW] Investigate 4 orphan bank transactions (attached details)

The Results

MetricAccountant (Before)Agent (After)
Time per month3 full days60 seconds + review
Annual time36 days~12 hours (review only)
Match accuracy~95% (human error)97.6% (+ flags for remainder)
Duplicate detectionOften missedAutomatic
Misclassification detectionRarely caughtPattern-based flagging
Cost per month~€2,400 (accountant time)~€0

Try It Yourself

Install the reconciliation skill on Mr.Chief. Connect your bank feeds (Qonto, or any bank with API/CSV export) and your accounting system (Pennylane, Xero, QuickBooks). Configure the matching tolerances for your business β€” tighter for high-volume, looser for entities with irregular payment timing.

Start with one entity. Validate the matches manually for the first month. Then expand to all entities and trust the process.


Reconciliation isn't accounting. It's pattern matching. And machines are better at pattern matching than humans. Full stop.

bank-reconciliationPennylaneQontoaccountingautomation

Want results like these?

Start free with your own AI team. No credit card required.

Bank Reconciliation Across 3 Entities β€” 500 Transactions Matched in 60 Seconds β€” Mr.Chief