Skip to content

trial and grace states

Spirby reduces every org’s billing situation to one of five states. The ui and the api both branch on it.

StateAccessWhen you are here
trial_activefulltrial is running.
trial_graceread-onlytrial ended; 7-day grace running, subscribe to restore full access.
subscribedfulla paid subscription is live (active or trialing at the provider).
past_due_graceread-onlypayment failed or sub canceled; grace clock running, update card or resub.
archivedarchivedgrace expired with no payment.

In trial_grace and past_due_grace:

  • the public board, roadmap, and changelog stay live for visitors
  • the admin dashboard refuses mutations: no new boards, no new posts, no status changes, no comments from admins
  • billing is the one thing you can still do, subscribe, manage, update card

The intent is to give visitors a stable experience while the team gets the billing side sorted.

Public board redirects to a paused page. Admin dashboard shows a paywall. No data is deleted, subscribe and the org pops back into subscribed with everything intact.

If a paid subscription is live, spirby ignores stale grace_period_ends_at values that might still be sitting on the row from an earlier past-due episode. Paid customers are never read-only because of leftover state.

Trial grace is computed from trial_ends_at + 7 days rather than written into a column at the trial boundary. That avoids needing a periodic job to flip a flag at midnight; the state machine just reads the timestamp.

The dashboard shows your billing state and how long is left on any active grace clock. Subscribe at any time to restore subscribed.