Comment ajouter des abonnements avec Stripe : formules, essais, webhooks et paiements échoués
Pour ajouter des abonnements avec Stripe, créez un produit avec un prix récurrent dans le tableau de bord Stripe, envoyez vos clients vers Stripe Checkout en mode abonnement depuis votre serveur, et laissez un webhook informer votre application lorsque chaque paiement réussit, échoue, change ou prend fin. Enregistrez le statut de l'abonnement par utilisateur et accordez l'accès en fonction de ce statut, et non à partir de la page de succès. Ajoutez un bouton Gérer la facturation qui ouvre le portail client hébergé par Stripe : les personnes peuvent ainsi changer de carte, changer de formule et résilier sans que vous ayez à créer ces écrans.
Ce guide s'appuie sur comment ajouter des paiements à votre application, qui couvre le Checkout à paiement unique, le mode test et la mise en production. Ici, nous nous concentrons sur ce qui change avec la facturation récurrente. Les détails sur Stripe proviennent de la documentation de Stripe en septembre 2026.
Pourquoi les abonnements sont plus complexes qu'un paiement unique
Un paiement unique a lieu pendant que le client est dans votre application. Un abonnement continue après son départ : renouvellements chaque mois, cartes qui expirent, changements de formule en cours de période, résiliations qui prennent effet à la fin de la période. Votre application n'en est informée que par les webhooks. La plupart des bogues d'abonnement viennent de la croyance que le premier paiement est toute l'histoire.
Vos options
| Approche | Ce que vous créez | Idéal pour |
|---|---|---|
| Payment Link avec un prix récurrent | Rien d'autre qu'un lien | Tester la demande ; gérer l'accès à la main |
| Checkout (mode abonnement) + portail client | Une route serveur, un webhook, un bouton de facturation | La plupart des applications SaaS et adhésions |
| API d'abonnements avec votre propre formulaire de paiement | Beaucoup plus : interface de paiement, authentification, relances | Applications aux flux de facturation particuliers |
| Prestataire de type marchand officiel | Proche de Checkout | Vendeurs qui veulent que le prestataire gère la TVA |
Pour la plupart des applications, Checkout avec le portail est le bon compromis. Comparez les prestataires dans Stripe vs Paddle vs Lemon Squeezy si la gestion de la TVA vous inquiète.
Préparez d'abord vos tarifs dans Stripe
Dans Stripe, un produit est ce que vous vendez (« formule Pro ») et un prix est la façon dont vous le facturez (« 20 $ par mois », « 200 $ par an »). Un même produit peut avoir plusieurs prix. Décidez :
- Quelles formules vous proposez et ce que chacune débloque dans votre application
- Mensuel, annuel, ou les deux
- Si vous proposez un essai, et s'il nécessite une carte dès le départ
Créez les produits et les prix en mode test, et conservez leurs identifiants de prix : votre application s'y réfère. Si vous n'avez pas encore arrêté vos tarifs, lisez comment fixer le prix d'un produit SaaS et freemium ou essai gratuit.
Le cycle de vie d'un abonnement à gérer
La présentation des abonnements dans Stripe énumère les statuts possibles d'un abonnement. Ceux qui comptent le plus pour l'accès :
| Statut | Signification | Accorder l'accès ? |
|---|---|---|
trialing | En période d'essai | Oui |
active | À jour de paiement | Oui |
incomplete | Premier paiement pas encore finalisé ; Stripe accorde au client 23 heures | Non |
incomplete_expired | Le premier paiement n'a jamais abouti | Non |
past_due | Le dernier paiement a échoué ou n'a pas été tenté ; des relances peuvent suivre | À votre choix ; beaucoup d'applications accordent un court délai de grâce |
unpaid | Les relances sont terminées, les factures restent ouvertes, aucune nouvelle tentative | Non ; la documentation de Stripe recommande de retirer l'accès |
canceled | Terminé ; ne peut pas être relancé | Non |
paused | Un essai s'est terminé sans moyen de paiement et a été configuré pour se mettre en pause | Non |
Enregistrez le statut sur la fiche de votre utilisateur ou de votre compte, et fondez l'accès dessus. Mettez-le à jour à chaque arrivée d'un webhook pertinent.
Les événements de webhook à gérer
| Événement | Ce que fait votre application |
|---|---|
checkout.session.completed | Relier les nouveaux identifiants client et abonnement Stripe à votre utilisateur |
invoice.paid | Passer l'abonnement en actif et enregistrer la nouvelle fin de période |
invoice.payment_failed | Informer l'utilisateur que sa carte a échoué et lui proposer le portail |
invoice.payment_action_required | Demander à l'utilisateur de finaliser l'authentification de sa carte |
customer.subscription.updated | Mettre à jour la formule, le statut et toute résiliation programmée |
customer.subscription.deleted | Retirer l'accès payant |
customer.subscription.trial_will_end | Rappeler à l'utilisateur la fin de son essai ; Stripe l'envoie trois jours avant |
Les règles de gestion des webhooks de la documentation de Stripe s'appliquent toujours : vérifiez la signature à partir du corps brut, renvoyez rapidement une réponse 2xx, gérez les événements en double ou hors d'ordre, et prévoyez les nouvelles tentatives. Le guide qu'est-ce qu'un webhook explique l'idée, et le guide des paiements détaille les règles.
Étape par étape
- Créez les produits et les prix dans le mode test de Stripe.
- Ajoutez les secrets : la clé secrète, les identifiants de prix, et plus tard la clé de signature du webhook. Ne les placez jamais dans le code frontend.
- Page de tarifs : le bouton de chaque formule appelle votre serveur, qui crée une session Checkout en mode abonnement pour l'utilisateur connecté. Transmettez l'identifiant de votre utilisateur pour que le webhook puisse relier le paiement au compte.
- Point de terminaison du webhook : vérifiez les signatures et gérez les événements ci-dessus, en mettant à jour un seul enregistrement d'abonnement par utilisateur.
- Conditionnez les fonctionnalités au statut et à la formule enregistrés, vérifiés côté serveur pour chaque action protégée, et pas seulement avec des boutons masqués.
- Portail client : configurez-le dans le tableau de bord Stripe (vers quelles formules les clients peuvent passer, s'ils peuvent résilier), puis ajoutez un bouton Gérer la facturation qui crée une session de portail côté serveur et y redirige.
- Paiements échoués : dans les paramètres de facturation de Stripe, choisissez le comportement des relances et ce qui se passe après la dernière. Affichez une bannière dans l'application lorsque le statut est
past_due. - Testez tout le cycle de vie, puis publiez et enregistrez le webhook de production.
Requêtes à donner à votre créateur d'applications par IA
Ajoute la facturation par abonnement avec Stripe. Formules : Starter (identifiant de prix dans STRIPE_PRICE_STARTER) et Pro (STRIPE_PRICE_PRO). La page de tarifs crée une session Checkout en mode abonnement côté serveur avec STRIPE_SECRET_KEY, en y joignant l'identifiant de l'utilisateur connecté. Enregistre sur l'utilisateur l'identifiant client Stripe, l'identifiant d'abonnement, la formule et le statut. Ne révèle jamais la clé secrète au navigateur.
Ajoute POST /api/stripe/webhook. Vérifie la signature avec STRIPE_WEBHOOK_SECRET à partir du corps brut de la requête. Gère checkout.session.completed, invoice.paid, invoice.payment_failed, customer.subscription.updated, customer.subscription.deleted et customer.subscription.trial_will_end. Enregistre les identifiants d'événements traités pour ignorer les doublons. Mets à jour le statut de l'utilisateur à partir de l'objet d'abonnement, et non de l'ordre d'arrivée des événements.
Conditionne les fonctionnalités Pro côté serveur : autorise-les uniquement lorsque le statut est active ou trialing et que la formule est Pro. Affiche une bannière « Paiement échoué, mettez à jour votre carte » lorsque le statut est past_due. Ajoute un bouton Gérer la facturation qui ouvre le portail client Stripe pour cet utilisateur.
Changements de formule, déclassements et prorata
Lorsqu'un client change de formule, la documentation de Stripe indique que le changement crée souvent un prorata : le nouveau prix s'applique au reste de la période de facturation en cours. Vous pouvez prévisualiser les prorata ou les désactiver. Si les formules ont le même intervalle, les dates de facturation restent identiques ; passer du mensuel à l'annuel déplace la date de facturation au jour du changement. Laisser les clients changer de formule dans le portail vous évite d'écrire cette logique, mais décidez dans les paramètres du portail quels changements sont autorisés.
Liste de contrôle des tests
Utilisez le mode test de Stripe et les cartes de test, et parcourez chaque état :
- Un nouvel abonnement accorde la bonne formule au bon utilisateur
- Fermer l'onglet juste après le paiement donne quand même accès (cela prouve que le webhook fonctionne)
- Une carte refusée à l'inscription n'accorde rien
- Un renouvellement échoué place le compte en
past_dueet affiche la bannière - Mettre à jour la carte dans le portail rétablit le statut actif
- Passer à une formule supérieure ou inférieure modifie correctement les fonctionnalités
- Une résiliation en fin de période maintient l'accès jusqu'à la date de fin, puis le retire
- Les utilisateurs en essai ont accès, reçoivent le rappel, et se convertissent ou perdent l'accès correctement
- Envoyer deux fois le même événement de webhook ne change rien
Les horloges de test de Stripe permettent de simuler le passage du temps, ce qui vous évite d'attendre un mois pour tester les renouvellements. Consultez la documentation de test actuelle de Stripe pour savoir comment les utiliser.
Erreurs courantes
- Accorder l'accès sur la page de succès. Les clients peuvent payer sans jamais l'atteindre. Utilisez le webhook.
- Ne gérer que le premier paiement. Les renouvellements, échecs et résiliations arrivent plus tard, sous forme d'événements.
- Vérifier le statut de la formule uniquement dans le frontend. N'importe qui peut appeler directement votre API.
- Un utilisateur avec plusieurs abonnements par accident. Vérifiez l'existence d'un abonnement avant de créer une nouvelle session Checkout, ou envoyez plutôt les clients existants vers le portail.
- Retirer l'accès dès le premier renouvellement échoué. Les cartes échouent pour des raisons banales. Un court délai de grâce avec une bannière claire retient les clients.
- Oublier le webhook de production. Les points de terminaison de test et de production ont des clés de signature différentes.
- Ignorer la TVA et les remboursements. Définissez votre politique de remboursement et vérifiez vos obligations fiscales avec un expert-comptable avant le lancement.
Les abonnements sur Mythex
Les applications créées sur Mythex utilisent votre propre compte Stripe et vos propres clés ; il n'existe pas de connexion Stripe en un clic pour votre application. Ajoutez vos clés de test et identifiants de prix comme secrets du projet, utilisez des requêtes semblables à celles ci-dessus, et testez avec les cartes de test de Stripe dans l'aperçu. Les webhooks ont besoin de l'URL publique de votre application : publiez donc avant d'enregistrer le point de terminaison dans Stripe, puis republiez après le passage aux clés de production pour que l'application en production les prenne en compte. Voir Accepter les paiements avec Stripe et Gérer les webhooks dans votre backend. Pour l'ensemble du produit, comment créer un MVP SaaS explique ce qu'il faut construire autour de la facturation.
Questions
Quelle est la façon la plus simple d'ajouter des abonnements avec Stripe ?
Créez un produit avec un prix récurrent dans le tableau de bord Stripe, envoyez vos clients vers Stripe Checkout en mode abonnement, gérez les événements d'abonnement avec un webhook, et reliez un bouton « Gérer la facturation » au portail client hébergé par Stripe. Vous évitez ainsi de créer vous-même les formulaires de carte et les écrans de changement de formule.
Quels événements de webhook Stripe faut-il pour les abonnements ?
Au minimum checkout.session.completed pour relier le nouvel abonnement à votre utilisateur, invoice.paid pour confirmer chaque paiement réussi, invoice.payment_failed pour signaler les renouvellements échoués, et customer.subscription.updated et customer.subscription.deleted pour suivre les changements de formule et les résiliations.
Que se passe-t-il lorsqu'un paiement d'abonnement échoue ?
Selon la documentation de Stripe en septembre 2026, l'abonnement passe en général au statut past_due, et Stripe peut réessayer le paiement selon vos paramètres. Après la dernière tentative, les paramètres de votre tableau de bord déterminent s'il est annulé, marqué comme impayé ou laissé en past_due.
Puis-je proposer un essai gratuit sans demander de carte ?
Oui. Stripe prend en charge les essais gratuits, et sa documentation décrit un statut paused pour les essais qui se terminent sans moyen de paiement, lorsque cela est configuré ainsi. Demander une carte dès le départ signifie en général moins d'inscriptions mais plus de clients payants ; testez ce qui convient à votre produit.