What happens if…: trials, plan changes and purchases

Free trials, changing plan, one-off purchases and access: each case, what Gemmein does and what you do.

Free trials

If…What happensWhat you do
A customer starts a trialThe plan opens at once and its trial credits are granted once. g.subscriptions.mine() answers trialing with trialEndsAtUnlock on plan, as for any subscriber
The trial ends and the card paysThe status becomes active, and the plan's credits for the first paid period are grantedNothing
The trial ends and the card is declined, with onPaymentFailure keepThe customer keeps the plan while Stripe retries the card. If Stripe gives up, they move to your default planSet the retries in your Stripe subscription settings
The trial ends and the card is declined, with onPaymentFailure endThe customer moves to your default plan at once. If a retry succeeds later, the plan opens againNothing
The trial ends with no card (card optional)Stripe cancels the subscription and the customer moves to your default planSend them to g.subscriptions.manage() to add a card before the trial ends
The customer cancels during the trialThey keep the plan until the trial ends, are not charged, then move to your default plan. mine() answers endsAtNothing
The same customer asks for another trialCheckout sends them to the plan's paid link. One trial per customer per app, and none for anyone who has paid for a plan. A +tag or a Gmail dot is the same customerNothing
Someone uses many addresses on a catch-all domainEach address is a separate customer, so each can start a trialKeep the card required (the default) for plans where that matters
A trialing customer switches planThe trial ends, and the new plan's first-period credits are granted when the switch is paidNothing
A customer deletes their account and signs up againThey are a new customer, but their trial stays usedNothing
Someone opens the trial link without your app, or starts two trials in two tabsOnly one trial Gemmein offered opens a plan. Any other grants nothing, and Errors names itCancel that subscription in Stripe
You change or remove a plan's trialNew customers get the new offer. Trials already running keep theirsNothing
Development has given 25 trials todayCheckout hands out the paid link until the day rolls on. Live has no capNothing

Changing plan

If…What happensWhat you do
Your app calls g.subscriptions.manage() for someone who has never paid for a planIt answers no_subscription; there is nothing to manageShow the plans instead
Your app calls g.subscriptions.manage() and the app sells no plansIt answers no_plans. A plan removed while members still pay keeps their portal openNothing
The portal can't open: Stripe isn't connected here, or the key lacks Customer portal: Writeg.subscriptions.manage() answers portal_unavailable, with a message safe to show the member. In Development, ownerDetail says what to fix on PaymentsConnect Stripe, or add the row to the key in Stripe
Gemmein can't read the app's payments for a momentg.subscriptions.manage() answers portal_unavailable and nothing changesLet them try again
Stripe can't be reached when the portal opensg.subscriptions.manage() answers portal_unavailable and nothing changes. Nothing in your app needs fixingLet them try again shortly
A member opens the portal more than 10 times in 10 minutesIt answers portal_rate_limited. Development also allows an app 100 opens an hourLet them try again in a few minutes
A subscriber calls checkout for another plan or the same oneIt answers already_subscribed with the portal link, whether their subscription is active, trialing, past due, unpaid, paused or incomplete. No second subscription is startedSend them to the url it returns
The same person opens two checkouts for a plan at onceThe second answers checkout_in_progress for a few seconds. After 24 hours a checkout link only pays for the person it was made forNothing
Two subscriptions for one person go live anywayErrors shows "Duplicate subscription — cancel one in Stripe". Gemmein can't cancel in StripeCancel one in Stripe
A subscriber moves to a plan with more creditsThe new plan opens at once. Its extra credits arrive when the upgrade is paid. Each prorated line is priced on its own: the new plan's per-period credits × the share of the period the line covers, minus the same for the old plan, each line by its own discounts (tax excluded). A line in another currency than its plan grants nothing. A 99% coupon gives 1% of the credits, and several changes on one invoice each count once. If your portal bills prorations later, they come with that invoiceNothing
A subscriber moves to a plan with fewer credits, or the upgrade is refundedCredits are taken back at the same rate for the money returned, first from what the upgrade granted. A credit pack's own line is never touched, and the ledger records it as a plan changeNothing
A downgrade returns money for credits you already usedYour balance goes below zero until your next renewal or purchase. It can't be spent; the next renewal or pack pays it down firstNothing
A subscriber moves up, spends, and moves back down, again and againThe credits gained match the money kept. What they spent ahead stays a debtNothing
A subscriber switches during a trialThe trial ends and the new plan opens. A switch that charges nothing grants no extra creditsNothing
A renewal and a plan change arrive out of orderThe renewal grants the credits of the plan on its own invoice's subscription lineNothing

