The banker sends a CIM
Your banker emails over a CIM and a forecast. I want to know how much growth can disappoint before debt stops coming down, and what the equity return looks like without a higher exit multiple.
I’d give the agents the first pass through the documents and the financial definitions, then keep the cash-flow and debt calculations in code. I want to change growth, margin or financing and follow the effect through the annual schedule. The workbook should keep each case’s assumptions beside its results.
- DOCUMENTSCIM and financial schedulesPreserve files, periods, definitions and source locations.
- AGENT ANALYSISExtract and reconcileReturn financial findings, assumptions and unresolved gaps.
- MODEL INPUTSFinancials and assumptionsSeparate reported, calculated and assumed values.
- UNDERWRITING CASESBase, upside and downsideRecalculate cash flow, debt and equity returns for each case.
- WORKBOOKSheets, cells and formulasCompile the selected assumptions into editable schedules.
- READBACKFormulas and valuesCompare outputs and test case selectors.
Keep the CIM (confidential information memorandum), supporting files and their versions in a document manifest. Record the available text extracts and tables, and retain the filename, page or tab, period, currency and scale with each figure. You’ll want that reference when a number looks wrong three steps later.
Suppose a revenue schedule puts actual results and a forecast in adjacent columns. Preserve that distinction when extracting the table. A trailing-twelve-month figure also needs its own period label. For adjusted EBITDA, keep the adjustment bridge and definition alongside the amount; don’t leave the explanation behind in the PDF.
Give the agents a defined job
To get that first pass done, split it into five jobs. In the diagram, Jared handles diligence, Monica financial analysis, Richard thesis development, Dinesh synthesis and Gilfoyle evidence review. The harness is the code that supplies their instructions, tools and output schemas and runs the tasks in order.
Jared looks for contradictions, missing schedules and questions to send back to the banker. Monica extracts the operating history and forecast, defines the metrics and calculates supported ratios. Both read the evidence package. They run sequentially, but Monica goes back to the financial materials rather than using Jared’s report as her financial source.
EVIDENCE PACKAGE
DILIGENCE
Questions and contradictions
JaredDiligence analyst- INPUT
- CIM, financial schedules and supporting documents
- OUTPUT
- Questions, contradictions and evidence gaps
Identify missing schedules, conflicting definitions and follow-up questions.
FINANCIAL ANALYSIS
Periods and metrics
MonicaFinancial analyst- INPUT
- Financial tables, forecasts and metric definitions
- OUTPUT
- Historical financials, forecasts and sourced calculations
Extract operating history and forecasts with definitions and source references.
THESIS
Operating assumptions
RichardThesis writer- INPUT
- Diligence findings and financial analysis
- OUTPUT
- Operating proposals and the assumptions they require
Describe what would need to change and which inputs those changes affect.
SYNTHESIS
Combined evaluation
DineshInvestment evaluator- INPUT
- Diligence, financial and thesis outputs
- OUTPUT
- Combined structured evaluation
Assemble the findings without promoting an assumption to a reported fact.
EVIDENCE REVIEW
Draft against documents
GilfoyleEvidence reviewer- INPUT
- Draft evaluation and original supporting materials
- OUTPUT
- Reviewed evaluation with unsupported claims corrected
Remove or qualify claims the supplied evidence does not support.
Robot sketches adapted from Robohash set1 by Zikri Kader (CC BY 3.0 / 4.0).
For a software business, ask Monica to reconcile revenue, annual recurring revenue, bookings and billings. A services invoice in the sales table shouldn’t quietly join the recurring-revenue series. Each metric needs a definition, a period and a source, with missing and conflicting values recorded separately.
Richard takes the diligence and financial outputs and describes what would need to change in the business. Dinesh assembles the findings into one evaluation. Gilfoyle checks the draft against the materials and removes or qualifies unsupported claims. The reviewed output keeps the same structured shape so the model can read it.
Give the agents tools that fit those jobs. A document reader retrieves narrative evidence. Table tools list registered tables, describe columns and run read-only queries. The runtime controls the available files and tables; text inside a CIM or cell comment cannot grant another permission.
Also decide what happens when a task fails. Record the failure and the missing fields, then carry those gaps forward. A typed response can reject a string where a number belongs. It won’t tell you whether somebody put bookings in the ARR column.
Decide what goes into the model
Monica’s output now has to become something the model can use: entry period, revenue, EBITDA, historical periods and a projection basis, all with source notes. Put financing and operating assumptions in a separate record. I want to be able to point to a value and say where it came from.
If the materials give you revenue and an EBITDA margin, calculate EBITDA and retain the expression and both inputs. If the margin is missing too, you need an assumption or another answer from the banker. An analyst-entered margin must stay distinguishable from a reported one.
Missing evidence and model assumptions are different fields. A default can make an example runnable, but it cannot establish a business fact. Record which rows were reported, calculated or assumed. One source-status label for the whole package loses that distinction when the origins are mixed.
The assumptions record covers valuation, debt, interest, fees, cash requirements, taxes, capex, working capital and hold period. Validate units and ranges before calculation. A percentage entered as 25 instead of 0.25 should fail a decimal-rate contract. An EBITDA-based purchase multiple needs EBITDA for the stated entry period.
For the worked numbers, use Pied Piper: entry revenue of $100m, EBITDA of $25m and an entry multiple of 10×. Debt and sponsor equity fund the acquisition. The entry table separates enterprise value, fees and cash funded into the business, so you can reproduce the equity cheque.
| MODEL LINE | USD MILLIONS |
|---|---|
| ENTRY ENTERPRISE VALUE | 250.00 |
| FEES | 5.00 |
| FUNDED CASH | 5.00 |
| TOTAL USES | 260.00 |
| ENTRY DEBT | 125.00 |
| SPONSOR EQUITY | 135.00 |
| EXIT ENTERPRISE VALUE | 367.33 |
| EXIT DEBT | 57.48 |
| EXIT CASH | 5.00 |
| EXIT EQUITY | 314.85 |
Keep the plan, then underwrite it
Keep management’s forecast as a reference, then write down what you’re willing to underwrite. I’d keep those in different records so the assumptions have an owner. Build base, upside and downside cases, each stating how growth, margins, financing or exit assumptions differ.
Each case needs a complete assumption set. The upside might combine higher growth with better margins and a different exit multiple. The downside tests slower growth, weaker margins and a lower exit multiple. I’d show those changes beside the return, including the case with no help from a higher exit multiple.
Take Richard’s operating proposals back to the inputs. If the thesis depends on pricing, specify whether it changes revenue growth, gross margin or both, and when. A cost program needs a margin path. A paragraph saying pricing will improve is not yet a forecast assumption.
Keep the reference forecast unchanged when editing a case. Store overrides separately and retain them with the outputs. In the Pied Piper comparison, forecast growth, forecast EBITDA margin and exit multiple change. Entry EBITDA, purchase enterprise value of $250m and sponsor equity of $135m stay fixed.
Run those three input sets through the same calculation. The case selector below lets you compare the assumptions and resulting returns. The labels describe scenarios; they don’t attach a probability to what happens.
Pied Piper underwriting cases
Select a case to view its assumptions and calculated returns.
Base, upside and downside case comparison for Pied Piper. All three retain the same entry transaction and recalculate the five-year cash and debt schedules.
BASE
CASE ASSUMPTIONS
- REVENUE GROWTH
- 8%
- FORECAST EBITDA MARGIN
- 25%
- ENTRY EV / EBITDA
- 10×
- EXIT EV / EBITDA
- 10×
CALCULATED RETURNS
- EXIT EQUITY
- $314.85m
- EQUITY MOIC
- 2.33×
- ANNUALIZED EQUITY RETURN
- 18.5%
ANNUAL CASH AND DEBT
| MODEL LINE | YEAR 1 | YEAR 2 | YEAR 3 | YEAR 4 | YEAR 5 |
|---|---|---|---|---|---|
| REVENUE | 108.00 | 116.64 | 125.97 | 136.05 | 146.93 |
| EBITDA | 27.00 | 29.16 | 31.49 | 34.01 | 36.73 |
| CASH FLOW BEFORE REPAYMENT | 9.25 | 11.15 | 13.26 | 15.62 | 18.24 |
| DEBT REPAYMENT | 9.25 | 11.15 | 13.26 | 15.62 | 18.24 |
| CLOSING DEBT | 115.75 | 104.61 | 91.34 | 75.72 | 57.48 |
| CLOSING CASH | 5.00 | 5.00 | 5.00 | 5.00 | 5.00 |
| CASE | REVENUE GROWTH | FORECAST EBITDA MARGIN | ENTRY EV / EBITDA | EXIT EV / EBITDA | EXIT EQUITY | EQUITY MOIC | ANNUALIZED EQUITY RETURN |
|---|---|---|---|---|---|---|---|
| BASE | 8% | 25% | 10× | 10× | $314.85m | 2.33× | 18.5% |
| UPSIDE | 10% | 27% | 10× | 10.5× | $420.4m | 3.11× | 25.5% |
| DOWNSIDE | 5% | 22% | 10× | 9× | $178.39m | 1.32× | 5.7% |
Change a lever and follow the cash
Say you want to test the growth assumption. Follow it through revenue, EBITDA, tax, capex and working capital before looking at the return. Do the same for a financing change: debt affects interest, repayment and the balance left at exit.
In the base example, Year 1 revenue is $108m and EBITDA is $27m. Opening debt is $125m, so opening-balance interest is $10m. Depreciation affects tax; it is not deducted again from cash. After tax, capex and the working-capital increase, $9.25m remains before debt repayment.
Year 1 cash-flow calculation
Subtract interest, cash tax, capex and the working-capital increase from EBITDA.
USD MILLIONS
- CASH FLOW BEFORE REPAYMENT
- 9.25
- RUNNING TOTAL
- 9.25
DATA TABLE
| STEP | CHANGE | RUNNING TOTAL |
|---|---|---|
| EBITDA | 27.00 | 27.00 |
| INTEREST | −10.00 | 17.00 |
| CASH TAX | −3.71 | 13.29 |
| CAPEX | −3.24 | 10.05 |
| WORKING CAPITAL | −0.80 | 9.25 |
| CASH FLOW BEFORE REPAYMENT | 9.25 | 9.25 |
The sweep uses cash above the $5m minimum balance and cannot repay more than the debt outstanding. Year 1 ends with $115.75m of debt. If the calculation cannot maintain the cash floor, it raises a cash-shortfall error. Once debt is repaid, further cash accumulates.
Now change the debt amount. The initial equity cheque changes, but so do interest, tax, cash available for repayment and later debt balances. Reusing the original debt schedule would leave out those effects. I’d inspect the annual schedule before spending much time on the new IRR.
Revenue and closing debt
Revenue grows from $100m at acquisition to $146.93m in Year 5. Cash flow repays debt from $125m to $57.48m.
USD MILLIONS
YEAR 5
- REVENUE
- 146.93
- CLOSING DEBT
- 57.48
DATA TABLE
| PERIOD | ENTRY | YEAR 1 | YEAR 2 | YEAR 3 | YEAR 4 | YEAR 5 |
|---|---|---|---|---|---|---|
| REVENUE | 100.00 | 108.00 | 116.64 | 125.97 | 136.05 | 146.93 |
| CLOSING DEBT | 125.00 | 115.75 | 104.61 | 91.34 | 75.72 | 57.48 |
| MODEL LINE | ENTRY | YEAR 1 | YEAR 2 | YEAR 3 | YEAR 4 | YEAR 5 |
|---|---|---|---|---|---|---|
| REVENUE | 100.00 | 108.00 | 116.64 | 125.97 | 136.05 | 146.93 |
| EBITDA | 25.00 | 27.00 | 29.16 | 31.49 | 34.01 | 36.73 |
| DEPRECIATION | — | 2.16 | 2.33 | 2.52 | 2.72 | 2.94 |
| OPENING DEBT | — | 125.00 | 115.75 | 104.61 | 91.34 | 75.72 |
| INTEREST | — | 10.00 | 9.26 | 8.37 | 7.31 | 6.06 |
| CASH TAX | — | 3.71 | 4.39 | 5.15 | 6.00 | 6.93 |
| CAPEX | — | 3.24 | 3.50 | 3.78 | 4.08 | 4.41 |
| CHANGE IN WORKING CAPITAL | — | 0.80 | 0.86 | 0.93 | 1.01 | 1.09 |
| CASH FLOW BEFORE REPAYMENT | — | 9.25 | 11.15 | 13.26 | 15.62 | 18.24 |
| OPENING CASH | — | 5.00 | 5.00 | 5.00 | 5.00 | 5.00 |
| CASH BEFORE REPAYMENT | — | 14.25 | 16.15 | 18.26 | 20.62 | 23.24 |
| DEBT REPAYMENT | — | 9.25 | 11.15 | 13.26 | 15.62 | 18.24 |
| CLOSING DEBT | 125.00 | 115.75 | 104.61 | 91.34 | 75.72 | 57.48 |
| CLOSING CASH | 5.00 | 5.00 | 5.00 | 5.00 | 5.00 | 5.00 |
| CASH SHORTFALL | — | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
At exit, value the business using final-year EBITDA and the exit multiple. This example includes all closing cash in equity proceeds, no exit fees and full sponsor ownership. The equity bridge is . Divide the proceeds by initial sponsor equity to get .
Exit equity calculation
$367.33m enterprise value − $57.48m debt + $5m cash = $314.85m equity proceeds.
USD MILLIONS
- EQUITY PROCEEDS
- 314.85
- RUNNING TOTAL
- 314.85
DATA TABLE
| STEP | CHANGE | RUNNING TOTAL |
|---|---|---|
| ENTERPRISE VALUE | 367.33 | 367.33 |
| DEBT | −57.48 | 309.85 |
| CASH | +5.00 | 314.85 |
| EQUITY PROCEEDS | 314.85 | 314.85 |
The annualized return is 18.5% over five years with no interim distributions. Distributions on other dates need the corresponding cash-flow calculation; Google distinguishes IRR for periodic cash flows from XIRR for irregular dates.
Run the cases, then the sensitivities
Now take the base case and lower growth while keeping the exit multiple fixed. Inspect how cash available for repayment and the debt balance change. Then vary both inputs across a grid, with annualized equity return in each cell. Name the axes and output so there’s no guessing what the colors mean.
In this public example, every grid point reruns the annual operating and debt schedules. That matters when growth changes working-capital investment or debt changes interest. Keeping the original ending-debt figure would hide part of the effect you’re trying to test.
Revenue growth and exit multiple
Each cell reruns the five-year model with the selected growth rate and exit multiple.
ANNUALIZED EQUITY RETURN
Five-by-five annualized equity-return table. Revenue growth runs from 4% to 12% across five values; exit multiples run from 8× to 12×. The center uses base-case growth and exit assumptions.
EXIT EV / EBITDA
REVENUE GROWTH
SELECTED ASSUMPTIONS
- REVENUE GROWTH
- 8%
- EXIT EV / EBITDA
- 10×
- ANNUALIZED EQUITY RETURN
- 18.5%BASE
SENSITIVITY DATA
| EXIT EV / EBITDA | |||||
|---|---|---|---|---|---|
| REVENUE GROWTH | 8× | 9× | 10× | 11× | 12× |
| 4% | 6.1% | 9.4% | 12.4% | 15.1% | 17.6% |
| 6% | 9.3% | 12.5% | 15.5% | 18.1% | 20.6% |
| 8% | 12.3% | 15.6% | 18.5%BASE | 21.1% | 23.5% |
| 10% | 15.3% | 18.5% | 21.3% | 24% | 26.4% |
| 12% | 18.1% | 21.3% | 24.2% | 26.8% | 29.2% |
Start with the center cell and compare it with the base case. Then move along a row or column. An entry-multiple versus exit-multiple table examines purchase price and sale valuation; a growth versus exit-multiple table combines an operating assumption with valuation.
- EQUITY MOIC
- 2.33×
- Exit equity proceeds divided by initial sponsor equity.
- ANNUALIZED EQUITY RETURN
- 18.46%
- Five-year return with no interim distributions.
- EXIT EQUITY
- 314.85
- Includes all closing cash; no exit fees.
The base example produces 2.33× and 18.5%. When another cell looks attractive, open its schedule and inspect the implied revenue, margin, debt balance and cash requirement. Read those rows alongside the return.
Save the input set and calculation result for every run. When you return to the workbook, a chart or return should identify its case. You also need to distinguish a changed assumption from new evidence in an updated forecast.
Put the model in Google Sheets
Once you’ve worked through those cases, put the model into an editable workbook. The compiler assigns inputs and calculations to sheets, cells and formulas. Keep the operating model, debt schedule, cash flow and returns linked to the selected case. A case selector needs to change those references as well as the displayed name.
The downloadable example uses three sheets: Inputs, CashFlow and Returns. Its manifest records 92 formula cells. In CashFlow!C13, =MIN(C5,MAX(C12-Inputs!$B$9,0)) caps repayment at opening debt and cash above the minimum balance. Keep the address and expression together.
SELECTED CELL The expression is a compiled workbook formula. Its displayed result comes from the local evaluator.
Before writing, compare formula coordinates with the manifest and reject unexpected or missing formulas. Write literal contents with RAW, then write only the compiler’s formula cells with USER_ENTERED. Google’s input-option reference explains the difference: RAW leaves strings unparsed; USER_ENTERED interprets them as spreadsheet input.
The two batch methods do different work. spreadsheets.values.batchUpdate writes cell ranges. spreadsheets.batchUpdate applies structural requests such as formatting, validation and charts. Keep the formatting requests separate from the financial calculation.
A live export needs an authenticated account, a destination and a sharing policy. The example’s helper accepts an authenticated service and leaves sign-in and permissions to the caller. Check Sheets scopes and Drive access rules for that account and destination.
Read it back, then rerun it
Don’t stop at the new spreadsheet URL. Read the formulas and calculated values back. Google’s render-option reference defines FORMULA and UNFORMATTED_VALUE; its cell reference distinguishes entered formulas, effective values and calculation errors.
Check required sheets and ranges, formula errors, financing identities and selected outputs. If the workbook has a case selector, switch it, read the dependent ranges and compare them with that case’s expected results. Then restore the original selection. You want the numbers to move with the case.
- Entry debt + sponsor equity = enterprise value + fees + funded cash.
- Opening debt − repayment = closing debt.
- Opening cash + cash flow before repayment − repayment = closing cash.
The worked example evaluates all 92 formulas locally and compares 85 numeric cells with the Python calculation. Its 102 checks include those comparisons and cash, debt and financing identities. The preview shows those local results; Google Sheets has not calculated them.
One test deliberately changes the closing-debt formula to add repayment and changes the manifest to match. The formula text agrees with the manifest, but Year 1 debt becomes $134.25m instead of $115.75m. The numeric comparison fails. Compare formula text and calculated values separately.
Then your banker sends version two of the forecast. Keep the old file, record the new source version and review which inputs changed before rerunning the cases. A model can balance while using the wrong period or an assumed margin. The source references let you go back to the document and make that decision.
To run the calculation yourself, use python3 run.py from the downloaded example’s root, then python3 -m unittest discover -s . -v for the tests. Change inputs.json to change the assumptions. The download contains the financial calculation, workbook compiler and local verifier; the document-analysis sequence above is pseudocode.
- INSTRUCTIONS
SKILL.mdCommands and modeling conventions. - INPUTS
inputs.jsonEntry, forecast and financing assumptions. - CALCULATION
model.pyAnnual cash, debt and equity proceeds. - WORKBOOK
workbook.pyInputs and formulas assigned to cells. - VERIFICATION
verify.pyFormulas evaluated; outputs compared.
EXPORT IS A SEPARATE CALL
- 1The worked model includes all closing cash in equity proceeds. It assumes no interim dividends, no exit fees and full sponsor ownership.
- 2Keep reported values, calculated amounts and analyst assumptions distinct. A passing calculation does not establish the source of an input.