Replace infrastructure costs with actual domain invoice data

Start ledger January 2025. Record coulomb.social (3.75 EUR/mo) and
coulomb.pro (3.00 EUR/mo) as per-domain expense rows. Remove Bubble and
placeholder overhead. Add infrastructure reference catalogs; virtual server
records pending invoice data.
This commit is contained in:
2026-06-22 02:14:06 +02:00
parent 31db9f8f31
commit 86ce511764
11 changed files with 391 additions and 403 deletions

View File

@@ -22,9 +22,10 @@ computes all totals programmatically (`ledger.py` → `economics.py`).
| Pricing models | `data/pricing-models.json` |
| Membership | `data/membership.json` |
**Current reality:** platform costs from March 2025 (Bubble.io **$32/mo** since
Feb 2025); sole member payments from November 2025. Operator is **burning
liquidity**. Customer cost-pass-through billing is not active.
**Current reality:** infrastructure from January 2025 — domains **€6.75/mo**
(`coulomb.social` €3.75 + `coulomb.pro` €3.00, per registrar invoices). Virtual
server records pending. Sole member payments from November 2025. Customer
cost-pass-through billing is not active.
### Commands

View File

@@ -2,9 +2,9 @@
## Context
Coulomb Social carries **operator platform costs** (Bubble.io, domains, Stripe
fees, future OpenRouter usage) while **customer cost-pass-through billing is not
active yet**. Members pay a flat subscription; they are not billed for
Coulomb Social carries **operator infrastructure costs** (domains, virtual
servers, payment-processing fees, future OpenRouter usage) while **customer
cost-pass-through billing is not active yet**. Members pay a flat subscription; they are not billed for
underlying platform spend.
The Economic Observatory must make the resulting **liquidity burn** visible.

View File

@@ -2,6 +2,6 @@
"version": 1,
"currency": "EUR",
"initial_budget": "1000.00",
"started": "2025-03",
"started": "2025-01",
"note": "Operator liquidity pool for Coulomb Social MVP platform spend before the offering is cash-flow positive."
}

View File

