A member can end up paying for a tier below one they were granted, with the granted tier waiting behind it #159

Open
opened 2026-10-01 07:26:48 +00:00 by cgalo5758 · 2 comments
Owner

The question

An operator can mark a grant so that it delivers again when the plan that replaced it ends. One sequence leaves a member paying for less than they were given. Take one ladder, Starter → Plus → Pro → Max:

  1. An operator gives the organization a complimentary Pro grant. Pro delivers.
  2. The member buys Max through Checkout. Max replaces Pro on the ladder. Pro is not marked, so it stops.
  3. The member schedules a downgrade from Max to Plus. A downgrade takes effect at renewal, so the subscription stays on Max for now.
  4. The operator marks the Pro grant to resume. Pro is now on hold behind Max.
  5. At renewal the downgrade lands and the subscription moves to Plus. A change of tier does not end the subscription, so Pro keeps waiting.

The member now pays for Plus while a free Pro waits above it. Pro comes back only if the member cancels Plus. The other way into the same state is an edit to the subscription's price made directly at the payment provider, which moves it below a marked grant's tier while the grant waits.

What the console does today

  • The Products page shows the waiting Pro as "Granted", with no button.
  • The current card's "Cancel plan" confirmation names what follows: "You keep Plus until {renewal date}, then move to Pro."
  • The case is documented as rare in docs/plan-management.md.

Why it can happen

Three rules combine; the first comment explains why a grant waits:

  • A grant waits for the replacing subscription's full end. A change of tier, or the subscription leaving the grant's ladder, does not resume it.
  • Resumption never takes a rung from another source.
  • The console never rewrites a move the member already scheduled. Once a grant is marked, a held rung blocks a new downgrade to any tier below both the held rung and the current one. A downgrade scheduled before the mark still lands.

Options known so far

  • Accept it as rare, as today: the member can still reach Pro by cancelling, and the confirmation says so.
  • When a grant is marked, tell the operator that a scheduled downgrade will land below its tier, so they can talk to the member or adjust the grant.
  • When a scheduled downgrade would land at or below a marked grant's tier, turn it into a cancellation at renewal. This rewrites a move the member chose.
  • Revisit "waits for the full end": let a change of tier that lands below a marked grant end the subscription's hold on that ladder. This needs an answer for what the member then pays for.

Decided when

Which of these applies is decided and written down. The member's Products page and the operator's grant row both say what happens next in this state, and a test drives the five steps above.

## The question An operator can mark a grant so that it delivers again when the plan that replaced it ends. One sequence leaves a member paying for less than they were given. Take one ladder, Starter → Plus → Pro → Max: 1. An operator gives the organization a complimentary **Pro** grant. Pro delivers. 2. The member buys **Max** through Checkout. Max replaces Pro on the ladder. Pro is not marked, so it stops. 3. The member schedules a downgrade from **Max to Plus**. A downgrade takes effect at renewal, so the subscription stays on Max for now. 4. The operator marks the Pro grant to resume. Pro is now on hold behind Max. 5. At renewal the downgrade lands and the subscription moves to **Plus**. A change of tier does not end the subscription, so Pro keeps waiting. The member now pays for Plus while a free Pro waits above it. Pro comes back only if the member cancels Plus. The other way into the same state is an edit to the subscription's price made directly at the payment provider, which moves it below a marked grant's tier while the grant waits. ## What the console does today - The Products page shows the waiting Pro as "Granted", with no button. - The current card's "Cancel plan" confirmation names what follows: "You keep Plus until {renewal date}, then move to Pro." - The case is documented as rare in `docs/plan-management.md`. ## Why it can happen Three rules combine; the first comment explains why a grant waits: - A grant waits for the replacing subscription's full end. A change of tier, or the subscription leaving the grant's ladder, does not resume it. - Resumption never takes a rung from another source. - The console never rewrites a move the member already scheduled. Once a grant is marked, a held rung blocks a new downgrade to any tier below both the held rung and the current one. A downgrade scheduled before the mark still lands. ## Options known so far - Accept it as rare, as today: the member can still reach Pro by cancelling, and the confirmation says so. - When a grant is marked, tell the operator that a scheduled downgrade will land below its tier, so they can talk to the member or adjust the grant. - When a scheduled downgrade would land at or below a marked grant's tier, turn it into a cancellation at renewal. This rewrites a move the member chose. - Revisit "waits for the full end": let a change of tier that lands below a marked grant end the subscription's hold on that ladder. This needs an answer for what the member then pays for. ## Decided when Which of these applies is decided and written down. The member's Products page and the operator's grant row both say what happens next in this state, and a test drives the five steps above.
cgalo5758 added the
kind
design
area/entitlementsarea/billingarea/member-ui
labels 2026-10-01 07:26:48 +00:00
Author
Owner

