Platform Billing — Account Status and Churn
How to track clients who stopped using FlowPOS (business closed, switched to another solution, or temporarily paused). There is no automatic churn detector — operators mark status on the platform account; Collection Jobs only surface soft signals.
PWA: Platform Billing → Accounts (list + detail) and Collection Jobs (/platform-billing/jobs).
Related: Collection Loop · Testing and Iteration
Account statuses
| Status | Meaning | Period close / next-run projection |
|---|---|---|
| Trialing | Still onboarding / trial | Included in billable scan |
| Active | Paying (or expected to pay) monthly/annual | Included |
| Past due | Still a client; unpaid invoices | Included |
| Suspended | Temporary ops / collections hold | Included in v1 billable scan |
| Cancelled | Closed down or left for another solution | Excluded (status != cancelled) |
In v1, status is primarily a billing control. Changing status does not cut off SMS, WhatsApp, or FEL product access. Cancelled accounts keep invoice history; you can change status later if they return.
Official churn mark: Cancelled
For “business closed” or “using another POS”:
- Open Platform Billing → Accounts → [account].
- Set status to Cancelled (status select or Cancel account confirm flow).
- Filter the accounts list by Cancelled to review the churned cohort.
Cancelled accounts are skipped by findBillablePage — they no longer appear in next-run projection totals or get new period invoices.
Temporary pause: Suspended
Use Suspended when you want a visible hold without treating them as gone. In v1 they still remain in the billable scan; prefer Cancelled when invoicing should stop permanently, or deactivate branches if only locations changed.
Partial churn: deactivate branches
If the business stays on FlowPOS but closed some locations:
- On the account detail page, Deactivate those branches.
- Deactivated branches stop being billed on the next period close.
- Leave the account Active (or adjust status only if the whole tenant left).
History stays intact; branches can be reactivated later.
Next-run projection statuses (not churn labels)
On Collection Jobs, the dry-run classifies each billable (non-cancelled) monthly account for the period being closed:
| Projection status | Meaning |
|---|---|
| Projected | No invoice yet for this period; rollup produced charges → will bill |
| Already closed | A platform_billing_period AR invoice already exists for this (customer, YYYY-MM) — close is a no-op (idempotency), not a client type |
| Skipped / Annual | billing_cycle = annual — v1 monthly close does not bill them |
| No charges | Monthly, not closed yet, but rollup produced zero lines |
Already closed is period state after a successful close (or concurrent close), not “client churned.” See Testing and Iteration.
Soft signal: No charges
No charges is an investigation queue, not a confirmed churn list. Typical causes:
- All branches deactivated
- No flat branch fees and no FEL / SMS / percentage usage for the period
- Misconfigured or empty branch mapping
Workflow:
- Review Skipped / empty → no charges on the jobs projection (and accounts with falling line counts over months).
- Confirm with sales/ops whether the tenant closed or switched.
- Set status to Cancelled (full churn) or fix/deactivate branches (partial).
- Track the official cohort via Accounts filter
status = cancelled.
Practical checklist
- Treat Cancelled as the system of record for churned tenants.
- Use No charges on next-run projection only as a review list.
- Deactivate branches for location-level exits without cancelling the whole account.
- After cancelling, confirm the account disappears from the next projection scan (billable set shrinks).
- Keep unpaid invoices / collection separate — use Past due / receipts, not Cancelled, while they still owe and remain a client.