Startup CFO
Monthly P&L From Pennylane in 30 Seconds — Formatted for the Board
Key Takeaway
My AI agent pulls transactions from Pennylane, reconciles against Qonto bank entries, generates a consolidated P&L across PyratzLabs and subsidiaries, builds a 6-month cash flow forecast, and formats everything for the board — in 30 seconds.
The Problem
Monthly close. Two words that make every CFO sigh.
Here's what it looks like at a holding company with multiple entities: pull transaction data from Pennylane (our accounting tool). Cross-reference with Qonto (our bank). Categorize anything that's miscategorized. Consolidate PyratzLabs parent with Zama. Eliminate intercompany transactions. Generate the P&L. Generate the cash flow statement. Build the 6-month forecast. Format it all for the board.
Manual process: 2-3 days. Every month. And that's just for the output — it doesn't include the back-and-forth with the accountant about miscategorized expenses or the intercompany reconciliation that never balances on the first try.
I needed the monthly close to be a 30-second operation with a human review step, not a 3-day project.
The Solution
Warren pulls from the Pennylane API, reconciles against Qonto bank feeds, generates entity-level and consolidated P&L statements, runs the 6-month cash flow forecast, and formats everything in board-ready layout. The Financial Statements skill handles the P&L structure. The Reconciliation skill handles the bank matching.
Thirty seconds of compute. Plus review time — because I'm not sending unreviewed financials to the board. But the review takes 20 minutes, not 2 days.
The Process
The monthly close configuration:
yamlShow code
# monthly-close-config.yaml
entities:
- name: "PyratzLabs SAS"
pennylane_org: "pyratzlabs"
bank: qonto
bank_account: "FR76XXXX"
role: parent
- name: "Zama SAS"
pennylane_org: "zama"
bank: qonto
bank_account: "FR76YYYY"
role: subsidiary
consolidation:
method: full # Full consolidation (100% owned)
eliminate_intercompany: true
intercompany_accounts:
- "451*" # PCG intercompany current accounts
- "462*" # Intercompany receivables
reconciliation:
tolerance: 0.01 # €0.01 matching tolerance
auto_match: true
flag_unmatched: true
forecast:
horizon_months: 6
basis:
recurring_revenue: true # Use MRR trends
known_commitments: true # Signed contracts, rent, salaries
historical_seasonality: true
output:
format: markdown
include:
- entity_pl # Per-entity P&L
- consolidated_pl # Group-level P&L
- reconciliation # Bank rec summary
- cash_forecast # 6-month forecast
- variance_analysis # Month-over-month changes
The agent pipeline:
pythonShow code
# Monthly close pipeline
async def run_monthly_close(period: str):
# Step 1: Pull Pennylane transactions
for entity in config.entities:
txns = await pennylane.get_transactions(
org=entity.pennylane_org,
period=period
)
# Step 2: Pull Qonto bank statements
for entity in config.entities:
bank_txns = await qonto.get_transactions(
account=entity.bank_account,
period=period
)
# Step 3: Reconcile
rec_results = reconcile(
gl_transactions=txns,
bank_transactions=bank_txns,
tolerance=config.reconciliation.tolerance
)
# Step 4: Generate entity P&Ls
entity_pls = {}
for entity in config.entities:
entity_pls[entity.name] = generate_pl(
transactions=txns[entity.name],
period=period
)
# Step 5: Consolidate
consolidated = consolidate(
entity_pls,
eliminate=config.consolidation.intercompany_accounts
)
# Step 6: Forecast
forecast = generate_forecast(
historical=get_historical_pls(months=12),
recurring_revenue=get_mrr_trend(),
commitments=get_known_commitments(),
horizon=6
)
return MonthlyClose(
entity_pls=entity_pls,
consolidated=consolidated,
reconciliation=rec_results,
forecast=forecast
)
The output (abbreviated):
View details
PYRATZLABS GROUP — MONTHLY P&L
February 2026
══════════════════════════════════════════════════════
CONSOLIDATED P&L
─────────────────────────────────────────────────────
Feb 2026 Jan 2026 MoM Δ
─────────────────────────────────────────────────────
Revenue €487,200 €461,800 +5.5%
PyratzLabs €142,000 €138,400 +2.6%
Zama €345,200 €323,400 +6.7%
COGS -€98,400 -€94,200 +4.5%
─────────────────────────────────────────────────────
Gross Profit €388,800 €367,600 +5.8%
Gross Margin 79.8% 79.6% +0.2pp
Operating Expenses
Payroll -€218,000 -€216,000 +0.9%
Cloud/Infra -€34,200 -€32,800 +4.3%
Office/Admin -€18,400 -€18,100 +1.7%
Marketing -€12,800 -€14,200 -9.9%
Legal/Prof -€8,200 -€6,400 +28.1% ⚠️
─────────────────────────────────────────────────────
EBITDA €97,200 €80,100 +21.3%
EBITDA Margin 20.0% 17.3% +2.7pp
Intercompany Elim. -€24,000 -€22,000
─────────────────────────────────────────────────────
Net Income €73,200 €58,100 +26.0%
─────────────────────────────────────────────────────
RECONCILIATION SUMMARY
─────────────────────────────────────────────────────
PyratzLabs Qonto: 247 transactions matched ✅
3 unmatched (total: €842) ⚠️
Zama Qonto: 412 transactions matched ✅
1 unmatched (total: €156) ⚠️
─────────────────────────────────────────────────────
Action: 4 items require manual review (see appendix)
6-MONTH CASH FLOW FORECAST
─────────────────────────────────────────────────────
Mar Apr May Jun Jul Aug
Revenue €498K €512K €528K €541K €558K €572K
Expenses -€392K -€398K -€402K -€408K -€412K -€418K
Net Cash +€106K +€114K +€126K +€133K +€146K +€154K
Balance €1.84M €1.95M €2.08M €2.21M €2.36M €2.51M
─────────────────────────────────────────────────────
⚠️ Legal/Professional fees +28.1% MoM — flagged for review
Likely cause: EuroNext filing preparation costs
The Results
| Metric | Manual Close | Agent Close |
|---|---|---|
| Time to first draft | 2-3 days | 30 seconds |
| Human review time | Built into the 2-3 days | 20 minutes (focused) |
| Total close time | 2-3 days | 25 minutes |
| Bank reconciliation | Manual, error-prone | Automated, 99.2% match rate |
| Intercompany elimination | Often missed items | Systematic, rule-based |
| Cash forecast | "We'll get to it" | Always included |
| Variance flagging | Manual, inconsistent | Automated (>20% MoM flagged) |
| Board-ready formatting | 2 hours in Slides | Auto-generated |
| Cost per month | ~€2K of CFO time | ~€0 (compute) |
| Annual savings | ~€24K in CFO time | — |
The variance flagging is the underrated feature. The +28.1% in legal fees got automatically flagged. Turns out it was EuroNext filing prep — expected and fine. But if it had been unexpected, we'd have caught it in 30 seconds instead of maybe noticing it during the board meeting.
Try It Yourself
- Sign up for Mr.Chief and install the
financial-statementsandreconciliationskills - Connect your accounting tool (Pennylane, Xero, QuickBooks) via API
- Connect your bank feed (Qonto, Mercury, etc.)
- Configure entity structure and intercompany rules
- Run monthly — or weekly if you want tighter cash monitoring
Monthly close shouldn't be an event. It should be a command. The numbers don't change because you spend more time looking at them. They change because you act on what they say. Spend less time closing. Spend more time deciding.
A CFO's value isn't in preparing the report. It's in what they do after reading it.
Related case studies
Startup CFO
Bank Reconciliation Across 3 Entities — 500 Transactions Matched in 60 Seconds
AI agent reconciles 500 transactions across 3 entities in 60 seconds. Qonto to Pennylane matching with fuzzy logic, duplicate detection, and misclassification flagging. Mr.Chief finance.
Startup CFO
6-Month Cash Flow Forecast — Updated Every Monday Morning
AI agent builds rolling 6-month cash flow forecasts with Monte Carlo simulation. 1,000 scenarios, P10/P50/P90 confidence bands, automated weekly updates. Mr.Chief CFO agent.
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.
Want results like these?
Start free with your own AI team. No credit card required.