Short answer
Save the portal settings in the Dashboard for live mode as well as sandboxes, since each has its own. Create a new portal session on your server each time a signed-in customer clicks the button, because session links are short-lived, and pass a return_url unless a default is set. Then listen to subscription webhooks so the app follows what customers change.
Why the portal fails, and the fix
01
Settings saved in only one mode
“Choose your settings for sandboxes and live mode, based on your product and price catalog.” Stripe, Integrate the customer portal
A portal that works in testing and fails for real customers often has no live mode settings. Turn off View test data, configure the portal in live mode, and add your live mode webhooks.
02
A saved or emailed portal link
“New portal sessions expire after a 5 minute period.” Stripe, Customer portal
Portal session links expire, so a link stored in your database or sent by email stops working. Create a new session when the customer clicks Manage billing, after checking they’re signed in.
03
A session created without the right details
“Make sure to authenticate customers on your site before creating sessions for them.” Stripe, Integrate the customer portal
The session needs the customer ID that matches the signed-in user, and a return_url unless you set a default in the Dashboard. Look up the customer ID in your own database for the signed-in user, never from the browser, or one user could open another’s billing.
04
The app doesn’t notice portal changes
“When subscriptions are upgraded, downgraded, or canceled, you need to make sure that customers receive only the products or services they’re actively subscribed to.” Stripe, Integrate the customer portal
When a customer upgrades, downgrades or cancels in the portal, Stripe tells your app through webhooks. Without them, the app keeps the old plan.
Checked against the vendor’s docs on : Stripe docs: Integrate the customer portal; Stripe docs: Customer portal.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- $950Stripe Billing Fix and SetupSubscriptions, webhooks, customer portal and failed payments set up or fixed, tested in Stripe test mode.See scope and start
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
Related: Stripe canceled, app access wrong · Stripe works in test mode, not live · Stripe paid but account not upgraded