[GH-ISSUE #7515] Stripe Plugin: "You're already subscribed to this plan" error when upgrading from monthly to yearly billing #10829

Closed
opened 2026-04-13 07:11:43 -05:00 by GiteaMirror · 3 comments
Owner

Originally created by @k-urtica on GitHub (Jan 21, 2026).
Original GitHub issue: https://github.com/better-auth/better-auth/issues/7515

Originally assigned to: @bytaesu on GitHub.

Is this suited for github?

  • Yes, this is suited for github

To Reproduce

  1. Configure a plan (e.g. pro) with both monthly and yearly prices, including a valid annualDiscountPriceId pointing to a yearly Stripe price.
  2. Create a subscription using the monthly price for the pro plan and confirm that the subscription is active.
  3. Attempt to upgrade the subscription to yearly billing using the Stripe plugin:
await authClient.subscription.upgrade({
  plan: "pro",
  annual: true,
  subscriptionId: activeSubscription.id, // current subscription id (sub_xx)
  successUrl: "/dashboard"
});
  1. The request fails immediately with the following error
You're already subscribed to this plan

Current vs. Expected behavior

Current behavior:
The upgrade request fails with "You're already subscribed to this plan" and the billing interval is not changed.

Expected behavior:

  • Upgrading a subscription from monthly to yearly billing for the same plan should be allowed.
  • The plugin should recognize the different billing interval and proceed with the upgrade flow.

What version of Better Auth are you using?

1.4.13

System info

{
  "system": {
    "platform": "linux",
    "arch": "x64",
    "version": "#1 SMP Tue Nov 5 00:21:55 UTC 2024",
    "release": "5.15.167.4-microsoft-standard-WSL2",
    "cpuCount": 6,
    "cpuModel": "Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz",
    "totalMemory": "11.69 GB",
    "freeMemory": "5.31 GB"
  },
  "node": {
    "version": "v24.11.1",
    "env": "development"
  },
  "packageManager": {
    "name": "npm",
    "version": "11.6.2"
  },
  "frameworks": [
    {
      "name": "vue",
      "version": "3.5.26"
    },
    {
      "name": "nuxt",
      "version": "4.2.2"
    }
  ],
  "databases": [
    {
      "name": "@libsql/client",
      "version": "^0.17.0"
    },
    {
      "name": "drizzle",
      "version": "0.45.1"
    }
  ],
  "betterAuth": {
    "version": "1.4.13",
    "config": null
  }
}

Which area(s) are affected? (Select all that apply)

Package

Auth config (if applicable)

import { betterAuth } from "better-auth"
export const auth = betterAuth({
  emailAndPassword: {  
    enabled: true
  },
});

Additional context

No response

Originally created by @k-urtica on GitHub (Jan 21, 2026). Original GitHub issue: https://github.com/better-auth/better-auth/issues/7515 Originally assigned to: @bytaesu on GitHub. ### Is this suited for github? - [x] Yes, this is suited for github ### To Reproduce 1. Configure a plan (e.g. `pro`) with both monthly and yearly prices, including a valid `annualDiscountPriceId` pointing to a yearly Stripe price. 2. Create a subscription using the monthly price for the `pro` plan and confirm that the subscription is active. 3. Attempt to upgrade the subscription to yearly billing using the Stripe plugin: ```ts await authClient.subscription.upgrade({ plan: "pro", annual: true, subscriptionId: activeSubscription.id, // current subscription id (sub_xx) successUrl: "/dashboard" }); ``` 3. The request fails immediately with the following error ``` You're already subscribed to this plan ``` ### Current vs. Expected behavior Current behavior: The upgrade request fails with "You're already subscribed to this plan" and the billing interval is not changed. Expected behavior: - Upgrading a subscription from monthly to yearly billing for the same plan should be allowed. - The plugin should recognize the different billing interval and proceed with the upgrade flow. ### What version of Better Auth are you using? 1.4.13 ### System info ```bash { "system": { "platform": "linux", "arch": "x64", "version": "#1 SMP Tue Nov 5 00:21:55 UTC 2024", "release": "5.15.167.4-microsoft-standard-WSL2", "cpuCount": 6, "cpuModel": "Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz", "totalMemory": "11.69 GB", "freeMemory": "5.31 GB" }, "node": { "version": "v24.11.1", "env": "development" }, "packageManager": { "name": "npm", "version": "11.6.2" }, "frameworks": [ { "name": "vue", "version": "3.5.26" }, { "name": "nuxt", "version": "4.2.2" } ], "databases": [ { "name": "@libsql/client", "version": "^0.17.0" }, { "name": "drizzle", "version": "0.45.1" } ], "betterAuth": { "version": "1.4.13", "config": null } } ``` ### Which area(s) are affected? (Select all that apply) Package ### Auth config (if applicable) ```typescript import { betterAuth } from "better-auth" export const auth = betterAuth({ emailAndPassword: { enabled: true }, }); ``` ### Additional context _No response_
GiteaMirror added the locked label 2026-04-13 07:11:43 -05:00
Author
Owner

@better-auth-agent[bot] commented on GitHub (Jan 21, 2026):

To address the "You're already subscribed to this plan" error when attempting to upgrade a subscription from monthly to yearly in Better Auth, here are the recommended next steps:

  1. Ensure Proper Pricing Configuration: Verify that your Stripe plan configurations properly define both monthly and yearly pricing including valid annualDiscountPriceId. Ensure that the API call for upgrading references these correctly.

  2. Upgrade Logic Adjustment: It appears there may be an ongoing issue with the plugin's handling of subscription upgrades when switching billing intervals. According to an open pull request, the upgrade logic needs to differentiate between monthly and annual plans to prevent false "already subscribed" errors [2]. It is advisable to check if this pull request has been merged in your version or if you need to apply a workaround by creating separate products for monthly and yearly payments.

  3. Check Active Subscription Status: Make sure that the active subscription is not currently in a trial or pending status. An active status is required for successful upgrades.

If these steps do not resolve your issue, please tag members of the Better Auth team, Beka and Max (@bekacru and @ping__), for further assistance.

What specific steps have you tried so far in resolving this error?

If you need more help, tag @better-auth-agent in a comment so I can respond.

DiagramDiscordGitHub

Diagram Join Star

<!-- gh-comment-id:3776541297 --> @better-auth-agent[bot] commented on GitHub (Jan 21, 2026): To address the "You're already subscribed to this plan" error when attempting to upgrade a subscription from monthly to yearly in Better Auth, here are the recommended next steps: 1. **Ensure Proper Pricing Configuration**: Verify that your Stripe plan configurations properly define both monthly and yearly pricing including valid `annualDiscountPriceId`. Ensure that the API call for upgrading references these correctly. 2. **Upgrade Logic Adjustment**: It appears there may be an ongoing issue with the plugin's handling of subscription upgrades when switching billing intervals. According to an open pull request, the upgrade logic needs to differentiate between monthly and annual plans to prevent false "already subscribed" errors [[2]](https://github.com/better-auth/better-auth/pull/4632). It is advisable to check if this pull request has been merged in your version or if you need to apply a workaround by creating separate products for monthly and yearly payments. 3. **Check Active Subscription Status**: Make sure that the active subscription is not currently in a trial or pending status. An active status is required for successful upgrades. If these steps do not resolve your issue, please tag members of the Better Auth team, Beka and Max (@bekacru and @ping__), for further assistance. What specific steps have you tried so far in resolving this error? _If you need more help, tag @better-auth-agent in a comment so I can respond._ <!-- bot:webhook reply v1 --> [Diagram](https://repodiagrams.s3.eu-north-1.amazonaws.com/better-auth_ultra_detailed_interactive.html) • [Discord](https://discord.gg/better-auth) • [GitHub](https://github.com/better-auth/better-auth) [![Diagram](https://img.shields.io/badge/Diagram-2b3137?style=flat-square)](https://repodiagrams.s3.eu-north-1.amazonaws.com/better-auth_ultra_detailed_interactive.html) [![Join](https://img.shields.io/badge/join-5865F2?logo=discord&logoColor=white&style=flat-square)](https://discord.gg/better-auth) [![Star](https://img.shields.io/badge/star-181717?logo=github&logoColor=white&style=flat-square)](https://github.com/better-auth/better-auth)
Author
Owner

@dosubot[bot] commented on GitHub (Jan 21, 2026):

This is a known limitation in Better Auth v1.4.13: the Stripe plugin checks only the plan name and seat count when determining if a user is "already subscribed," so switching from monthly to yearly billing for the same plan triggers this error—even though it's a valid upgrade scenario. This has been fixed in a later release: after PR #5167, the plugin also compares the Stripe price ID, which allows upgrades between different billing intervals on the same plan without error. The fix is included in versions released after the version bump in PR #5197 (merged 2025-10-09) — upgrading to the latest version will resolve this issue citation.

If you can't upgrade right now, the only workarounds are to use separate Stripe products for monthly and yearly plans, or to change the seat count or plan as part of the upgrade to bypass the duplicate check citation. There are no configuration options or documented workarounds for interval-only upgrades in affected versions.

To reply, just mention @dosu.


How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other

Chat with Dosu Open in Cursor Join Discord Share on X

<!-- gh-comment-id:3776551413 --> @dosubot[bot] commented on GitHub (Jan 21, 2026): <!-- Answer --> This is a known limitation in Better Auth v1.4.13: the Stripe plugin checks only the plan name and seat count when determining if a user is "already subscribed," so switching from monthly to yearly billing for the same plan triggers this error—even though it's a valid upgrade scenario. This has been fixed in a later release: after PR #5167, the plugin also compares the Stripe price ID, which allows upgrades between different billing intervals on the same plan without error. The fix is included in versions released after the version bump in PR #5197 (merged 2025-10-09) — upgrading to the latest version will resolve this issue [citation](https://github.com/better-auth/better-auth/pull/5167). If you can't upgrade right now, the only workarounds are to use separate Stripe products for monthly and yearly plans, or to change the seat count or plan as part of the upgrade to bypass the duplicate check [citation](https://github.com/better-auth/better-auth/issues/3393). There are no configuration options or documented workarounds for interval-only upgrades in affected versions. <!-- Dosu Comment Footer --> *To reply, just mention [@dosu](https://go.dosu.dev/dosubot).* --- <sup>How did I do? [Good](https://app.dosu.dev/response-feedback/7a85e948-bb79-49e5-bda3-434d735d4bce?feedback_type=great_response) | [Irrelevant](https://app.dosu.dev/response-feedback/7a85e948-bb79-49e5-bda3-434d735d4bce?feedback_type=irrelevant_answer) | [Incorrect](https://app.dosu.dev/response-feedback/7a85e948-bb79-49e5-bda3-434d735d4bce?feedback_type=incorrect_sources) | [Verbose](https://app.dosu.dev/response-feedback/7a85e948-bb79-49e5-bda3-434d735d4bce?feedback_type=too_verbose) | [Hallucination](https://app.dosu.dev/response-feedback/7a85e948-bb79-49e5-bda3-434d735d4bce?feedback_type=hallucination) | [Report 🐛](https://app.dosu.dev/response-feedback/7a85e948-bb79-49e5-bda3-434d735d4bce?feedback_type=bug_report) | [Other](https://app.dosu.dev/response-feedback/7a85e948-bb79-49e5-bda3-434d735d4bce?feedback_type=other)</sup> [![Chat with Dosu](https://dosu.dev/dosu-chat-badge.svg)](https://app.dosu.dev/cdda13d9-dd27-4d31-b09a-5d8bec92de21/ask?utm_source=github)&nbsp;[![Open in Cursor](https://dosu.dev/dosu-in-cursor.svg)](https://cursor.com/link/prompt?text=This%20is%20a%20known%20limitation%20in%20Better%20Auth%20v1.4.13%3A%20the%20Stripe%20plugin%20checks%20only%20the%20plan%20name%20and%20seat%20count%20when%20determining%20if%20a%20user%20is%20%22already%20subscribed%2C%22%20so%20switching%20from%20monthly%20to%20yearly%20billing%20for%20the%20same%20plan%20triggers%20this%20error%E2%80%94even%20though%20it%27s%20a%20valid%20upgrade%20scenario.%20This%20has%20been%20fixed%20in%20a%20later%20release%3A%20after%20PR%20%235167%2C%20the%20plugin%20also%20compares%20the%20Stripe%20price%20ID%2C%20which%20allows%20upgrades%20between%20different%20billing%20intervals%20on%20the%20same%20plan%20without%20error.%20The%20fix%20is%20included%20in%20versions%20released%20after%20the%20version%20bump%20in%20PR%20%235197%20%28merged%202025-10-09%29%C2%A0%E2%80%94%20upgrading%20to%20the%20latest%20version%20will%20resolve%20this%20issue%C2%A0%5Bcitation%5D%28https%3A//github.com/better-auth/better-auth/pull/5167%29.%0A%0AIf%20you%20can%27t%20upgrade%20right%20now%2C%20the%20only%20workarounds%20are%20to%20use%20separate%20Stripe%20products%20for%20monthly%20and%20yearly%20plans%2C%20or%20to%20change%20the%20seat%20count%20or%20plan%20as%20part%20of%20the%20upgrade%20to%20bypass%20the%20duplicate%20check%C2%A0%5Bcitation%5D%28https%3A//github.com/better-auth/better-auth/issues/3393%29.%20There%20are%20no%20configuration%20options%20or%20documented%20workarounds%20for%20interval-only%20upgrades%20in%20affected%20versions.)&nbsp;[![Join Discord](https://img.shields.io/badge/join-5865F2?logo=discord&logoColor=white&label=)](https://go.dosu.dev/discord-bot)&nbsp;[![Share on X](https://img.shields.io/badge/X-share-black)](https://twitter.com/intent/tweet?text=%40dosu_ai%20helped%20me%20solve%20this%20issue!&url=https%3A//github.com/better-auth/better-auth/issues/7515)
Author
Owner

@k-urtica commented on GitHub (Jan 21, 2026):

It looks like this issue might already be addressed in the following PR, which is still not merged.
https://github.com/better-auth/better-auth/pull/5167

<!-- gh-comment-id:3776598039 --> @k-urtica commented on GitHub (Jan 21, 2026): It looks like this issue might already be addressed in the following PR, which is still not merged. https://github.com/better-auth/better-auth/pull/5167
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/better-auth#10829