@@ -1,489 +1,438 @@
{
"version": 1,
"fx_rates": {
"USD/EUR": "0.92"
},
"version": 2,
"records": [
{
"id": "exp-bubble-2025-03",
"id": "exp-domain-social-2025-01",
"period": "2025-01",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domain-pro-2025-01",
"period": "2025-01",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "3.00",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-domain-social-2025-02",
"period": "2025-02",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domain-pro-2025-02",
"period": "2025-02",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "3.00",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-domain-social-2025-03",
"period": "2025-03",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-03",
"id": "exp-domain-pro-2025-03",
"period": "2025-03",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-03",
"period": "2025-03",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2025-04",
"id": "exp-domain-social-2025-04",
"period": "2025-04",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-04",
"id": "exp-domain-pro-2025-04",
"period": "2025-04",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-04",
"period": "2025-04",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2025-05",
"id": "exp-domain-social-2025-05",
"period": "2025-05",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-05",
"id": "exp-domain-pro-2025-05",
"period": "2025-05",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-05",
"period": "2025-05",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2025-06",
"id": "exp-domain-social-2025-06",
"period": "2025-06",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-06",
"id": "exp-domain-pro-2025-06",
"period": "2025-06",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-06",
"period": "2025-06",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2025-07",
"id": "exp-domain-social-2025-07",
"period": "2025-07",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-07",
"id": "exp-domain-pro-2025-07",
"period": "2025-07",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-07",
"period": "2025-07",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2025-08",
"id": "exp-domain-social-2025-08",
"period": "2025-08",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-08",
"id": "exp-domain-pro-2025-08",
"period": "2025-08",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-08",
"period": "2025-08",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2025-09",
"id": "exp-domain-social-2025-09",
"period": "2025-09",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-09",
"id": "exp-domain-pro-2025-09",
"period": "2025-09",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-09",
"period": "2025-09",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2025-10",
"id": "exp-domain-social-2025-10",
"period": "2025-10",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-10",
"id": "exp-domain-pro-2025-10",
"period": "2025-10",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-10",
"period": "2025-10",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2025-11",
"id": "exp-domain-social-2025-11",
"period": "2025-11",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-11",
"id": "exp-domain-pro-2025-11",
"period": "2025-11",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-11",
"period": "2025-11",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2025-12",
"id": "exp-domain-social-2025-12",
"period": "2025-12",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2025-12",
"id": "exp-domain-pro-2025-12",
"period": "2025-12",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2025-12",
"period": "2025-12",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2026-01",
"id": "exp-domain-social-2026-01",
"period": "2026-01",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2026-01",
"id": "exp-domain-pro-2026-01",
"period": "2026-01",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2026-01",
"period": "2026-01",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2026-02",
"id": "exp-domain-social-2026-02",
"period": "2026-02",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2026-02",
"id": "exp-domain-pro-2026-02",
"period": "2026-02",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2026-02",
"period": "2026-02",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2026-03",
"id": "exp-domain-social-2026-03",
"period": "2026-03",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2026-03",
"id": "exp-domain-pro-2026-03",
"period": "2026-03",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2026-03",
"period": "2026-03",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2026-04",
"id": "exp-domain-social-2026-04",
"period": "2026-04",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2026-04",
"id": "exp-domain-pro-2026-04",
"period": "2026-04",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2026-04",
"period": "2026-04",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2026-05",
"id": "exp-domain-social-2026-05",
"period": "2026-05",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2026-05",
"id": "exp-domain-pro-2026-05",
"period": "2026-05",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
},
{
"id": "exp-overhead-2026-05",
"period": "2026-05",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-bubble-2026-06",
"id": "exp-domain-social-2026-06",
"period": "2026-06",
"vendor": "bubble.io",
"description": "Bubble.io Personal plan ($32/mo since Feb 2025)",
"vendor": "domain.coulomb.social",
"description": "coulomb.social (.social) 3.75 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "32.00",
"currency": "USD",
"source": "manual"
"amount": "3.75",
"currency": "EUR",
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00"
},
{
"id": "exp-domains-2026-06",
"id": "exp-domain-pro-2026-06",
"period": "2026-06",
"vendor": "domains",
"description": "Domain registrations",
"vendor": "domain.coulomb.pro",
"description": "coulomb.pro (.pro) 3.00 EUR/mo incl. 0.14 EUR/yr ICANN",
"cost_class": "infrastructure",
"amount": "15.00",
"amount": "3.00",
"currency": "EUR",
"source": "manual"
},
{
"id": "exp-overhead-2026-06",
"period": "2026-06",
"vendor": "operational-overhead",
"description": "Operational overhead",
"cost_class": "infrastructure",
"amount": "25.00",
"currency": "EUR",
"source": "manual"
"source": "invoice",
"billing_term": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00"
}
],
"note": "Source-of-truth expense ledger. Aggregations are computed by observatory/ledger.py \u2014 never hand-edited totals."
"note": "Infrastructure expense ledger: domains and virtual servers. Totals computed by observatory/ledger.py. Virtual server records to be added when invoice data is available."
}

View File

@@ -0,0 +1,26 @@
{
"version": 1,
"currency": "EUR",
"domains": [
{
"name": "coulomb.social",
"tld": ".social",
"monthly_eur": "3.75",
"icann_fee_annual_eur": "0.14",
"billing_period": "2026-01-31/2027-01-30",
"annual_total_eur": "45.00",
"vat_rate": "19.0"
},
{
"name": "coulomb.pro",
"tld": ".pro",
"monthly_eur": "3.00",
"icann_fee_annual_eur": "0.14",
"billing_period": "2026-01-31/2027-01-30",
"annual_total_eur": "36.00",
"vat_rate": "19.0"
}
],
"monthly_total_eur": "6.75",
"note": "Reference catalog from registrar invoices. Expense ledger rows live in expense_records.json."
}

