Startup CFO
Bank Reconciliation Across 3 Entities β 500 Transactions Matched in 60 Seconds
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
| Metric | Accountant (Before) | Agent (After) |
|---|---|---|
| Time per month | 3 full days | 60 seconds + review |
| Annual time | 36 days | ~12 hours (review only) |
| Match accuracy | ~95% (human error) | 97.6% (+ flags for remainder) |
| Duplicate detection | Often missed | Automatic |
| Misclassification detection | Rarely caught | Pattern-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.
Related case studies
Startup CFO
Monthly P&L From Pennylane in 30 Seconds β Formatted for the Board
AI agent pulls Pennylane transactions, reconciles against Qonto, generates consolidated P&L across entities, and builds a 6-month cash flow forecast β in 30 seconds.
Startup CFO
French PCG to IFRS Conversion β 200 Line Items Mapped in 5 Minutes
AI agent converts French PCG accounting to IFRS-compliant statements in 5 minutes. 200+ line items mapped with reclassification notes β replacing β¬15-25K external accountant work.
Startup CFO
PyratzLabs Runway Simulator β What the Board Sees Every Quarter
Monte Carlo runway simulation with 10,000 scenarios replaced back-of-napkin estimates. How AI agents give our board probabilistic cash runway forecasts with confidence intervals.
Want results like these?
Start free with your own AI team. No credit card required.