What happens if…: connecting and subscriptions
After paying, comped plans, connecting Stripe and subscriptions: each case, what Gemmein does and what you do.
The cases you are most likely to meet, by part of this page. Credits have their own table on Credits.
After paying, and comped plans
| If… | What happens | What you do |
|---|---|---|
| A product went on sale before your domain was verified | Gemmein points its Payment Link back to your domain the moment it is verified. After paying, the buyer lands on your return path (/ unless you set one on the Payments page). | Nothing. |
| Your verified domain is removed | Buyers see Stripe's own confirmation page after paying. | Verify the domain again. |
| You remove a product | Its file stays while any buyer holds it and is deleted once nobody does (a full refund ends a hold; a part refund keeps it). A file uploaded in the last 24 hours is never touched, and a Live copy replaced at go-live goes the same way. Logs records each deletion. | Nothing. |
| You comp a plan with an end date | It ends on its own at that date (checked every 10 minutes): back to the default plan, its access goes, and Logs records it. Credits already granted stay. | Nothing. |
| You switch or cancel a comped plan | Its access moves at once: the old plan's comp access goes, the new plan's comes. | Nothing. |
| A comped person later pays | The paid plan takes over and the comp's own access goes, so nothing outlives the paid plan. | Nothing. |
Connecting Stripe
| If… | What happens | What you do |
|---|---|---|
| You paste a secret key, a publishable key, a signing secret or a Payment Link | Refused in one sentence. A live-mode key in Development, or a test-mode key in Live, is refused too | Make a restricted key with the permissions above: five, plus two if you sell plans |
| The key is missing a permission | Refused, naming each missing row (stripe_key_permissions) | Turn that row on in Stripe's key editor and paste the key again |
| The key can read money or customer data | Refused (stripe_key_too_broad), with what the key can read | Choose None on every section heading, then turn on only the five (plus two if you sell plans) |
| Your app sells only products and adds its first plan, on a key made with the five | The plan is refused before anything is made in Stripe (stripe_key_plan_rows), naming the two rows to add. A sync, the Payments page and a promote into Live are refused the same way, so you see it before promoting. Nothing else changes | Add Customer portal and Subscriptions (Write) to the key in Stripe, then save again |
| A key made with only the five, on an app that sells plans | Selling keeps working. Payments shows the missing rows, g.subscriptions.manage() answers portal_unavailable, and deleting a member's account can't end their subscription in Stripe, so you are told to cancel it there | Edit the key in Stripe and add the two rows |
| The last plan is removed while members still pay | The app still counts as selling plans: the key still needs the two rows, those members still open their portal, and deleting one still ends their subscription. Another business's subscriptions on the same Stripe account never count | Nothing |
| Gemmein can't read the environment's payments for a moment | Connecting the key answers payments_unreadable and saves nothing; the daily check concludes nothing | Try again |
| The Stripe account is already connected to another Gemmein account | Refused (stripe_account_in_use). Your own apps may share one Stripe account | Connect a Stripe account that only you use |
| You paste a key from a different Stripe account | Refused while what Gemmein made in the first account exists | In Development, Start over once nothing can still pay |
| You replace the key with a new one from the same Stripe account | The webhook, its signing secret, your Payment Links and the account's claim carry over | Nothing |
| The key is revoked or rolled in Stripe | Payment Links already out keep selling and payments keep landing. Making or changing anything in Stripe is refused (stripe_key_broken). The Payments page, Overview and Errors show it, and you get one email | Connect a new key |
| The key is given more permissions later | Gemmein stops using it (stripe_key_too_broad) and resumes on its own once it is back to the rows it needs | Remove the extra permissions in Stripe |
| Gemmein's webhook is deleted or disabled in Stripe | The Payments page, Overview and Errors show it, and you get one email | Choose Repair webhook. A deleted one is made again with a new signing secret, and the old one keeps verifying for 72 hours |
| Stripe refuses part of a save, such as a permission the key lost | Nothing is saved. What Gemmein made in Stripe during that save is turned off again, and the message names what to fix | Fix what the message names and save again |
| Two people save the Payments page at once | The later save is refused with a reload message | Reload and save again |
| A payment lands on a Payment Link Gemmein did not make, or on a removed item's old link | Nothing is granted, even to an item added again under the same name. Errors names the payment | Refund it in Stripe, or grant it by hand |
| You disconnect the key | The webhook, its signing secret and every Payment Link keep working. Only making or changing things in Stripe stops | Nothing |
| Live has no key yet | Nothing sold through Stripe can be bought in Live; its checkout answers payments_not_configured | Connect a live-mode key on Live's Payments page |
Subscriptions
| If… | What happens | What you do |
|---|---|---|
| A renewal payment fails | The customer keeps the plan while Stripe retries the card, and g.subscriptions.mine() still answers active. Your Stripe retry schedule is the grace period | Nothing. Set the retries in your Stripe subscription settings |
| Stripe stops retrying a failed renewal | When Stripe cancels the subscription or marks it unpaid, the customer moves to your default plan and the plan's access closes. A subscription Stripe leaves past due keeps the plan | In your Stripe subscription settings, cancel the subscription or mark it unpaid after the last retry |
| A customer cancels at period end | They keep the plan until the period ends, then move to your default plan | Nothing |
A subscriber calls g.subscriptions.checkout again | No second subscription is started. It answers already_subscribed with a customer portal link for them, where they change plan | Send them to the url it returns |
| The price on a subscription is changed in Stripe to another plan's price | The customer moves to that plan, and Logs records the change. A price Gemmein did not make leaves the plan as it is | Nothing |
| A subscription is paused in Stripe | The customer is on your default plan while it is paused. When it resumes, the plan comes back | Nothing |
| A renewal is paid | The plan's credits for the new period are granted once. A renewal never changes the plan | Nothing |
| A subscription payment is refunded in full | That period's credits are taken back and the payment reads refunded. The plan and its access stay | To end access too, cancel the subscription in Stripe (see Refunds) |
| Stripe sends events late, out of order or twice | Each applies once and the newest state wins. A late payment never reopens a cancelled plan | Nothing |
| A customer pays by bank debit | The plan opens when the payment clears. A payment that never clears is closed after 30 days, and opens the plan if it still arrives | Nothing |
| You rename a plan | Its subscribers move with it and keep their access | Nothing |
Was this page helpful?
Thanks for telling us.
Thanks for telling us.
Last updated