View File

@@ -0,0 +1,6 @@
{
"version": 1,
"currency": "EUR",
"servers": [],
"note": "Virtual server expense records pending actual invoice data. Add entries here and mirror monthly rows in expense_records.json when available."
}

View File

@@ -12,5 +12,5 @@
"note": "Sole paying member; payments from November 2025"
}
],
"note": "Platform costs run from March 2025; member payments from November 2025."
"note": "Infrastructure costs run from January 2025; member payments from November 2025."
}

View File

@@ -119,6 +119,7 @@ _Revenue source: {snapshot.revenue_source}_
- Product model (`data/product.json`)
- Budget (`data/budget.json`)
- Expense records (`data/expense_records.json`) — source of truth for costs
- Infrastructure catalog (`data/infrastructure/`) — domain and VPS reference data
- Payment records (`data/payment_records.json`)
- Membership (`data/membership.json`)
- Requirements (`REQUIREMENTS.md`)

View File

@@ -68,7 +68,9 @@ def load_pricing_models(data_dir: Path | None = None) -> list[PricingModel]:
def load_fx_rates(data_dir: Path | None = None) -> dict[str, Decimal]:
raw = _read_json((data_dir or default_data_dir()) / "expense_records.json")
return {pair: _money(rate) for pair, rate in raw.get("fx_rates", {}).items()}
return {pair: _money(rate) for pair, rate in raw.get("fx_rates", {}).items()} if raw.get(
"fx_rates"
) else {}
def load_expense_records(data_dir: Path | None = None) -> list[ExpenseRecord]:

View File

