Startup CFO

Monthly P&L From Pennylane in 30 Seconds β€” Formatted for the Board

2-3 days β†’ 25 minutes monthly closeStartup Finance5 min read

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

MetricManual CloseAgent Close
Time to first draft2-3 days30 seconds
Human review timeBuilt into the 2-3 days20 minutes (focused)
Total close time2-3 days25 minutes
Bank reconciliationManual, error-proneAutomated, 99.2% match rate
Intercompany eliminationOften missed itemsSystematic, rule-based
Cash forecast"We'll get to it"Always included
Variance flaggingManual, inconsistentAutomated (>20% MoM flagged)
Board-ready formatting2 hours in SlidesAuto-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

  1. Sign up for Mr.Chief and install the financial-statements and reconciliation skills
  2. Connect your accounting tool (Pennylane, Xero, QuickBooks) via API
  3. Connect your bank feed (Qonto, Mercury, etc.)
  4. Configure entity structure and intercompany rules
  5. 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.

PennylaneQontomonthly-closeP&Lcash-flow-forecast

Want results like these?

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

Monthly P&L From Pennylane in 30 Seconds β€” Formatted for the Board β€” Mr.Chief