Skip to main content

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

StatusMeaningPeriod close / next-run projection
TrialingStill onboarding / trialIncluded in billable scan
ActivePaying (or expected to pay) monthly/annualIncluded
Past dueStill a client; unpaid invoicesIncluded
SuspendedTemporary ops / collections holdIncluded in v1 billable scan
CancelledClosed down or left for another solutionExcluded (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”:

  1. Open Platform Billing → Accounts → [account].
  2. Set status to Cancelled (status select or Cancel account confirm flow).
  3. 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:

  1. On the account detail page, Deactivate those branches.
  2. Deactivated branches stop being billed on the next period close.
  3. 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 statusMeaning
ProjectedNo invoice yet for this period; rollup produced charges → will bill
Already closedA platform_billing_period AR invoice already exists for this (customer, YYYY-MM) — close is a no-op (idempotency), not a client type
Skipped / Annualbilling_cycle = annual — v1 monthly close does not bill them
No chargesMonthly, 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:

  1. Review Skipped / empty → no charges on the jobs projection (and accounts with falling line counts over months).
  2. Confirm with sales/ops whether the tenant closed or switched.
  3. Set status to Cancelled (full churn) or fix/deactivate branches (partial).
  4. 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.