@@ -6,7 +6,7 @@
> Platform costs accrue to the operator. Customer cost-pass-through billing is
> **not active** in MVP — members pay subscription only. All totals are computed
> programmatically from expense and payment record ledgers (48 expense
> programmatically from expense and payment record ledgers (36 expense
> records).
## Key Metrics (current period)
@@ -15,13 +15,13 @@
|--------|------:|
| Active members | 1 |
| Member payments (gross) | 8.99 EUR |
| Infrastructure cost | 69.44 EUR |
| Infrastructure cost | 6.75 EUR |
| Payment processing cost | 0.38 EUR |
| Total platform cost | 69.82 EUR |
| Platform cost per member | 69.82 EUR |
| Period gross margin | -60.83 EUR |
| Period gross margin % | -676.6% |
| Period net liquidity | -60.83 EUR (burning) |
| Total platform cost | 7.13 EUR |
| Platform cost per member | 7.13 EUR |
| Period gross margin | 1.86 EUR |
| Period gross margin % | 20.7% |
| Period net liquidity | 1.86 EUR (generating) |
_Period net liquidity = net member payments infrastructure cost (processing fees already netted from payments)._
_Revenue source: manual_
@@ -32,33 +32,35 @@ _Revenue source: manual_
|--------|------:|
| Initial budget | 1000.00 EUR |
| Cumulative member payments (net) | 68.88 EUR |
| Cumulative infrastructure cost | 1111.04 EUR |
| Cumulative infrastructure cost | 121.50 EUR |
| Cumulative payment processing | 3.04 EUR |
| Cumulative total platform cost | 1114.08 EUR |
| Cumulative net liquidity | -1042.16 EUR (burning) |
| Remaining budget | -42.16 EUR (over budget) |
| Months tracked | 16 |
| Cumulative total platform cost | 124.54 EUR |
| Cumulative net liquidity | -52.62 EUR (burning) |
| Remaining budget | 947.38 EUR (within budget) |
| Months tracked | 18 |
## Monthly History
| Period | Members | Gross revenue | Infrastructure | Processing | Total platform | Net liquidity |
|--------|--------:|--------------:|---------------:|-----------:|---------------:|--------------:|
| 2025-03 | 0 | 0.00 | 69.44 | 0.00 | 69.44 | -69.44 |
| 2025-04 | 0 | 0.00 | 69.44 | 0.00 | 69.44 | -69.44 |
| 2025-05 | 0 | 0.00 | 69.44 | 0.00 | 69.44 | -69.44 |
| 2025-06 | 0 | 0.00 | 69.44 | 0.00 | 69.44 | -69.44 |
| 2025-07 | 0 | 0.00 | 69.44 | 0.00 | 69.44 | -69.44 |
| 2025-08 | 0 | 0.00 | 69.44 | 0.00 | 69.44 | -69.44 |
| 2025-09 | 0 | 0.00 | 69.44 | 0.00 | 69.44 | -69.44 |
| 2025-10 | 0 | 0.00 | 69.44 | 0.00 | 69.44 | -69.44 |
| 2025-11 | 1 | 8.99 | 69.44 | 0.38 | 69.82 | -60.83 |
| 2025-12 | 1 | 8.99 | 69.44 | 0.38 | 69.82 | -60.83 |
| 2026-01 | 1 | 8.99 | 69.44 | 0.38 | 69.82 | -60.83 |
| 2026-02 | 1 | 8.99 | 69.44 | 0.38 | 69.82 | -60.83 |
| 2026-03 | 1 | 8.99 | 69.44 | 0.38 | 69.82 | -60.83 |
| 2026-04 | 1 | 8.99 | 69.44 | 0.38 | 69.82 | -60.83 |
| 2026-05 | 1 | 8.99 | 69.44 | 0.38 | 69.82 | -60.83 |
| 2026-06 | 1 | 8.99 | 69.44 | 0.38 | 69.82 | -60.83 |
| 2025-01 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-02 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-03 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-04 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-05 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-06 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-07 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-08 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-09 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-10 | 0 | 0.00 | 6.75 | 0.00 | 6.75 | -6.75 |
| 2025-11 | 1 | 8.99 | 6.75 | 0.38 | 7.13 | 1.86 |
| 2025-12 | 1 | 8.99 | 6.75 | 0.38 | 7.13 | 1.86 |
| 2026-01 | 1 | 8.99 | 6.75 | 0.38 | 7.13 | 1.86 |
| 2026-02 | 1 | 8.99 | 6.75 | 0.38 | 7.13 | 1.86 |
| 2026-03 | 1 | 8.99 | 6.75 | 0.38 | 7.13 | 1.86 |
| 2026-04 | 1 | 8.99 | 6.75 | 0.38 | 7.13 | 1.86 |
| 2026-05 | 1 | 8.99 | 6.75 | 0.38 | 7.13 | 1.86 |
| 2026-06 | 1 | 8.99 | 6.75 | 0.38 | 7.13 | 1.86 |
## Pricing Model Registry
@@ -73,6 +75,7 @@ _Revenue source: manual_
- Product model (`data/product.json`)
- Budget (`data/budget.json`)
- Expense records (`data/expense_records.json`) — source of truth for costs
- Infrastructure catalog (`data/infrastructure/`) — domain and VPS reference data
- Payment records (`data/payment_records.json`)
- Membership (`data/membership.json`)
- Requirements (`REQUIREMENTS.md`)

View File

@@ -24,32 +24,31 @@ def test_active_members_counts_only_active_status() -> None:
assert active_members(members) == 1
def test_infrastructure_aggregated_from_expense_records() -> None:
def test_infrastructure_aggregated_from_domain_expense_records() -> None:
expenses = load_expense_records(DATA_DIR)
fx = load_fx_rates(DATA_DIR)
totals = aggregate_infrastructure_by_period(expenses, fx)
assert totals["2025-03"] == Decimal("69.44")
assert totals["2026-06"] == Decimal("69.44")
# Bubble $32 @ 0.92 = 29.44 + 15 domains + 25 overhead
bubble_eur = Decimal("32.00") * Decimal("0.92")
assert bubble_eur == Decimal("29.44")
assert totals["2025-01"] == Decimal("6.75")
assert totals["2026-06"] == Decimal("6.75")
def test_monthly_ledger_computes_processing_from_payment_records() -> None:
def test_monthly_ledger_starts_january_2025() -> None:
ledger = load_monthly_ledger(DATA_DIR)
june = next(row for row in ledger if row.period == "2026-06")
march = next(row for row in ledger if row.period == "2025-03")
assert ledger[0].period == "2025-01"
assert len(ledger) == 18
assert march.infrastructure_cost == Decimal("69.44")
march = next(row for row in ledger if row.period == "2025-03")
june = next(row for row in ledger if row.period == "2026-06")
assert march.infrastructure_cost == Decimal("6.75")
assert march.payment_processing_cost == Decimal("0.00")
assert march.gross_revenue == Decimal("0.00")
assert june.infrastructure_cost == Decimal("69.44")
assert june.infrastructure_cost == Decimal("6.75")
assert june.payment_processing_cost == Decimal("0.38")
assert june.gross_revenue == Decimal("8.99")
def test_build_snapshot_june_2026_uses_ledger_not_hand_totals() -> None:
def test_build_snapshot_june_2026_domain_only_infrastructure() -> None:
product = load_product(DATA_DIR)
models = load_pricing_models(DATA_DIR)
members = load_membership(DATA_DIR)
@@ -58,28 +57,28 @@ def test_build_snapshot_june_2026_uses_ledger_not_hand_totals() -> None:
snapshot = build_snapshot("2026-06", product, models, members, payments, ledger)
assert snapshot.monthly_infrastructure_cost == Decimal("69.44")
assert snapshot.monthly_infrastructure_cost == Decimal("6.75")
assert snapshot.monthly_payment_processing_cost == Decimal("0.38")
assert snapshot.monthly_total_platform_cost == Decimal("69.82")
assert snapshot.period_net_liquidity == Decimal("-60.83")
assert snapshot.gross_margin == Decimal("-60.83")
assert snapshot.monthly_total_platform_cost == Decimal("7.13")
assert snapshot.period_net_liquidity == Decimal("1.86")
assert snapshot.liquidity_status == "generating"
def test_liquidity_summary_aggregates_ledgers_deterministically() -> None:
def test_liquidity_summary_with_actual_domain_costs() -> None:
budget = load_budget(DATA_DIR)
payments = load_payment_records(DATA_DIR)
ledger = load_monthly_ledger(DATA_DIR)
summary = build_liquidity_summary(budget, payments, ledger, "2026-06")
assert summary.cumulative_infrastructure_cost == Decimal("1111.04")
assert summary.cumulative_infrastructure_cost == Decimal("121.50")
assert summary.cumulative_payment_processing_cost == Decimal("3.04")
assert summary.cumulative_total_platform_cost == Decimal("1114.08")
assert summary.cumulative_total_platform_cost == Decimal("124.54")
assert summary.cumulative_member_payments == Decimal("68.88")
assert summary.cumulative_net_liquidity == Decimal("-1042.16")
assert summary.remaining_budget == Decimal("-42.16")
assert summary.cumulative_net_liquidity == Decimal("-52.62")
assert summary.remaining_budget == Decimal("947.38")
assert summary.liquidity_status == "burning"
assert summary.months_tracked == 16
assert summary.months_tracked == 18
def test_build_monthly_ledger_matches_loader() -> None:
@@ -99,5 +98,6 @@ def test_dashboard_notes_expense_record_source() -> None:
report = generate_dashboard(DATA_DIR, "2026-06")
assert "expense and payment record ledgers" in report
assert "1111.04" in report
assert "-42.16" in report
assert "121.50" in report
assert "947.38" in report
assert "coulomb.social" not in report # dashboard shows aggregates, not domain names