A member cannot change the card their subscription charges #256

Open
opened 2026-10-24 06:21:46 +00:00 by cgalo5758 · 1 comment
Owner

What a person cannot do today

A member cannot replace the card their subscription charges. No console page offers it: the console opens no Stripe customer portal session and has no flow that sets a subscription's default payment method. A member whose card expired or was replaced cannot hand the new one over before the next renewal fails.

What they should be able to do

Replace the card a subscription charges from a console page, before or after a renewal fails, while every plan change still goes through the console's own plan moves.

Why it matters

A failed renewal suspends the plan at once (#255). Once #148 lands, a member can pay the open invoice through Stripe's hosted invoice page, but unless that page also saves the new card as the subscription's default, which has not been checked in a Stripe sandbox yet, the next renewal charges the old card and fails again. A member whose card is about to expire has no way to prevent the first failure either.

Where

The member billing pages in internal/server and the Stripe integration in internal/integrations/stripe. The webhook set already mirrors payment_method.updated (internal/integrations/stripe/workflows/webhook_payment_method.go).

Two ways are known. Stripe's customer portal has a payment_method_update flow, usable only with the portal's cancel and switch flows turned off, because otherwise the portal becomes a second way to change plans that skips the console's offer rules. A Checkout session in setup mode collects a card without the portal.

Done when

A member can replace the card their subscription charges from a console page, the next renewal charges the new card, and no route lets a member change or cancel a plan outside the console's plan moves.

### What a person cannot do today A member cannot replace the card their subscription charges. No console page offers it: the console opens no Stripe customer portal session and has no flow that sets a subscription's default payment method. A member whose card expired or was replaced cannot hand the new one over before the next renewal fails. ### What they should be able to do Replace the card a subscription charges from a console page, before or after a renewal fails, while every plan change still goes through the console's own plan moves. ### Why it matters A failed renewal suspends the plan at once (#255). Once #148 lands, a member can pay the open invoice through Stripe's hosted invoice page, but unless that page also saves the new card as the subscription's default, which has not been checked in a Stripe sandbox yet, the next renewal charges the old card and fails again. A member whose card is about to expire has no way to prevent the first failure either. ### Where The member billing pages in `internal/server` and the Stripe integration in `internal/integrations/stripe`. The webhook set already mirrors `payment_method.updated` (`internal/integrations/stripe/workflows/webhook_payment_method.go`). Two ways are known. Stripe's customer portal has a `payment_method_update` flow, usable only with the portal's cancel and switch flows turned off, because otherwise the portal becomes a second way to change plans that skips the console's offer rules. A Checkout session in `setup` mode collects a card without the portal. ### Done when A member can replace the card their subscription charges from a console page, the next renewal charges the new card, and no route lets a member change or cancel a plan outside the console's plan moves.
cgalo5758 added the
kind
enhancement
area/billingarea/member-ui
labels 2026-10-24 06:21:46 +00:00
Author
Owner

Checked in a Stripe sandbox (API version 2025-02-24.acacia): paying a past-due subscription's open invoice on Stripe's hosted invoice page with a new card does not make that card the subscription's default.

  • Checkout sets the subscription's own default_payment_method to the card it collected, right after it creates the subscription.
  • The hosted invoice page attaches the new card to the customer and sets it as the customer's invoice_settings.default_payment_method. The subscription's own default_payment_method stays the card that failed.
  • Stripe charges a subscription's own default before the customer's, so the next renewal charges the failed card again and the plan is suspended again.

So the case under "Why it matters" holds. The precedence suggests one more way: once the subscription's own default_payment_method is cleared, the customer's default, which the hosted page has just set to the new card, pays the next renewal.

Checked in a Stripe sandbox (API version `2025-02-24.acacia`): paying a past-due subscription's open invoice on Stripe's hosted invoice page with a new card does not make that card the subscription's default. - Checkout sets the subscription's own `default_payment_method` to the card it collected, right after it creates the subscription. - The hosted invoice page attaches the new card to the customer and sets it as the customer's `invoice_settings.default_payment_method`. The subscription's own `default_payment_method` stays the card that failed. - Stripe charges a subscription's own default before the customer's, so the next renewal charges the failed card again and the plan is suspended again. So the case under "Why it matters" holds. The precedence suggests one more way: once the subscription's own `default_payment_method` is cleared, the customer's default, which the hosted page has just set to the new card, pays the next renewal.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wiki-cafe/member-console#256