109 lines
3.6 KiB
Python
109 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Felt Financial Model v5 — Bare bones reality
|
||
Only costs that are truly required. No fluff.
|
||
"""
|
||
|
||
EUR_TO_DKK = 7.45
|
||
|
||
print("=" * 75)
|
||
print("FELT FINANCIAL MODEL v5 — BARE BONES BOOTSTRAP")
|
||
print("=" * 75)
|
||
|
||
# Year 1-2: absolute minimum
|
||
# Year 3+: add things as revenue justifies them
|
||
|
||
phases = [
|
||
{
|
||
"label": "Year 1-2 (Bootstrap)",
|
||
"costs": [
|
||
("Hetzner dedicated (16c/32t, 64GB, 2×1TB)", 100),
|
||
("Domains (felt.io + a couple reserves)", 8),
|
||
("Transactional email (Mailgun free tier → $15)", 10),
|
||
],
|
||
},
|
||
{
|
||
"label": "Year 3+ (Revenue covers it)",
|
||
"costs": [
|
||
("Hetzner primary", 100),
|
||
("Hetzner backup/second server", 100),
|
||
("Domains", 8),
|
||
("Transactional email", 15),
|
||
("SMS (Twilio)", 10),
|
||
("Accounting (€1k/yr ÷ 12)", 83),
|
||
("Insurance (if casino clients require it)", 50),
|
||
],
|
||
},
|
||
]
|
||
|
||
for phase in phases:
|
||
total = sum(c for _, c in phase["costs"])
|
||
print(f"\n {phase['label']}:")
|
||
for name, cost in phase["costs"]:
|
||
print(f" {name:<55s} €{cost:>5}/mo")
|
||
print(f" {'─' * 60}")
|
||
print(f" {'TOTAL:':<55s} €{total:>5}/mo = €{total*12:,}/yr")
|
||
|
||
bootstrap_monthly = sum(c for _, c in phases[0]["costs"])
|
||
|
||
print(f"\n Your actual burn in Year 1-2: €{bootstrap_monthly}/mo")
|
||
print(f" That's {bootstrap_monthly * EUR_TO_DKK:.0f} DKK/mo. Less than a tournament buy-in.")
|
||
|
||
# ================================================================
|
||
# 5-YEAR WITH REAL COSTS
|
||
# ================================================================
|
||
print(f"\n{'=' * 75}")
|
||
print("5-YEAR PROJECTION")
|
||
print(f"{'=' * 75}")
|
||
|
||
years = [
|
||
("Year 1 — Build + DK early adopters", 40, 3, 2, 0, 0, 118, 0),
|
||
("Year 2 — DK saturated, word of mouth", 120, 12, 6, 0, 0, 118, 1000),
|
||
("Year 3 — Nordics, first casino", 300, 30, 18, 2, 0, 366, 1000),
|
||
("Year 4 — N. Europe, casino growth", 550, 50, 35, 4, 3, 466, 1000),
|
||
("Year 5 — International, lifestyle", 800, 70, 50, 6, 8, 566, 1000),
|
||
]
|
||
# columns: label, free, offline, pro, casino_starter, casino_pro_properties, monthly_fixed, annual_accounting
|
||
|
||
cumulative = 0
|
||
|
||
for i, (label, free, off, pro, cs, cp, fixed, acct) in enumerate(years):
|
||
rev = off * 25 + pro * 100 + cs * 249 + cp * 499
|
||
annual_rev = rev * 12
|
||
|
||
var = free * 0.45 + off * 0.65 + pro * 1.15 + cs * 5.15 + cp * 10.15
|
||
annual_cost = (fixed + var) * 12 + acct
|
||
|
||
net = annual_rev - annual_cost
|
||
cumulative += net
|
||
net_mo = net / 12
|
||
|
||
paying = off + pro + cs + cp
|
||
total = free + paying
|
||
|
||
print(f"\n Year {i+1}: {label}")
|
||
print(f" {total} venues ({free} free, {paying} paying) | Fixed: €{fixed}/mo")
|
||
print(f" Revenue: €{rev:>7,}/mo = €{annual_rev:>8,}/yr")
|
||
print(f" Costs: €{fixed+var:>7,.0f}/mo = €{annual_cost:>8,.0f}/yr")
|
||
print(f" Net: €{net_mo:>7,.0f}/mo = €{net:>8,.0f}/yr (cum: €{cumulative:>8,.0f})")
|
||
|
||
if net > 0:
|
||
trips = int(net / 1500)
|
||
dkk = net_mo * EUR_TO_DKK
|
||
print(f" → {dkk:,.0f} DKK/mo | ~{trips} poker weekends/yr funded")
|
||
|
||
print(f"\n{'=' * 75}")
|
||
print("THAT'S IT.")
|
||
print(f"{'=' * 75}")
|
||
print(f"""
|
||
€{bootstrap_monthly}/mo gets you from zero to a proven product in Denmark.
|
||
|
||
By Year 2 the business pays for itself.
|
||
By Year 3 it funds your poker travel.
|
||
By Year 4 it's real income.
|
||
By Year 5 it's a lifestyle business doing €130k+/yr on 90% margins.
|
||
|
||
Total investment to get there: ~€{bootstrap_monthly * 18:,} over 18 months
|
||
before it's self-sustaining. That's the price of a used car.
|
||
""")
|
||
|