One-off purchases

Signed-out buyers, the purchase email and deleted accounts have their own sections: Buying signed out, The purchase email and A deleted account.

If…What happensWhat you do
A buyer pays by bank debitThe product is granted once the payment clears. A failed payment grants nothing, and Logs says so onceNothing
A checkout never clearsIt is closed after 30 days. A payment that still arrives is fulfilledNothing
A purchase is refunded in fullThe product's access and credits are taken back, the purchase reads refunded, and g.files.link refuses its file from the next requestNothing
The buyer downloaded the file before a full refundNo new download link is issued. A copy already on their device stays with them (see Limits)Nothing
A purchase is refunded in partAccess, credits and the file stay. The purchase reads part_refundedTo take access back, revoke it on the person's page
A credit pack is refunded in full after some credits were spentWhat is left of that purchase's credits is taken back, never below zeroNothing
A buyer who also subscribes is refunded for a productOnly what that purchase opened closes. The subscription's access staysNothing
A subscriber who bought products cancelsProducts bought outright stayNothing
A refund arrives before its paymentIt is applied when the payment lands: a full refund grants nothing, and a partial one grants the product and records the refundNothing
Stripe sends the same payment twiceThe product and its credits are granted onceNothing
The 14-day waiver is turned onEach one-off product (a file, a link, or access alone) gets a new Payment Link whose checkout requires the box; the old link goes off. Plans and credit packs are unchangedNothing
The 14-day waiver is turned on without termsUrlRefused with consent_terms_url_required. A link that isn't https, carries a username or password, or is over 500 characters is refused with invalid_consent. Nothing changesAdd your Terms of Service link as termsUrl
termsUrl changes while the waiver is onEach such product gets a new Payment Link whose box links the new terms; the old links go offNothing
A save would make more than 10 new Payment Links in a day in Development, or 50 in Live, for things already on saleRefused with development_capped (Live: links_capped). Nothing changes. A new price makes one link; the 14-day waiver turned on or off, or a new termsUrl, makes one per product it covers; promote counts the same. A product's first link never countsTry again the next day (UTC)
You change the 14-day waiver on the Payments page after your AI set itThe next npx gemmein sync shows a conflict and keeps your settingRun npx gemmein sync --overwrite to take the file's
The 14-day waiver is on when you go live or promoteThe Go live page notes that Live needs a Terms of Service link set in your Stripe live accountSet it in Stripe live mode first
A buyer pays on a link replaced days agoThe payment still resolves to its productNothing
A domain is verified, or the return path changes, while the 14-day waiver is onEach Payment Link is pointed at the new return in place. The box stays, no link is made again, and nothing counts against the daily capNothing
The 14-day waiver is turned on and Stripe has no Terms of Service linkRefused with stripe_terms_url_missing. Nothing changesAdd the link in Stripe under Settings → Business → Public details, then turn it on again
A buyer pays with the 14-day waiver onEvery Logs row of the purchase records consent: accepted, with the words the buyer tickedNothing
A buyer opened checkout on the old link before the waiver was turned onThey can still finish paying, without the box. The purchase is fulfilled, and its Logs rows carry no consentNothing
The 14-day waiver is turned offThe products get new links without the box. Purchases already made keep their recordNothing
A relay refunds a product with refund_productExactly what that purchase added is taken back. A purchase made through Stripe is refunded only in StripeRefund Stripe purchases in Stripe

Access

If…What happensWhat you do
A signed-out visitor opens a locked collectionThey are told to sign in, never which plan or product unlocks itNothing
A signed-in person without the plan or product opens itRefused until they hold one of the plans or products in Unlocked bySend them to checkout
You grant access by hand with an end dateIt opens at once and closes on its own at that date. A date already past is refusedNothing
Access was granted in DevelopmentIt never opens anything in LiveGrant it again in Live
Your dashboard or a secret key reads a locked collectionIt is not refused: the lock applies to customersNothing
Was this page helpful?

Last updated