TryGhost / TryGhost/Ghost

Downgrading behavior is confusing

Open
#29,809 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

affects:portal
Dominant language
TypeScript
Stars
55.4k
Forks
12k
Avg merge
1d 41m
Merged PRs (30d)
534

Description

Issue Summary

If a user signs up for a higher priced plan and then downgrades to the lower one, the behavior is unexpected.

What happens:

  • The member is immediately moved to the lower plan.
  • Stripe records a credit, based on time left on the higher plan (prorated) and time on the new plan (prorated, no reset on the billing date).
  • There is no indication in Portal that the user has a credit in Stripe.
  • There's no indication before downgrading that the current plan will immediately switch. (Lots of platforms run out the current paid period first.)

In the extreme case, a member who signs up for an annual plan at $300 per year and then downgrades shortly after billing (or renewal) to a $30/year plan will end up with a ~$270 credit at Stripe. It'll take 9 years to work through that credit.

Mitigation

  • Minimally, downgrading or upgrading should clearly say what's going to happen, rather than just doing it.
  • Better: Match the behavior of most platforms, where your plan change goes in after the end of the current paid period.
Steps to Reproduce

Create two paid plans.
Sign up as a member, choosing the higher paid plan.
In Portal, change to the lower paid plan.
Inspect the results in Stripe (I was using test mode)

Ghost Version

6.56

Node.js Version

Ghost Pro

How did you install Ghost?

Ghost Pro

Database type

MySQL 8

Browser & OS version

No response

Relevant log / error output

Code of Conduct
  • I agree to be friendly and polite to people in this repository

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the downgrade through Portal using two paid plans, then inspect the resulting credit and plan timing in Stripe test mode. Start from the Portal plan-change flow and compare the immediate switch with the proposed end-of-period behavior. Done means the chosen behavior is clear before confirmation and the resulting plan and Stripe credit match that behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
mysql, node.js, typescript
Domain
backend, payments
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.