Group runs of the same subscription
Reactivating a cancelled plan starts a new run with its own row. Today every run shows up as a separate subscription. In this proposal the list shows one row per subscription, which is its current run, and the earlier runs fold away underneath it. Use Current in the toolbar to compare with today's list.
Rules
- One row per group. Runs that share a
group_idcollapse into one row. The row is the run that isn't cancelled (active, trial, paused or scheduled). If every run is cancelled, it's the most recent one. - Earlier runs fold away. A chevron and an "N earlier runs" link open them under the head row, newest first. Each one shows the price and dates it had then.
- Totals stay the same. This only changes the list. KPIs, spend and Coming up already count each run on its own, and they keep doing that.
- "Show cancelled" counts groups. A group is hidden only when its head is cancelled. Earlier runs of a live subscription can always be reached through its chevron.
- Search looks inside groups. If only an earlier run matches, for example a past price, the group opens and that run is highlighted. Try 12.99 or 2023.
- Sorting uses the head row. Earlier runs stay attached to their group, so sorting never splits a group up.
Actions
- The head row keeps today's actions: Edit on a live run, Reactivate on a cancelled one.
- Earlier runs get only Archive and Delete permanently. They can't be reactivated while a newer run exists, which is the same rule the backend enforces today.
- The disabled "Current run exists" button goes away, because its row is now nested under the run it refers to.
Open questions
- Should the lifetime line ("€610.53 across 3 runs") ship in the first version, or wait? It needs a per-run paid total that the list endpoint doesn't return yet.
- Archived earlier runs: hide them inside the group, or show them with the Archived tag? The mock shows them, tagged.
- Should a group remember whether it's open after a reload? The mock doesn't.