From 86ce5117646bbdee69ab6dec2171e14d51b4cdef Mon Sep 17 00:00:00 2001 From: tegwick Date: Mon, 22 Jun 2026 02:14:06 +0200 Subject: [PATCH] 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. --- projects/coulomb-pricing/README.md | 7 +- projects/coulomb-pricing/REQUIREMENTS.md | 6 +- projects/coulomb-pricing/data/budget.json | 2 +- .../coulomb-pricing/data/expense_records.json | 631 ++++++++---------- .../data/infrastructure/domains.json | 26 + .../data/infrastructure/virtual_servers.json | 6 + projects/coulomb-pricing/data/membership.json | 2 +- .../coulomb-pricing/observatory/dashboard.py | 1 + projects/coulomb-pricing/observatory/load.py | 4 +- .../reports/economics-2026-06.md | 59 +- .../coulomb-pricing/tests/test_economics.py | 50 +- 11 files changed, 391 insertions(+), 403 deletions(-) create mode 100644 projects/coulomb-pricing/data/infrastructure/domains.json create mode 100644 projects/coulomb-pricing/data/infrastructure/virtual_servers.json diff --git a/projects/coulomb-pricing/README.md b/projects/coulomb-pricing/README.md index cd395f2..ccbc064 100644 --- a/projects/coulomb-pricing/README.md +++ b/projects/coulomb-pricing/README.md @@ -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 diff --git a/projects/coulomb-pricing/REQUIREMENTS.md b/projects/coulomb-pricing/REQUIREMENTS.md index 78cf767..beea327 100644 --- a/projects/coulomb-pricing/REQUIREMENTS.md +++ b/projects/coulomb-pricing/REQUIREMENTS.md @@ -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. diff --git a/projects/coulomb-pricing/data/budget.json b/projects/coulomb-pricing/data/budget.json index 169c4be..aacfccd 100644 --- a/projects/coulomb-pricing/data/budget.json +++ b/projects/coulomb-pricing/data/budget.json @@ -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." } \ No newline at end of file diff --git a/projects/coulomb-pricing/data/expense_records.json b/projects/coulomb-pricing/data/expense_records.json index 137efc5..f9c5746 100644 --- a/projects/coulomb-pricing/data/expense_records.json +++ b/projects/coulomb-pricing/data/expense_records.json @@ -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." } diff --git a/projects/coulomb-pricing/data/infrastructure/domains.json b/projects/coulomb-pricing/data/infrastructure/domains.json new file mode 100644 index 0000000..3d1a341 --- /dev/null +++ b/projects/coulomb-pricing/data/infrastructure/domains.json @@ -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." +} \ No newline at end of file diff --git a/projects/coulomb-pricing/data/infrastructure/virtual_servers.json b/projects/coulomb-pricing/data/infrastructure/virtual_servers.json new file mode 100644 index 0000000..11a903a --- /dev/null +++ b/projects/coulomb-pricing/data/infrastructure/virtual_servers.json @@ -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." +} \ No newline at end of file diff --git a/projects/coulomb-pricing/data/membership.json b/projects/coulomb-pricing/data/membership.json index b2950e1..f0ba1c4 100644 --- a/projects/coulomb-pricing/data/membership.json +++ b/projects/coulomb-pricing/data/membership.json @@ -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." } \ No newline at end of file diff --git a/projects/coulomb-pricing/observatory/dashboard.py b/projects/coulomb-pricing/observatory/dashboard.py index 830c817..14920a3 100644 --- a/projects/coulomb-pricing/observatory/dashboard.py +++ b/projects/coulomb-pricing/observatory/dashboard.py @@ -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`) diff --git a/projects/coulomb-pricing/observatory/load.py b/projects/coulomb-pricing/observatory/load.py index 1b12386..7e6ffbd 100644 --- a/projects/coulomb-pricing/observatory/load.py +++ b/projects/coulomb-pricing/observatory/load.py @@ -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]: diff --git a/projects/coulomb-pricing/reports/economics-2026-06.md b/projects/coulomb-pricing/reports/economics-2026-06.md index b620ee9..21bbe0f 100644 --- a/projects/coulomb-pricing/reports/economics-2026-06.md +++ b/projects/coulomb-pricing/reports/economics-2026-06.md @@ -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`) diff --git a/projects/coulomb-pricing/tests/test_economics.py b/projects/coulomb-pricing/tests/test_economics.py index 90da84b..0d7ea94 100644 --- a/projects/coulomb-pricing/tests/test_economics.py +++ b/projects/coulomb-pricing/tests/test_economics.py @@ -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 \ No newline at end of file + assert "121.50" in report + assert "947.38" in report + assert "coulomb.social" not in report # dashboard shows aggregates, not domain names \ No newline at end of file