
GP/LP Waterfall in Excel: Building the Split That Holds Up
There are two audiences for every GP/LP waterfall spreadsheet: the sponsor who builds it, and the limited partner who — sooner or later, usually at distribution time — audits it. A waterfall that "holds up" is one that survives the second audience: every allocation traceable, every term visible as an input, every period's cash accounted for to the penny.
This is the hands-on build guide: the sheet layout, the actual formula patterns for pref accrual and tier allocation, the hurdle-boundary technique that separates working models from broken ones, and the tie-outs that make the file defensible. It assumes you know what the structures mean — the taxonomy of waterfall structures and the architecture-level build pillar cover that ground — and gets straight to construction. All figures are illustrative; build to your operating agreement, not to this article's example terms.
The Layout: Columns Are Periods, Blocks Are Accounts
Structure the sheet before writing a formula:
- One column per distribution period (monthly or quarterly for real deals — annual columns force a fiction onto irregular cash), with a date row at the top; every IRR test downstream will consume it.
- An inputs block, alone at the top left: pref rate, compounding convention, hurdle rates, tier splits, catch-up toggle and target, GP co-invest percentage. Visually distinct cells, referenced everywhere, hardcoded nowhere. When an LP asks "which eight percent is this?", the answer should be a cell, not an archaeology project.
- Per-partner account blocks (one for LP, one for GP), each carrying four running balances by period: capital contributed, capital returned, pref accrued, pref paid. These balances are the model's memory — every tier decision reads them, and every allocation updates them.
- The distribution engine below: for each period, distributable cash entering at the top and the tier allocations cascading down.
The discipline this layout enforces is the one that matters: the waterfall is a state machine, and the state lives in named balance rows a reviewer can watch evolve across the columns.
Formula Pattern 1: Pref Accrual on the Right Base
The pref accrues on unreturned capital — the balance that shrinks as capital comes back — at the agreement's convention. The period pattern, in words and then structure:
Accrued pref this period = prior accrued balance (± compounding) + unreturned capital at the start of the period × pref rate × the period's fraction of a year − pref paid this period.
As a formula skeleton, with rows for the balances:
UnreturnedCapital_t = UnreturnedCapital_(t-1) − CapitalReturned_t
PrefAccrual_t = UnreturnedCapital_(t-1) * PrefRate * DaysInPeriod/365
PrefBalance_t = PrefBalance_(t-1) + PrefAccrual_t − PrefPaid_t
Two convention switches to wire as inputs, not as rewrites. Simple versus compounding: in the simple version, accrual runs only on capital; in the compounding version, the accrual base includes the unpaid pref balance itself (add PrefBalance_(t-1) into the accrual base, at the agreement's compounding frequency). Ordering: if the agreement returns capital before pref, the capital-returned row updates before the accrual reads it. Both switches move real money — the preferred return calculator guide quantifies how much — and both are one-cell toggles in a well-built sheet.
Formula Pattern 2: The Tier Cascade
Each period's distributable cash runs down the tiers, and the pattern for every tier is the same MIN-and-remainder construction:
Tier1_Allocation = MIN(CashRemaining, PrefBalance_t) // pay accrued pref
CashRemaining = CashRemaining − Tier1_Allocation
Tier2_Allocation = MIN(CashRemaining, UnreturnedCapital_t) // return capital
CashRemaining = CashRemaining − Tier2_Allocation
...residual tiers split CashRemaining per the current ratio
Each allocation then feeds back into the account blocks (pref paid, capital returned) before the next column begins. The MIN construction is what makes the cascade robust: a tier can never take more than the cash available or more than the claim outstanding, in any period, in any scenario — which is precisely the guarantee a hand-built split of "cash × percentage" does not provide.
Where both partner classes share a tier (pari passu pref, pro-rata capital), split each tier's allocation by the capital ratio before it hits the accounts.
Formula Pattern 3: The Hurdle Boundary
Multi-hurdle structures add the hard part: the residual split's ratio depends on the LP's IRR, tested with the current distribution included. The naive implementation — compute last period's LP IRR, pick the tier, allocate everything at that ratio — is wrong at every hurdle crossing, because the distribution that crosses a hurdle must be split: enough at the lower tier's ratio to bring the LP exactly to the hurdle, the excess at the next tier's ratio.
The working technique:
- Maintain the LP's dated cash flow array (contributions negative, distributions positive) as its own row block.
- For each period's residual, compute the make-whole amount: the total LP distribution that would set
XIRR(LP cash flows including this period) = HurdleRate. This has a closed-form flavor — the LP amount that zeroes the NPV of the LP flows at the hurdle rate — implementable as a formula: the future-valued deficiency of the LP's flows at the hurdle rate, i.e. what the LP is still owed, at that discount rate, as of this date. - Allocate residual cash at the lower tier's ratio up to the point where the LP's share reaches the make-whole amount (
MINagain), then flow the remainder to the next tier's ratio — repeating for each higher hurdle.
Practical notes from the trenches: use XIRR with the date row, never IRR with assumed periods; give XIRR a guess argument to stabilize convergence; and if you implement the make-whole via the NPV-deficiency formula rather than iteration, add a verification cell that recomputes the LP's XIRR after allocation and flags any period where a crossed hurdle does not land within a rounding tolerance of the hurdle rate. That one flag catches the entire class of boundary errors.
Formula Pattern 4: The Catch-Up as a Make-Whole
If the agreement has a GP catch-up, resist the urge to model it as a split ratio. It is a target with a stop: after the pref tier, the GP receives its catch-up share of distributions until GP profit-to-date equals the target percentage of total profit-to-date — then the tier closes. The construction: a running "GP profit" and "total profit" pair of rows, a target cell, and a MIN allocation of (what would make GP profit hit the target) against (cash remaining × catch-up share). Get this tier wrong and the error is rarely small; the structures guide walks the dollar impact of the clause itself.
One Period, Traced Through the Patterns
To see the patterns cooperate, trace a single quarter (illustrative). State entering the period: LP unreturned capital $900,000, GP $100,000; accrued unpaid pref $18,000 LP / $2,000 GP (pari passu); distributable cash this quarter, $95,000.
- Accrual first: 8% × 90/365 on the opening balances adds roughly $17,753 LP / $1,973 GP to the pref rows — balances now ~$35,753 and ~$3,973.
- Tier 1 (pref):
MIN($95,000, $39,726)pays the full ~$39,726; cash remaining ~$55,274. Pref-paid rows update; pref balances return to zero. - Tier 2 (capital): the agreement returns capital only at capital events, so this ordinary-distribution quarter allocates nothing here — the toggle for which distributions touch which tiers is itself an input.
- Residual: ~$55,274 splits at the current tier's ratio; the LP's dated cash flow row picks up its share; the hurdle test recomputes the LP XIRR with it included and confirms no boundary was crossed.
- Tie-outs: allocations sum to $95,000.00; no balance went negative; the strip stays green.
Five rows of arithmetic, every dollar accounted for, and — the point of the whole construction — an LP could re-derive the quarter from the statement with a calculator.
The Tie-Out Block: Non-Negotiable
Under the engine, build a permanent audit strip — one row of checks per period, all of which must read TRUE:
=ROUND(SUM(all allocations this period) − DistributableCash, 2) = 0 // no leaks
=UnreturnedCapital >= 0 // no over-return
=PrefBalance >= 0 // no over-payment
Plus two whole-model checks: each partner's lifetime cash flows sum to the deal's totals, and (for hurdle structures) the post-crossing XIRR verification above. Conditional-format the strip red-on-FALSE. A waterfall without tie-outs is not conservative or aggressive — it is unknown, and unknown is the one thing an LP-facing file is not allowed to be.
Making It LP-Auditable
The final construction layer is presentational, and it is what "holds up" means in practice:
- A terms page restating the inputs in the agreement's own vocabulary, cell-referenced to the engine — so the LP audits terms against the document, not against your formulas.
- A per-period distribution statement per partner class: opening balances, accruals, each tier's allocation, closing balances. This is the artifact you attach to a distribution notice, and if the model's account blocks are built as above, it is a formatting exercise, not a rebuild.
- No hidden sheets, no protection, no VBA. The file's transparency is the trust product. A sponsor who sends a locked waterfall is asking LPs a question they should not have to answer.
- A clawback view for deal-by-deal structures: the full-history waterfall recomputed from inception, compared against promote actually paid — the number an LP's counsel will eventually request, pre-built. Whether your structure needs one is a scope question; American vs. European waterfall covers which structures carry the exposure.
Frequently Asked Questions
Can I build a multi-hurdle GP/LP waterfall without VBA or iteration? Yes. The hurdle boundary has a formula-tractable implementation (the NPV-deficiency make-whole), and everything else is MIN cascades and running balances. Add the XIRR verification flag regardless of method.
Monthly or annual periods? Match the deal's actual distribution rhythm — usually monthly or quarterly. Annual periods distort every hurdle test, because XIRR on misdated flows is a precise answer to the wrong question.
How do I handle capital calls after the initial closing? As negative entries in the contribution rows on their actual dates: the unreturned-capital balance rises, the pref accrues on the new base from the call date, and the LP cash flow array carries the outflow for every subsequent hurdle test. The state-machine layout absorbs this without structural change — which is much of why it is the right layout.
What if my operating agreement's waterfall doesn't match any standard structure? Then the agreement wins, always. The patterns here are components — accrual, cascade, boundary, make-whole — and a bespoke structure is a different assembly of the same parts. If a clause resists clean implementation, that is worth a conversation with counsel before the first distribution, not a modeling shortcut.
The Build, Already Audited
Every pattern in this guide — the state-machine layout, the accrual and ordering toggles, the MIN cascades, the hurdle make-whole with XIRR verification, the catch-up as a true target-and-stop, the full tie-out strip, and the LP-facing statements — ships assembled and documented in The Waterfall Model: fully unlocked, no VBA, versioned, with a methodology PDF that maps each mechanism to the operating-agreement language it implements. Build yours from this guide, or audit ours against it — the patterns are the same either way.
This article is for educational purposes only and does not constitute investment, legal, or tax advice. All figures are illustrative examples. Waterfall structures vary; the operating agreement governs any actual deal — have it reviewed by qualified counsel, and verify any model against it.
Get the next breakdown in your inbox
New CRE modeling walkthroughs 3× per week. No spam, unsubscribe anytime.


