A scheduled cancellation keeps its "Cancels on" badge but loses its end date and Keep plan when the plan's price cannot be read #198

Open
opened 2026-10-09 16:01:19 +00:00 by cgalo5758 · 0 comments
Owner

What happens

On the Products page each plan ladder (the tiers of one plan, drawn as a row of cards) shows a "Cancels on {date}" badge in its heading while the subscription's cancellation is scheduled. The card of the tier the organization is on, the current card, normally reads "$30.00/month, ends {date}" and offers "Keep plan".

When the current card's price cannot be read, the heading keeps the badge but the card reads "Billing details are still being processed." and carries no control. Nothing else on the ladder takes the cancellation back either. While a cancellation is scheduled, the free tier and a granted tier waiting below carry no control, because "Keep plan" is meant to be the way back. The member is told the plan ends and has nothing on the page to stop it.

setCurrent returns before it sets EndsOn and CanKeep whenever resolveCurrentPlanBilling gives no price text. The empty price stands in for "no subscription backs this plan", since a granted plan has no price either. A subscription-backed plan also gets an empty price in three cases: its period end is unknown, it has no current subscription item, or reading the item or its price fails. A database error on that read is worded as "still being processed" too.

The same return drops a scheduled downgrade's "moves to {tier} on {date}" along with both "Keep plan" and "Cancel plan". With nothing scheduled, it drops "Cancel plan".

What should happen

The current card offers its next step whenever a subscription backs the plan, whether or not the price was read. While a cancellation is scheduled, it says the plan ends on that date and offers "Keep plan". While a downgrade is scheduled, it names the tier and the date and offers "Keep plan" and "Cancel plan". Otherwise it offers "Cancel plan". Only the price waits for the price. A failed read is reported as a failure, not as pending.

Where

internal/server/member_plans.go (setCurrent, resolveCurrentPlanBilling); the current card in internal/embeds/templates/partials/member_plans.html, which checks BillingPending before EndsOn and MovesTo.

Steps

  1. Subscribe to a paid tier and cancel it from the Products page. The card reads "ends {date}" with "Keep plan".
  2. Set ended_at on the subscription's row in core.subscription_items.
  3. Reload the Products page. The heading still says "Cancels on {date}", the card says billing is still being processed, and "Keep plan" appears nowhere.

Why it matters

A member who cancelled and changed their mind is told the plan ends and given no way to keep it for as long as the price stays unreadable.

## What happens On the Products page each plan ladder (the tiers of one plan, drawn as a row of cards) shows a "Cancels on {date}" badge in its heading while the subscription's cancellation is scheduled. The card of the tier the organization is on, the current card, normally reads "$30.00/month, ends {date}" and offers "Keep plan". When the current card's price cannot be read, the heading keeps the badge but the card reads "Billing details are still being processed." and carries no control. Nothing else on the ladder takes the cancellation back either. While a cancellation is scheduled, the free tier and a granted tier waiting below carry no control, because "Keep plan" is meant to be the way back. The member is told the plan ends and has nothing on the page to stop it. `setCurrent` returns before it sets `EndsOn` and `CanKeep` whenever `resolveCurrentPlanBilling` gives no price text. The empty price stands in for "no subscription backs this plan", since a granted plan has no price either. A subscription-backed plan also gets an empty price in three cases: its period end is unknown, it has no current subscription item, or reading the item or its price fails. A database error on that read is worded as "still being processed" too. The same return drops a scheduled downgrade's "moves to {tier} on {date}" along with both "Keep plan" and "Cancel plan". With nothing scheduled, it drops "Cancel plan". ## What should happen The current card offers its next step whenever a subscription backs the plan, whether or not the price was read. While a cancellation is scheduled, it says the plan ends on that date and offers "Keep plan". While a downgrade is scheduled, it names the tier and the date and offers "Keep plan" and "Cancel plan". Otherwise it offers "Cancel plan". Only the price waits for the price. A failed read is reported as a failure, not as pending. ## Where `internal/server/member_plans.go` (`setCurrent`, `resolveCurrentPlanBilling`); the current card in `internal/embeds/templates/partials/member_plans.html`, which checks `BillingPending` before `EndsOn` and `MovesTo`. ## Steps 1. Subscribe to a paid tier and cancel it from the Products page. The card reads "ends {date}" with "Keep plan". 2. Set `ended_at` on the subscription's row in `core.subscription_items`. 3. Reload the Products page. The heading still says "Cancels on {date}", the card says billing is still being processed, and "Keep plan" appears nowhere. ## Why it matters A member who cancelled and changed their mind is told the plan ends and given no way to keep it for as long as the price stays unreadable.
cgalo5758 added the
kind
bug
area/billingarea/member-ui
labels 2026-10-09 16:01:19 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wiki-cafe/member-console#198