"""Nino business model: 36 months from January 2027 (gift pre-sale in Nov-Dec 2026 counted in month 1). All money in EUR. Consumer prices include Belgian VAT (21%); revenue is shown net of VAT. Every input is either a sourced fact (marked SRC) or an assumption to test (marked ASSUMPTION).""" import json EURUSD = 1.121 # SRC poundsterlinglive, 16 Oct 2026 VAT = 0.21 # SRC Belgian standard VAT rate # ---- domain costs per year (what we pay) ---- COM = (10.98 + 0.20) / EURUSD # SRC Verisign .com $10.98 from 1 Nov 2026 + ICANN $0.20 -> ~EUR 9.97 BE = 5.50 # SRC DNS Belgium registrar fee per year (ex VAT) EU_FR_NL = 7.00 # ASSUMPTION reseller cost for .eu/.fr/.nl REG_OVERHEAD = 1.00 # ASSUMPTION reseller margin / API cost per domain-year mix = {'com': .45, 'be': .30, 'other': .25} # ASSUMPTION Belgium-first launch domain_year = mix['com']*COM + mix['be']*BE + mix['other']*EU_FR_NL + REG_OVERHEAD # ---- the offer ---- PRICE_ADDRESS = 59.0 # incl. VAT: your web address, 2 years included, no subscription YEARS_INCLUDED = 2 PRICE_RENEW = 24.0 # incl. VAT, per year after year 2, opt-in (no silent auto-renew) PRICE_GIFT = 59.0 # gift card = one web address for 2 years stripe = lambda gross: gross*0.015 + 0.25 # SRC Stripe Belgium standard EEA cards 1.5% + EUR 0.25 def net(gross): return gross/(1+VAT) address_margin = net(PRICE_ADDRESS) - YEARS_INCLUDED*domain_year - stripe(PRICE_ADDRESS) renew_margin = net(PRICE_RENEW) - domain_year - stripe(PRICE_RENEW) referral_cost = 2*domain_year # "give a year, get a year": one extra domain-year each side BOX_PRICE = 199.0 # incl. VAT, the home box BOX_COST = 120/EURUSD + 15 # SRC N150 ODM mini PC ~$115-125 (project research) + ASSUMPTION EUR 15 packaging/shipping # ---- free hosting cost ---- SERVER = 5.49 # SRC Hetzner CX23 EUR/month after 15 Jun 2026 NINOS_PER_SERVER = 1500 # ASSUMPTION light static apps, sleeping when unused OVERHEAD_X = 3 # ASSUMPTION backups, monitoring, email routing, bandwidth host_per_active = SERVER/NINOS_PER_SERVER*OVERHEAD_X # EUR per active Nino per month SCEN = { # m1 signups, monthly growth y1/y2/y3, paid conversion, renewal rate at year 2, gift share, referral share of sales, # active share decay, yearly fixed costs (team + tools) y1/y2/y3, marketing y1/y2/y3 'Low': dict(m1=800, g=(.08,.04,.02), conv=.02, renew=.35, gift=.10, ref=.10, fixed=(150e3,220e3,260e3), mkt=(20e3,30e3,30e3), box=.05), 'Base': dict(m1=2000, g=(.12,.06,.03), conv=.04, renew=.45, gift=.15, ref=.20, fixed=(180e3,300e3,420e3), mkt=(40e3,80e3,120e3), box=.10), 'High': dict(m1=4000, g=(.15,.07,.03), conv=.07, renew=.55, gift=.20, ref=.30, fixed=(220e3,380e3,560e3), mkt=(60e3,120e3,180e3), box=.15), } CHRISTMAS = {11: 1.4, 12: 1.8} # ASSUMPTION seasonal lift on signups and gift sales (month of year) ACTIVE_AFTER = [1, .55, .35, .25, .2] # ASSUMPTION share of a cohort still active after 0,1,2,3,4+ quarters def run(p): rows=[]; signups_hist=[]; buyers_hist=[] cash=0; cum_signups=0 for m in range(1, 37): y = (m-1)//12; moy = (m-1)%12 + 1 base = p['m1']*(1+p['g'][0])**min(m-1,11) if m>12: base = p['m1']*(1+p['g'][0])**11*(1+p['g'][1])**min(m-13,11) if m>24: base = p['m1']*(1+p['g'][0])**11*(1+p['g'][1])**11*(1+p['g'][2])**(m-25) s = base*CHRISTMAS.get(moy,1) signups_hist.append(s); cum_signups += s buyers = s*p['conv'] referred = buyers*p['ref'] gifts = buyers*p['gift']*(3.0 if moy in (11,12) else 0.5) renewals = buyers_hist[m-25]*p['renew'] if m>24 else 0 boxes = (buyers+gifts)*p['box'] if m>=4 else 0 buyers_hist.append(buyers + gifts) # active Ninos (cohort decay by quarter) active = sum(signups_hist[i]*ACTIVE_AFTER[min((m-1-i)//3,4)] for i in range(m)) rev = (buyers+gifts)*net(PRICE_ADDRESS) + renewals*net(PRICE_RENEW) + boxes*net(BOX_PRICE) cogs = (buyers+gifts)*(YEARS_INCLUDED*domain_year + stripe(PRICE_ADDRESS)) + renewals*(domain_year+stripe(PRICE_RENEW)) \ + referred*referral_cost + active*host_per_active + boxes*(BOX_COST + stripe(BOX_PRICE)) opex = (p['fixed'][y] + p['mkt'][y])/12 cash += rev - cogs - opex rows.append(dict(boxes=boxes, m=m, signups=s, buyers=buyers, gifts=gifts, renewals=renewals, active=active, rev=rev, cogs=cogs, opex=opex, cash=cash)) yrs=[] for y in range(3): r=rows[y*12:(y+1)*12] yrs.append({k: sum(x[k] for x in r) for k in ('signups','buyers','gifts','renewals','boxes','rev','cogs','opex')} | {'active_end': r[-1]['active']}) return rows, yrs out = {'inputs': dict(domain_year=domain_year, com=COM, address_margin=address_margin, renew_margin=renew_margin, referral_cost=referral_cost, host_per_active=host_per_active, net_address=net(PRICE_ADDRESS), stripe_address=stripe(PRICE_ADDRESS), box_margin=net(BOX_PRICE)-BOX_COST-stripe(BOX_PRICE))} for k,p in SCEN.items(): rows, yrs = run(p) gross_profit_unit = address_margin out[k] = dict(years=yrs, cash_end=rows[-1]['cash'], min_cash=min(r['cash'] for r in rows), breakeven_month=next((r['m'] for r in rows if r['rev']-r['cogs']-r['opex']>0), None)) # break-even: paid web addresses per month needed to cover a monthly cost base for monthly_cost in (20e3, 30e3, 40e3): out.setdefault('breakeven_sales', {})[int(monthly_cost)] = monthly_cost/address_margin # paid ads check: cost per buyer from Meta clicks CPC_USD = 1.20 # SRC AdAmigo 2026 Belgium avg CPC (projection) click_to_signup = (.10, .20) # ASSUMPTION landing page -> Nino created cpb = [CPC_USD/EURUSD/cs/c for cs in click_to_signup for c in (.02,.04,.07)] out['paid_cac_per_buyer'] = dict(min=min(cpb), max=max(cpb)) print(json.dumps(out, indent=1, default=lambda x: round(x,2)))