Billing & Refunds
Invoices, payments, refunds, and the unified ledger.
How a charge is represented
Every real charge — a booking, a day pass, a lease payment, anything —
has a real Invoice behind it, made up of one or more line items, even
for an instant card payment that feels like a single checkout step to the
customer. An invoice can have more than one Payment attempt (a decline
followed by a successful retry both show up).
One-time and recurring billing
- One-time: meeting rooms, day passes, store items, one-time setup fees.
- Recurring: office leases (monthly or a one-time paid-in-full term total) and registered-office plans, via real Stripe subscriptions — never a hand-rolled recurring-charge scheduler.
- Combo billing: a registered-office account billed both a monthly plan and a separate annual fee shows both as distinct, itemized lines in the ledger rather than merged into one confusing charge.
The unified ledger
/admin/billing is a single view across every product line — no separate billing screen per product type. Status (invoiced, overdue, payment failed, paid) is always derived live from real invoice and payment records, never a cached flag that can drift from reality. ACH payments can briefly show as "Invoiced" rather than "Paid" even after the customer has paid, since ACH settlement genuinely takes a few business days — that's accurate, not a bug.
Refunds
A refund is always tied to a specific payment. Below the location's configured threshold, a refund from the explicit "Issue refund" button processes immediately. Above it, it requires a second staff member's approval — see Approvals for the full threshold table, including the reschedule-driven refund path, which is gated the same way even though it's a side effect rather than an explicit button.
Marking an invoice paid manually
For cash, check, or an out-of-band payment, staff can mark an invoice paid directly — available from web admin, the mobile app, and as part of settling an open tab from the admin calendar or store.
Profitability reporting
For store sales specifically, margin is calculated against the item's actual cost at the time it was sold (a snapshotted cost, not today's current cost) — so a later cost change never silently rewrites the margin on a sale that already happened.