Cap table & exit waterfall simulator with full liquidation-preference logic.
Model founder/investor dilution across rounds — then simulate any exit (strategic sale, secondary, IPO) and see exactly who gets what, with correct 1x/2x, participating, capped, and stacked-seniority preferences.
exitsim captable company.json
exitsim exit company.json --value 5000000000
exitsim breakeven company.json --holder "Seed Fund" --multiple 3At exit, preferred shareholders don't just take their %. Each one chooses max(liquidation preference, as-converted value) — and one investor's choice changes the common per-share value for everyone else. ExitSim solves this interdependence by iterating to a stable solution, then applies:
- 1x / 2x non-participating preferences
- Participating preferred (double-dip) with optional caps
- Seniority stacking (later rounds senior to earlier)
- ESOP pool top-ups (pre-money dilution)
{
"founders": [
{"name": "Founder 1", "shares": 5000000},
{"name": "Founder 2", "shares": 3000000}
],
"esop": 1000000,
"rounds": [
{"name": "Seed", "pre_money": 90000000, "investment": 10000000,
"investor": "Seed Fund", "liq_pref": 1.0},
{"name": "Series A", "pre_money": 240000000, "investment": 60000000,
"investor": "Series A Fund", "liq_pref": 1.0, "participating": false}
]
}from exitsim import CapTable, FundingRound, simulate_exit, breakeven_exit
cap = CapTable()
cap.add_founder("Alice", 8_000_000)
cap.apply_round(FundingRound("Seed", pre_money=8e6, investment=2e6,
investor_name="Seed Fund", liq_pref_multiple=1.0))
# At a low exit, the investor takes its 1x preference
low = simulate_exit(cap, 4_000_000)
print(low.by_name("Seed Fund").proceeds) # 2,000,000 (preference)
# At a high exit, it converts to common
high = simulate_exit(cap, 100_000_000)
print(high.by_name("Seed Fund").converted_to_common) # True
# Find the exit value where Seed Fund triples its money
print(breakeven_exit(cap, "Seed Fund", target_multiple=3.0))| Command | Purpose |
|---|---|
exitsim captable <file> |
Show ownership & dilution |
exitsim exit <file> --value N |
Full exit waterfall at value N |
exitsim breakeven <file> --holder X --multiple M |
Exit value for a target return |
© 2026 Bhupendra Gurjar. All rights reserved. Commercial license.