Skip to content

bhupendra05/exitsim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ExitSim 📊

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 3

Why it's hard (and why this exists)

At 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)

Input format (JSON)

{
  "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}
  ]
}

Python API

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))

Commands

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.

About

Cap table & exit waterfall simulator — liquidation preferences, participating preferred, seniority stacking, dilution, breakeven solver

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages