Comment ajouter des abonnements avec Stripe : forfaits, essais, webhooks et paiements refusés
Pour ajouter des abonnements avec Stripe, créez un produit avec un prix récurrent dans le tableau de bord de Stripe, envoyez les clients vers Stripe Checkout en mode abonnement depuis votre serveur, et laissez un webhook indiquer à votre app quand chaque paiement réussit, échoue, change ou prend fin. Enregistrez l'état de l'abonnement pour l'utilisateur et accordez l'accès en fonction de cet état, et non à partir de la page de confirmation. Ajoutez un bouton Gérer la facturation qui ouvre le portail client hébergé de Stripe, afin que les gens puissent changer de carte, changer de forfait et résilier sans que vous ayez à créer ces écrans.
Ce guide s'appuie sur comment ajouter des paiements à votre app, qui couvre Checkout ponctuel, 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 date de septembre 2026.
Pourquoi les abonnements sont plus complexes que les paiements uniques
Un paiement unique a lieu pendant que le client est dans votre app. Un abonnement continue après son départ : renouvellements chaque mois, cartes qui expirent, changements de forfait en cours de cycle, résiliations qui prennent effet à la fin de la période. Votre app n'apprend ces événements que par les webhooks. La plupart des bogues d'abonnement viennent du fait qu'on considère le premier paiement comme toute l'histoire.
Vos options
| Approche | Ce que vous construisez | Idéal pour |
|---|---|---|
| Lien de paiement avec un prix récurrent | Rien d'autre qu'un lien | Tester la demande; gérer les accès à la main |
| Checkout (mode abonnement) + portail client | Une route serveur, un webhook, un bouton de facturation | La plupart des apps SaaS et des adhésions |
| API d'abonnements avec votre propre formulaire de paiement | Beaucoup plus : interface de paiement, authentification, nouvelles tentatives | Apps avec des flux de facturation inhabituels |
| Fournisseur de type marchand enregistré | Similaire à Checkout | Vendeurs qui veulent que le fournisseur gère la taxe de vente |
Pour la plupart des apps, Checkout plus le portail est le bon compromis. Comparez les fournisseurs dans Stripe, Paddle et Lemon Squeezy si la gestion de la taxe vous préoccupe.
Planifiez d'abord vos prix dans Stripe
Dans Stripe, un produit est ce que vous vendez (« forfait Pro ») et un prix est la façon dont vous le facturez (« 20 $ par mois », « 200 $ par année »). Un produit peut avoir plusieurs prix. Décidez :
- Quels niveaux vous offrez et ce que chacun débloque dans votre app
- Mensuel, annuel, ou les deux
- Si vous offrez un essai, et s'il exige une carte dès le départ
Créez les produits et les prix en mode test, et conservez leurs identifiants de prix : votre app s'y réfère. Si vous n'avez pas encore arrêté votre tarification, lisez comment fixer le prix d'un produit SaaS et freemium ou essai gratuit.
Le cycle de vie d'un abonnement que vous devez gérer
La présentation des abonnements de Stripe énumère les statuts possibles. Ceux qui comptent le plus pour l'accès :
| Statut | Signification | Accorder l'accès? |
|---|---|---|
trialing | En période d'essai | Oui |
active | En règle | Oui |
incomplete | Premier paiement pas encore complété; Stripe accorde 23 heures au client | Non |
incomplete_expired | Le premier paiement n'a jamais réussi | Non |
past_due | Le dernier paiement a échoué ou n'a pas été tenté; de nouvelles tentatives peuvent suivre | À votre choix; beaucoup d'apps accordent une courte période de grâce |
unpaid | Les tentatives sont terminées, les factures restent ouvertes, aucune nouvelle tentative | Non; la documentation de Stripe indique de révoquer l'accès |
canceled | Terminé; ne peut pas être relancé | Non |
paused | Un essai s'est terminé sans mode de paiement et a été configuré pour se mettre en pause | Non |
Enregistrez le statut dans votre enregistrement utilisateur ou de compte et fondez l'accès dessus. Mettez-le à jour chaque fois qu'un webhook pertinent arrive.
Les événements webhook à gérer
| Événement | Ce que fait votre app |
|---|---|
checkout.session.completed | Relier les nouveaux identifiants de client et d'abonnement Stripe à votre utilisateur |
invoice.paid | Marquer l'abonnement comme actif et enregistrer la nouvelle fin de période |
invoice.payment_failed | Informer l'utilisateur que sa carte a été refusée et proposer le lien vers le portail |
invoice.payment_action_required | Demander à l'utilisateur de compléter l'authentification de sa carte |
customer.subscription.updated | Mettre à jour le forfait, le statut et toute résiliation planifié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 gestionnaire des documents sur les webhooks 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 et hors ordre, et prévoyez les nouvelles tentatives. Le guide qu'est-ce qu'un webhook explique l'idée, et le guide sur les paiements énumère les règles en détail.
Étape par étape
- Créez les produits et les prix en mode test de Stripe.
- Ajoutez les secrets : la clé secrète, les identifiants de prix, et plus tard le secret de signature du webhook. Ne les placez jamais dans le code du frontend.
- Page de tarification : le bouton de chaque forfait 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 associer le paiement au compte.
- Point de terminaison webhook : vérifiez les signatures et gérez les événements ci-dessus, en mettant à jour un enregistrement d'abonnement par utilisateur.
- Limitez les fonctionnalités selon le statut et le forfait enregistrés, vérifiés sur le serveur pour chaque action protégée, et non seulement avec des boutons masqués.
- Portail client : configurez-le dans le tableau de bord de Stripe (quels forfaits les gens peuvent choisir, s'ils peuvent résilier), puis ajoutez un bouton Gérer la facturation qui crée une session du portail sur le serveur et redirige vers celui-ci.
- Paiements refusés : dans les paramètres de facturation de Stripe, choisissez le comportement des nouvelles tentatives et ce qui se passe après la dernière. Affichez une bannière dans l'app lorsque le statut est
past_due. - Testez tout le cycle de vie, puis publiez et enregistrez le webhook de production.
Invites à donner à votre outil de création par IA
Ajoute la facturation par abonnement avec Stripe. Forfaits : Starter (identifiant de prix dans STRIPE_PRICE_STARTER) et Pro (STRIPE_PRICE_PRO). La page de tarification 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 l'identifiant du client Stripe, l'identifiant de l'abonnement, le forfait et le statut sur l'utilisateur. N'expose 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 selon l'ordre d'arrivée des événements.
Limite les fonctionnalités Pro côté serveur : ne les autorise que lorsque le statut est active ou trialing et que le forfait est Pro. Affiche une bannière « Paiement refusé, 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.
Mises à niveau, rétrogradations et calcul au prorata
Lorsqu'un client change de forfait, la documentation de Stripe indique que le changement crée souvent un calcul au prorata : le nouveau prix s'applique au reste de la période de facturation en cours. Vous pouvez prévisualiser ces calculs ou les désactiver. Si les forfaits ont le même intervalle, les dates de facturation restent les mêmes; passer du mensuel à l'annuel déplace la date de facturation au jour du changement. Permettre aux clients de changer de forfait 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 statut :
- Un nouvel abonnement accorde le bon forfait 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 lors de l'inscription n'accorde rien
- Un renouvellement en échec place le compte en
past_dueet affiche la bannière - Mettre à jour la carte dans le portail rétablit le statut
active - Les mises à niveau et les rétrogradations modifient correctement les fonctionnalités
- Une résiliation à la fin de la 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 webhook ne change rien
Les horloges de test de Stripe permettent de simuler le passage du temps, afin de tester les renouvellements sans attendre un mois. Consultez la documentation de test actuelle de Stripe pour savoir comment les utiliser.
Erreurs courantes
- Accorder l'accès sur la page de confirmation. Les clients peuvent payer sans jamais l'atteindre. Utilisez le webhook.
- Ne gérer que le premier paiement. Les renouvellements, les échecs et les résiliations arrivent plus tard, sous forme d'événements.
- Vérifier le statut du forfait uniquement dans le frontend. N'importe qui peut appeler directement votre API.
- Un utilisateur, 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.
- Révoquer l'accès dès le premier renouvellement refusé. Les cartes échouent pour des raisons banales. Une courte période de grâce accompagnée d'une bannière claire garde les clients.
- Oublier le webhook de production. Les points de terminaison de test et de production ont des secrets de signature différents.
- Ignorer la taxe et les remboursements. Définissez votre politique de remboursement et vérifiez vos obligations fiscales avec un comptable avant le lancement.
Les abonnements dans Mythex
Les apps que vous créez sur Mythex utilisent votre propre compte Stripe et vos propres clés; il n'existe pas de connexion Stripe en un clic pour votre app. Ajoutez vos clés de test et vos 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 nécessitent l'URL publique de votre app : publiez donc avant d'enregistrer le point de terminaison dans Stripe, et publiez de nouveau après être passé aux clés de production pour que l'app en production les prenne en compte. Consultez Accepter des 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 bâtir autour de la facturation.
Questions
Quel est le moyen le plus simple d'ajouter des abonnements avec Stripe?
Créez un produit avec un prix récurrent dans le tableau de bord de Stripe, envoyez les 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é de Stripe. Vous évitez ainsi de créer vous-même des formulaires de carte et des écrans de changement de forfait.
Quels événements webhook Stripe dois-je gérer 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 refusés, et customer.subscription.updated ainsi que customer.subscription.deleted pour suivre les changements de forfait et les résiliations.
Que se passe-t-il lorsqu'un paiement d'abonnement échoue?
Selon la documentation de Stripe en date de septembre 2026, l'abonnement passe en général à past_due, et Stripe peut réessayer le paiement selon vos paramètres. Après la dernière tentative, les réglages de votre tableau de bord déterminent s'il est annulé, marqué comme impayé ou laissé en past_due.
Puis-je offrir 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 mode de paiement, si cette option est configurée. Demander une carte dès le départ signifie en général moins d'inscriptions, mais davantage de clients payants; testez ce qui convient à votre produit.