Compute · Assess & Decide · Analysis & Finance
Liquidation preference vs convert election calculator
The founder can predict, deterministically, what each preferred holder will choose at any exit value and the resulting proceeds split.
You receive: A pure function electionPayout(exitValue, investedAmount, liquidationMultiple, type, participationCapMultiple, preferredOwnershipFraction) -> { election (enum: take_preference|convert), preferredProceeds, commonProceeds } graded on hidden numeric cases. Assumes single preferred class, no debt, no option pool, residual to common is shared pro rata; preferred holds preferredOwnershipFraction of fully-converted shares.
Part of Pitch Investors
Example
A sample of what this play produces. Your result is generated for your inputs.
"""Liquidation preference vs convert election.
Authored as STUD.com's own term-sheet planning tool for the illustrative
$1,000,000 pre-seed target (labeled illustrative, not a committed raise).
Given an exit value, it returns the rational preferred-holder election
(take the liquidation preference, or convert to common) and the resulting
proceeds split, under the stated assumptions: a single preferred class,
no debt, no option pool, residual to common shared pro rata, and the
preferred holder owning preferredOwnershipFraction of fully-converted shares.
Worked illustrative STUD scenario: a 1x non-participating preferred that
invested $1,000,000 for 20% would convert at any exit above $5,000,000
(where 0.20 * exit exceeds the $1,000,000 preference); at a $10,000,000
exit it converts and takes $2,000,000, leaving $8,000,000 to common.
"""
def electionPayout(input):
typ = str(input["type"]).strip().lower()
exit_v = float(input["exitValue"])
invested = float(input["investedAmount"])
mult = float(input["liquidationMultiple"])
own = float(input["preferredOwnershipFraction"])
preference = mult * invested
if typ == "non_participating":
# The holder takes the higher of the straight preference (capped by
# the exit value itself) or the as-converted pro rata share.
convert_value = own * exit_v
if convert_value > preference:
election, preferred = "convert", convert_value
else:
election, preferred = "take_preference", min(preference, exit_v)
elif typ == "full_participating":
# Preference first, then pro rata participation in the residual.
# Converting can never beat this, so the election is always
# take_preference; below the preference the holder sweeps the exit.
if exit_v >= preference:
take = preference + own * (exit_v - preference)
else:
take = exit_v
election, preferred = "take_preference", min(take, exit_v)
elif typ == "capped_participating":
# Participation is capped at capMultiple * invested; past the cap
# the rational holder converts when pro rata exceeds the capped take.
cap_value = float(input["participationCapMultiple"]) * invested
participating = min(preference + own * max(0.0, exit_v - preference),
cap_value)
convert_value = own * exit_v
if convert_value > participating:
election, preferred = "convert", convert_value
else:
election, preferred = "take_preference", participating
else:
raise ValueError("unknown preference type: " + typ)
common = exit_v - preferred
return {
"election": election,
"preferredProceeds": round(preferred, 2),
"commonProceeds": round(common, 2),
}
Opens later
This play is not open to run yet, so it has no price. Leave your email and STUD will tell you when it opens.
Scope of the check
What's verified: STUD verifies the function reproduces the reference election and payout on hidden numeric cases under the stated single-class, debt-free, no-option-pool assumptions. STUD does NOT model multi-class stacks, option-pool dilution, debt seniority, or real-world tax (e.g. SEIS/EIS) effects.