To revisit: "a grant waits for the subscription's full end, not a change of tier". I want to reconsider this rule, so here is why it was chosen. It is really two rules.

1. A change of tier inside the ladder never resumes the grant. This one is structural, not chosen. A ladder holds one source at a time, and resumption never takes a rung from another source. A subscription that moves from Max to Plus still holds the ladder's rung, so there is no vacant rung for Pro to return to. Resuming Pro anyway would mean taking the rung from a plan the member is still paying for. They would then be billed for a subscription that delivers nothing on that ladder. Changing this rule means deciding what happens to the subscription at that moment: cancel it, refund it, or let it keep billing for nothing.

2. A subscription that leaves the grant's ladder but keeps running does not resume the grant until it ends. This was a real choice. It covers an edit at the payment provider that moves the subscription's item to another ladder, or removes the item, while other items keep billing. The reasons:

  • One trigger. Resumption happens only when a plan ends: a subscription's end, a revocation, an expiry. Each of those runs under the pool lock, and only when it ended something. Resuming on an item change would add a fourth trigger, inside a reconcile path that runs on every subscription update, including edits that may be undone minutes later.
  • No flapping. If the subscription's item comes back to the ladder, it would supersede the just-resumed grant again. Each round trip would end and restart the grant's delivery and write Tier changes rows.
  • Dunning, the sibling rule. A past-due subscription may recover, so the grant waits for the provider to cancel it rather than resuming during dunning.

What #159 adds to that picture. The case here comes from rule 1 combined with a third rule: the console never rewrites a downgrade the member already scheduled. Rule 2 is not involved. So revisiting "waits for the full end" for this case means revisiting rule 1, which in turn means choosing what happens to the subscription. The options in the issue body are the candidates.

**To revisit: "a grant waits for the subscription's full end, not a change of tier".** I want to reconsider this rule, so here is why it was chosen. It is really two rules. **1. A change of tier inside the ladder never resumes the grant.** This one is structural, not chosen. A ladder holds one source at a time, and resumption never takes a rung from another source. A subscription that moves from Max to Plus still holds the ladder's rung, so there is no vacant rung for Pro to return to. Resuming Pro anyway would mean taking the rung from a plan the member is still paying for. They would then be billed for a subscription that delivers nothing on that ladder. Changing this rule means deciding what happens to the subscription at that moment: cancel it, refund it, or let it keep billing for nothing. **2. A subscription that leaves the grant's ladder but keeps running does not resume the grant until it ends.** This was a real choice. It covers an edit at the payment provider that moves the subscription's item to another ladder, or removes the item, while other items keep billing. The reasons: - **One trigger.** Resumption happens only when a plan *ends*: a subscription's end, a revocation, an expiry. Each of those runs under the pool lock, and only when it ended something. Resuming on an item change would add a fourth trigger, inside a reconcile path that runs on every subscription update, including edits that may be undone minutes later. - **No flapping.** If the subscription's item comes back to the ladder, it would supersede the just-resumed grant again. Each round trip would end and restart the grant's delivery and write Tier changes rows. - **Dunning, the sibling rule.** A past-due subscription may recover, so the grant waits for the provider to cancel it rather than resuming during dunning. **What #159 adds to that picture.** The case here comes from rule 1 combined with a third rule: the console never rewrites a downgrade the member already scheduled. Rule 2 is not involved. So revisiting "waits for the full end" for this case means revisiting rule 1, which in turn means choosing what happens to the subscription. The options in the issue body are the candidates.
Author
Owner

Checkout is a third way into this state: it lets an organization on a granted tier buy a tier below it, and the purchase replaces the grant. #175 makes Checkout refuse that purchase.

Checkout is a third way into this state: it lets an organization on a granted tier buy a tier below it, and the purchase replaces the grant. #175 makes Checkout refuse that purchase.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wiki-cafe/member-console#159