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.