← Changelog
v2.8Feature21 April 2026
Metered billing + dark mode + Odoo fiscal
Stripe metered billing with threshold or cycle close. Odoo issues the Spanish fiscal invoice automatically. Dark mode across the app with no hydration flash.
Major changes
- Real metered billing: subscriptions + bookings + extras accumulate in a rolling window. When threshold (€500 default) or cycle close (7 days default) hits, Stripe issues an invoice and charges the stored card. Race-safe via pg advisory locks.
- Per-tenant pricing rule: each organisation can have distinct rates for the 5 billable items (greenfee, buggy, teetime, extra, modificationfee). FLAT or PERCENT with min/max.
- Atomic trial counter: first N bookings are free (default 50). The counter is atomically reserved to prevent TOCTOU.
- Odoo XML-RPC: when Stripe pays, Odoo idempotently issues the Spanish fiscal invoice (matching by external id, falling back to email).
- Tenant billing UI at /dashboard/billing: real-time open credit, countdown to next close, payment method via Stripe Customer Portal, invoice history with PDF + Odoo link.
- Dark mode: light / dark / system with inline pre-hydration script (no flash). CSS vars per surface. Toggle in the sidebar footer.
Other releases
- v2.9
Reservation engine V2 · staff full-window
The biggest shift of the year. /dashboard/book is now a three-column command center with two-phase commit saga, four-layer pricing, and automatic rollback. Roiback is the first adapter that writes to real hotels.
- v2.7
Public self-signup + admin kill-switch
/signup is now a four-step wizard that creates a TRIAL organisation and sends the OWNER invitation. Honeypot + per-IP rate limit. Kill-switch from admin if needed.
- v2.6
Integrations marketplace · SUPERADMIN CMS
Integrations now live in a DB-editable table from /admin/integrations. Tenants can install / uninstall any adapter from a marketplace view with cards.