Ask
74
@epsilon_eddie ·

stripe billing portal lets people downgrade mid-cycle and i eat a $38 credit every time Billing Portal

Plan A is $49/mo, plan B is $19/mo. Someone opens the billing portal on day 3 of the cycle, switches to B, and Stripe hands them a proration credit for the unused A time. That credit parks on their customer balance and eats most of the next invoice.

One account has now done this loop three times: upgrade before a busy week, downgrade after. Each round I collect about $38 less than the plan says.

I do not want to remove the downgrade button, that seems like an excellent way to make people cancel instead. What is the actual setting here? Every article I find is about handling upgrades.

10 answers Share
Report

Answering anonymously — a moderator will review it first.

  • @burr_bennet · 3h ago · 3 replies

    The portal configuration has subscription_update.proration_behavior and the default is create_prorations, which is exactly the credit you are seeing. Set it to none and the switch takes effect immediately with no money moving.

    Better shape, if you have twenty minutes: keep prorations for upgrades (people like getting charged less to move up) and handle downgrades yourself with a subscription schedule that flips the price at current_period_end. They keep plan A until the date on the receipt they already paid, then land on B. Nothing to credit, nothing to explain.

    Also worth knowing that portal configurations are objects, not one global setting. You can allowlist which prices are switchable and hand different customers different configurations.

    96
    Share
    Reply

    Answering anonymously — a moderator will review it first.

    Report
    • @brinekeeper · 3h ago

      The schedule route is the one that survives contact with support tickets. Customer keeps what they paid for until the date they expect, and nobody emails you asking what a "credit balance" is.

      31
      Share
      Reply

      Answering anonymously — a moderator will review it first.

      Report
    • @runway_math · 3h ago

      Small thing on proration_behavior: 'none' - they get plan B pricing immediately while having already paid for A, so you keep the difference and they lose it. That is fine and legal, but it is the kind of thing that shows up in a review six months later. Decide it on purpose rather than because it was the one-line fix.

      12
      Share
      Reply

      Answering anonymously — a moderator will review it first.

      Report
  • @hemline_hana · 3h ago

    The pattern you described is not a billing bug, it is a product telling you something. Upgrade before a busy week, downgrade after, three times, is a customer with spiky demand paying you a flat rate designed for steady demand.

    Sell them the spike. A one-off boost, or an add-on that expires, or metered overage on the cheap plan. You will make more than $38 and they will stop doing plan gymnastics.

    41
    Share
    Reply

    Answering anonymously — a moderator will review it first.

    Report
  • @leggy_seedling · 7h ago · 2 replies

    Easier: when they downgrade, set the subscription to cancel_at_period_end and let them subscribe fresh on the cheap plan. No proration to manage at all because there is no plan change, just an ending and a beginning.

    16
    Share
    Reply

    Answering anonymously — a moderator will review it first.

    Report
    • @burr_bennet · 3h ago

      That creates a gap where the customer has no active subscription, which means your entitlement checks have to handle "paid until Tuesday but cancelled" as a state, and it depends on them coming back to resubscribe, which some fraction will not.

      You also lose the continuous subscription record, so anything you compute off subscription age (churn cohorts, lifetime value) now sees two customers where there was one. A schedule phase does the same thing without any of that.

      13
      Share
      Reply

      Answering anonymously — a moderator will review it first.

      Report
  • @warranty_wes · 3h ago · 2 replies

    $38 times three is $114. How many hours are you into this thread? Set proration to none, add one sentence in the portal copy, move on to something that moves revenue.

    27
    Share
    Reply

    Answering anonymously — a moderator will review it first.

    Report
    • @aquariumdad · 3h ago

      It compounds though. It is not one account, it is the first account that found the loop. The second one costs nothing to find it now that it exists.

      9
      Share
      Reply

      Answering anonymously — a moderator will review it first.

      Report
  • @thea_mandel · 3h ago

    Independently of the Stripe setting: put a plan-change cooldown in your own app. One downgrade per billing period, enforced with a last_plan_change_at column and a friendly message. Takes an hour and it kills the loop regardless of how proration is configured.

    19
    Share
    Reply

    Answering anonymously — a moderator will review it first.

    Report
  • @pumptest_pat · 3h ago

    Check the customer balance in the dashboard before you assume the money is gone. It is parked, not lost, and if they stay subscribed it eventually gets consumed against invoices you would have collected anyway. The loss is only real for the ones who churn while holding a credit.

    8
    Share
    Reply

    Answering anonymously — a moderator will review it first.

    Report