v5.51.0 7 June 2026 Feature Improvement

Invoices on the Billing Page & Cancellation Copy of Record

Why This Matters

Ninety days before the first real charge, the billing page is the room where trust is won or lost. This release makes it honest in both directions: customers now see their actual invoices on the page itself, with PDF downloads, instead of being sent to an external portal to find them; and every sentence the page speaks about a pending cancellation has been corrected against the billing design’s binding clauses. A page that shows you a charge date while you have a cancellation scheduled is lying to you, however politely. It can’t do that any more.


Recent Invoices, Inline

  • Your invoices, on your billing page The Recent Invoices card now lists the organisation’s Stripe invoices directly: invoice number, date, status, amount, and a one-click PDF download for each. The newest twelve are shown; draft and void invoices never appear. Before today this card was a link to the billing portal; the portal link remains for what it still does best, managing payment methods and full history, under its honest new label.

  • An honest empty state Organisations that have not yet been charged see exactly that: “No invoices yet. Your first invoice appears here after your first charge.” Having no invoices is a state, not an error.

  • A new documented API endpoint GET /billing/invoices backs the card and is publicly documented like every other endpoint. Read-only, amounts in integer pence, no arithmetic anywhere on the path. The field locations were verified against Stripe’s current API changelog before a single one was read, a discipline that is two days old and already permanent.


Pending-Cancellation Copy of Record

The pending-cancellation banner activated in 5.49.0; this release makes every sentence around it true to the design’s binding cancellation clauses.

  • The wording of record The banner now reads “Plan cancels on {date}. You keep full access until then,” with the data-safe and resubscribe-anytime promises and the one-click Reactivate unchanged.

  • One banner per render A trialling customer who schedules a cancellation now sees the cancellation banner, not the trial banner stacked on top of it. The one declared exception stands: a customer with a failing payment and a scheduled cancellation sees both facts, because both are true.

  • No money sentence against a pending cancellation The plan card previously showed “First charge: {amount} on {date}” unconditionally during a trial, including while a cancellation was pending and no charge would ever happen. That line is now withdrawn the moment a cancellation is scheduled, replaced by “Cancels on: {date}”. The page never promises a charge that a cancellation has already cancelled.

  • Tidy vocabulary A status badge style for a subscription state that can no longer reach the platform (closed off by the admission control shipped in 5.49.0) has been removed.


Operational Impact

  • Customers see and download their invoices without leaving the page; the external portal is now for payment methods and history, not the only way to see a bill
  • Every money sentence on the billing page is now conditional on the truth: no charge is promised while a cancellation is pending
  • One banner variant per render, with the payment-failure coexistence case preserved deliberately
  • The public API surface grows to 199 documented endpoints, reference coverage at 100%
  • Verified live the same night: the inline list correctly shows the trial’s zero-amount creation invoice with a working PDF download

Files Changed

Backend:

  • Billing routes: one new read-only endpoint with full response schema
  • Stripe library: one list helper, read-only
  • API reference: new endpoint documented with example request and response

Frontend / Portal:

  • Billing settings page: Recent Invoices card rebuilt as an inline list; cancellation-state banner and plan card copy corrected; trial banner yields to the cancellation banner; status badge vocabulary tidied

The billing page now tells customers what they owe, what they paid, and what happens if they leave, all without leaving the page. The remaining road to 3 September is dashboard configuration and a reconciliation job, not customer-facing work.