Sådan tilføjer du abonnementer med Stripe: planer, prøveperioder, webhooks og mislykkede betalinger
For at tilføje abonnementer med Stripe skal du oprette et produkt med en tilbagevendende pris i Stripe Dashboard, sende kunderne til Stripe Checkout i abonnementstilstand fra din server, og lade en webhook fortælle din app, når hver betaling lykkes, fejler, ændrer sig eller ophører. Gem abonnementsstatus på brugeren, og giv adgang ud fra den — ikke ud fra succes-siden. Tilføj en knap Administrér fakturering, der åbner Stripes hostede kundeportal, så folk kan skifte kort, skifte plan og opsige uden at du bygger de skærme selv.
Denne guide bygger videre på sådan tilføjer du betalinger til din app, som dækker engangs-Checkout, testtilstand og going live. Her fokuserer vi på det, der er anderledes ved tilbagevendende fakturering. Stripe-detaljerne stammer fra Stripes dokumentation pr. september 2026.
Hvorfor abonnementer er sværere end engangsbetalinger
En engangsbetaling sker, mens kunden er i din app. Et abonnement fortsætter, efter de er gået: fornyelser hver måned, kort der udløber, opgraderinger midt i en periode, opsigelser der træder i kraft ved periodens udløb. Din app hører kun om disse gennem webhooks. De fleste abonnementsfejl skyldes, at man behandler den første betaling som hele historien.
Dine muligheder
| Tilgang | Hvad du bygger | Bedst til |
|---|---|---|
| Payment Link med en tilbagevendende pris | Intet andet end et link | Test af efterspørgsel; håndtering af adgang i hånden |
| Checkout (abonnementstilstand) + kundeportal | En serverrute, en webhook, en faktureringsknap | De fleste SaaS-apps og medlemskaber |
| Subscriptions API med din egen betalingsformular | Meget mere: betalings-UI, autentificering, genforsøg | Apps med usædvanlige faktureringsflows |
| Merchant-of-record-udbyder | Svarer til Checkout | Sælgere, der vil have udbyderen til at håndtere salgsmoms |
Til de fleste apps er Checkout plus portalen den rigtige afvejning. Sammenlign udbydere i Stripe vs. Paddle vs. Lemon Squeezy, hvis moms-håndtering bekymrer dig.
Planlæg din prissætning i Stripe først
I Stripe er et produkt det, du sælger ("Pro-plan"), og en pris er, hvordan du opkræver for det ("199 kr. pr. måned", "1.990 kr. pr. år"). Ét produkt kan have flere priser. Beslut:
- Hvilke niveauer du tilbyder, og hvad hvert niveau låser op i din app
- Månedligt, årligt eller begge
- Om du tilbyder en prøveperiode, og om den kræver et kort på forhånd
Opret produkter og priser i testtilstand, og behold deres pris-ID'er; din app henviser til dem. Hvis du ikke har fastlagt prissætningen endnu, så læs sådan prissætter du et SaaS-produkt og freemium vs. gratis prøveperiode.
Abonnements-livscyklussen du skal håndtere
Stripes oversigt over abonnementer viser de statusser, et abonnement kan have. De vigtigste for adgang:
| Status | Hvad den betyder | Giv adgang? |
|---|---|---|
trialing | I en prøveperiode | Ja |
active | I god stand | Ja |
incomplete | Første betaling er ikke gennemført endnu; Stripe giver kunden 23 timer | Nej |
incomplete_expired | Første betaling lykkedes aldrig | Nej |
past_due | Seneste betaling fejlede eller blev ikke forsøgt; genforsøg kan følge | Dit valg; mange apps tillader en kort karensperiode |
unpaid | Genforsøgene er slut, fakturaer forbliver åbne, ingen flere forsøg | Nej; Stripes dokumentation siger, at adgang skal tilbagekaldes |
canceled | Afsluttet; kan ikke genstartes | Nej |
paused | En prøveperiode sluttede uden betalingsmetode og blev sat på pause | Nej |
Gem status på din bruger- eller kontopost, og base adgangen på den. Opdatér den, hver gang en relevant webhook ankommer.
Webhook-hændelserne du skal håndtere
| Hændelse | Hvad din app gør |
|---|---|
checkout.session.completed | Knyt de nye Stripe-kunde- og abonnements-ID'er til din bruger |
invoice.paid | Markér abonnementet som aktivt og gem den nye periodes slutdato |
invoice.payment_failed | Fortæl brugeren, at kortet fejlede, og link til portalen |
invoice.payment_action_required | Bed brugeren fuldføre kortgodkendelse |
customer.subscription.updated | Opdatér plan, status og eventuel planlagt opsigelse |
customer.subscription.deleted | Fjern betalt adgang |
customer.subscription.trial_will_end | Påmind brugeren før prøveperioden slutter; Stripe sender den tre dage før |
Reglerne fra Stripes webhook-dokumentation gælder stadig: verificér signaturen med den rå body, returnér et 2xx hurtigt, håndtér dubletter og hændelser i uorden, og forvent gentagelser. Guiden hvad er en webhook forklarer ideen, og betalingsguiden lister reglerne i detaljer.
Trin for trin
- Opret produkter og priser i Stripes testtilstand.
- Tilføj hemmeligheder: den hemmelige nøgle, pris-ID'erne og senere webhook-signeringshemmeligheden. Læg dem aldrig i frontend-kode.
- Prissiden: hver plans knap kalder din server, som opretter en Checkout Session i abonnementstilstand for den indloggede bruger. Send dit bruger-ID med, så webhooken kan matche betalingen til kontoen.
- Webhook-endpoint: verificér signaturer og håndtér hændelserne ovenfor, og opdatér én abonnementspost pr. bruger.
- Lås funktioner bag den gemte status og plan, tjekket på serveren for hver beskyttet handling, ikke blot skjulte knapper.
- Kundeportal: konfigurér den i Stripe Dashboard (hvilke planer folk kan skifte til, og om de kan opsige), og tilføj derefter en knap Administrér fakturering, der opretter en portal-session på serveren og sender brugeren videre dertil.
- Mislykkede betalinger: vælg i Stripes faktureringsindstillinger, hvordan genforsøg fungerer, og hvad der sker efter det sidste forsøg. Vis et banner i appen, mens status er
past_due. - Test hele livscyklussen, udgiv derefter og registrér den live webhook.
Prompts til din AI-builder
Tilføj abonnementsbetaling med Stripe. Planer: Starter (pris-ID i STRIPE_PRICE_STARTER) og Pro (STRIPE_PRICE_PRO). Prissiden opretter en Checkout Session i abonnementstilstand på serveren med STRIPE_SECRET_KEY, med den indloggede brugers ID vedhæftet. Gem Stripe-kunde-ID, abonnements-ID, plan og status på brugeren. Eksponér aldrig den hemmelige nøgle over for browseren.
Tilføj POST /api/stripe/webhook. Verificér signaturen med STRIPE_WEBHOOK_SECRET ved hjælp af den rå request-body. Håndtér checkout.session.completed, invoice.paid, invoice.payment_failed, customer.subscription.updated, customer.subscription.deleted og customer.subscription.trial_will_end. Registrér behandlede hændelses-ID'er, så dubletter ignoreres. Opdatér brugerens status ud fra abonnementsobjektet, ikke ud fra den rækkefølge hændelserne ankommer i.
Lås Pro-funktioner på serveren: tillad dem kun, når status er active eller trialing, og planen er Pro. Vis et banner "betaling fejlede, opdatér dit kort", når status er past_due. Tilføj en knap Administrér fakturering, der åbner Stripes kundeportal for denne bruger.
Opgraderinger, nedgraderinger og proration
Når en kunde skifter plan, siger Stripes dokumentation, at ændringen ofte skaber en proration: den nye pris anvendes på resten af den aktuelle faktureringsperiode. Du kan forhåndsvise prorationer eller slå dem fra. Hvis planerne har samme interval, forbliver faktureringsdatoerne de samme; at skifte fra månedlig til årlig flytter faktureringsdatoen til dagen for skiftet. At lade kunderne skifte plan i portalen sparer dig for at skrive denne logik, men beslut i portalindstillingerne, hvilke skift der er tilladt.
Testtjekliste
Brug Stripes testtilstand og testkort, og gennemgå hver tilstand:
- Et nyt abonnement giver den rigtige plan til den rigtige bruger
- At lukke fanen lige efter betaling giver stadig adgang (beviser at webhooken virker)
- Et afvist kort ved tilmelding giver ingen adgang
- En mislykket fornyelse sætter kontoen i past_due og viser banneret
- At opdatere kortet i portalen genopretter status active
- Opgradering og nedgradering ændrer funktionerne korrekt
- Opsigelse ved periodens udløb beholder adgangen indtil slutdatoen og fjerner den derefter
- Prøvebrugere får adgang, får påmindelsen, og konverterer eller mister adgang korrekt
- At sende den samme webhook-hændelse to gange ændrer intet
Stripes testure lader dig simulere, at tiden går, så du kan teste fornyelser uden at vente en måned. Tjek Stripes aktuelle testdokumentation for, hvordan de bruges.
Almindelige fejl
- At give adgang på succes-siden. Kunder kan betale og aldrig nå den. Brug webhooken.
- Kun at håndtere den første betaling. Fornyelser, fejl og opsigelser kommer senere, som hændelser.
- At tjekke planstatus kun i frontenden. Alle kan kalde din API direkte.
- Én bruger, mange abonnementer ved en fejl. Tjek for et eksisterende abonnement, før du opretter en ny Checkout Session, eller send eksisterende kunder til portalen i stedet.
- At tilbagekalde adgang ved første mislykkede fornyelse. Kort fejler af kedelige grunde. En kort karensperiode med et tydeligt banner beholder kunderne.
- At glemme den live webhook. Test- og live-endpoints har forskellige signeringshemmeligheder.
- At ignorere moms og refusioner. Beslut din refusionspolitik og tjek dine skatteforpligtelser med en revisor før lancering.
Abonnementer på Mythex
Apps du bygger på Mythex bruger din egen Stripe-konto og dine egne nøgler; der findes ingen Stripe-forbindelse med ét klik til din app. Tilføj dine test-nøgler og pris-ID'er som projekthemmeligheder, brug prompts som ovenfor, og test med Stripes testkort i Preview. Webhooks kræver din apps offentlige URL, så udgiv, før du registrerer endpointet i Stripe, og udgiv igen, efter du har skiftet til live-nøgler, så den live app henter dem. Se Accepter betalinger med Stripe og Håndtér webhooks i din backend. For det bredere produkt dækker sådan bygger du en SaaS MVP, hvad der skal bygges omkring faktureringen.
Spørgsmål
Hvad er den enkleste måde at tilføje abonnementer med Stripe?
Opret et produkt med en tilbagevendende pris i Stripe Dashboard, send kunderne til Stripe Checkout i abonnementstilstand, håndtér abonnementshændelser med en webhook, og knyt en knap Administrér fakturering til Stripes hostede kundeportal. Så slipper du for selv at bygge kortformularer og skærme til planskift.
Hvilke Stripe-webhook-hændelser har jeg brug for til abonnementer?
Mindst checkout.session.completed for at knytte det nye abonnement til din bruger, invoice.paid for at bekræfte hver succesfuld betaling, invoice.payment_failed for at advare om mislykkede fornyelser, og customer.subscription.updated og customer.subscription.deleted for at følge planskift og opsigelser.
Hvad sker der, når en abonnementsbetaling fejler?
Ifølge Stripes dokumentation pr. september 2026 bliver abonnementet typisk past_due, og Stripe kan forsøge betalingen igen ud fra dine indstillinger. Efter det sidste forsøg afgør dine indstillinger i Dashboard, om det annulleres, markeres som unpaid, eller forbliver past_due.
Kan jeg tilbyde en gratis prøveperiode uden at bede om et kort?
Ja. Stripe understøtter gratis prøveperioder, og dokumentationen beskriver en paused-status for prøveperioder, der slutter uden betalingsmetode, når det er sat op sådan. At indsamle et kort på forhånd giver normalt færre tilmeldinger, men flere betalende kunder; test hvad der passer til dit produkt.