Stripe
Ce que ça fait
Stripe alimente DURUM.ai de deux façons complémentaires :
- Import initial par clé API : au moment où vous connectez votre clé, DURUM.ai lit les 90 derniers jours de votre compte Stripe (paiements réussis, remboursements, abonnements) pour que vos tableaux ne partent pas de zéro.
- Webhooks signés en temps réel : chaque paiement, remboursement ou litige est ensuite reçu à la seconde, à condition que la signature Stripe soit vérifiée avec le secret de la destination.
| Événement Stripe | Type dans DURUM.ai | Quand ça se déclenche |
|---|---|---|
payment_intent.succeeded, charge.succeeded | Paiement | Un paiement est encaissé (les deux formes d'un même paiement ne comptent qu'une fois) |
invoice.paid | Paiement | Une facture Stripe est payée (Stripe Invoicing) |
charge.refunded | Remboursement (montant négatif) | Un remboursement est émis |
charge.dispute.created, charge.dispute.updated, charge.dispute.closed | Litige | Un client conteste un paiement |
checkout.session.completed | Vente | Un client complète un achat via Stripe Checkout (destination optionnelle) |
Ce qui a changé le 14 septembre 2026
Les secrets de signature ne sont plus configurés par votre gestionnaire de compte. Vous les saisissez vous-même dans Paramètres → Intégrations → Stripe → Configuration. Sans secret, la signature ne peut pas être vérifiée et les paiements sont refusés (réponse 401).
Le plus rapide : Continuer avec Stripe
Aucune clé API, aucun webhook, aucun secret à copier. DURUM.ai se connecte par l'app DURUM.ai officielle du Stripe App Marketplace.
- Dans DURUM.ai, ouvrez Paramètres → Intégrations → carte Stripe → Connecter.
- Dans la fenêtre Connecter Stripe, cliquez Continuer avec Stripe.
- Sur l'écran Stripe, choisissez votre compte Stripe, vérifiez les accès (tous en lecture seule : compte, paiements et remboursements, litiges, événements, intentions de paiement) et cliquez Installer.
- Vous revenez dans DURUM.ai : la carte Stripe affiche Connecté. Les nouveaux paiements, remboursements et litiges arrivent en quelques secondes.
| Événement Stripe | Type dans DURUM.ai |
|---|---|
payment_intent.succeeded, charge.succeeded | Paiement (les deux formes d'un même paiement comptent une fois) |
charge.refunded | Remboursement |
charge.dispute.created, charge.dispute.updated, charge.dispute.closed | Litige |
Bon à savoir
- Lecture seule : DURUM.ai ne peut jamais créer, modifier ni rembourser un paiement dans votre compte Stripe.
- Un compte Stripe par compte DURUM.ai. Un compte Stripe déjà branché à un autre compte DURUM.ai est refusé.
- Déjà branché par clé API ? Rien ne change, votre installation actuelle continue de fonctionner. L'app sert aux nouvelles connexions.
- L'import des 90 derniers jours n'est pas encore offert avec l'app. Besoin de l'historique ? Utilisez la méthode par clé API ci-dessous.
- Pour débrancher : dans Stripe, Paramètres → Applications installées → DURUM.ai → Désinstaller. DURUM.ai cesse de recevoir les événements en une seconde.
Vous ne voyez pas Continuer avec Stripe ? Utilisez la méthode par clé API ci-dessous : le résultat est le même.
Avant de commencer
- Un accès au Dashboard Stripe avec le menu Developers (clés API et webhooks).
- Un accès à DURUM.ai avec le droit de modifier les intégrations (Paramètres → Intégrations).
- Votre Business ID : il est affiché dans Paramètres → Intégrations, section Pour votre développeur, et déjà inséré dans les URLs de webhook qui s'y trouvent.
Connexion étape par étape
Étape 1 : connectez votre clé API (import des 90 derniers jours)
- Dans DURUM.ai, ouvrez Paramètres → Intégrations → carte Stripe → Connecter.
- Dans le Dashboard Stripe : Developers → API keys → Create restricted key.
- Nommez la clé (par exemple « DURUM.ai »).
- Activez en Read : Charges, Customers, Refunds, Subscriptions, Invoices. Laissez tout le reste à None.
- Cliquez Create key, copiez-la et collez-la dans le champ Clé API Stripe.
- Cliquez Connecter. DURUM.ai valide la clé auprès de Stripe, l'enregistre chiffrée, puis lance l'import des 90 derniers jours.
Formats acceptés : une clé restreinte rk_live_… (recommandée) ou une clé secrète sk_live_…. Les clés de test (rk_test_…, sk_test_…) sont acceptées aussi.
Vous pouvez coller les secrets dès cette étape
La fenêtre de connexion contient une section Webhook Signing Secrets (optionnel) avec trois champs (Payment, Sale, Refund). Si vous avez déjà créé vos destinations dans Stripe, collez-y les secrets ; sinon, faites-le à l'étape 3. Une reconnexion de la clé ne supprime jamais les secrets déjà enregistrés.
Étape 2 : créez vos destinations webhook dans Stripe
Dans le Dashboard Stripe : Developers → Webhooks → Add destination (ou Add endpoint selon la version de l'interface). Créez une destination par ligne ci-dessous. Remplacez VOTRE_BUSINESS_ID par votre Business ID.
Destination 1 : Paiements (obligatoire)
https://app.durum.ai/api/webhook/payment?bid=VOTRE_BUSINESS_IDÉvénements à cocher : payment_intent.succeeded et charge.succeeded. Si vos clients paient des factures Stripe, ajoutez invoice.paid. Tout autre événement envoyé à cette URL est ignoré (réponse 200, statut « ignoré » dans les Logs).
Destination 2 : Remboursements (obligatoire)
https://app.durum.ai/api/webhook/refund?bid=VOTRE_BUSINESS_IDÉvénements à cocher : charge.refunded, charge.dispute.created, charge.dispute.updated, charge.dispute.closed.
Destination 3 : Ventes (optionnelle)
https://app.durum.ai/api/webhook/sale?bid=VOTRE_BUSINESS_IDÉvénement à cocher : checkout.session.completed. Créez cette destination seulement si vous vendez par Stripe Checkout et voulez qu'une session complétée compte comme une vente (en plus du paiement encaissé, reçu par la destination 1).
Le Business ID doit être dans chaque URL
C'est lui qui indique à DURUM.ai quel secret de signature utiliser. Une URL sans bid= ne peut pas être vérifiée avec vos secrets : l'événement est refusé.
Étape 3 : collez les secrets de signature dans DURUM.ai
- Dans Stripe, ouvrez chaque destination créée : le Signing secret commence par
whsec_. Cliquez Reveal et copiez-le. - Dans DURUM.ai : Paramètres → Intégrations → Stripe → Configuration → section Secrets de signature des webhooks.
- Trois champs : Paiements, Remboursements, Ventes (optionnel). Collez dans chaque champ le secret de sa destination.
- Cliquez Enregistrer les secrets.
Ce que vous voyez ensuite : « Enregistré » ou « Non enregistré » à côté de chaque champ. Le secret lui-même n'est jamais réaffiché. Pour remplacer un secret, collez le nouveau ; un champ laissé vide conserve le secret actuel.
Chaque champ reçoit le secret de SA destination
Le secret de la destination Paiements collé dans le champ Remboursements ne permet pas de vérifier les remboursements : ils seront refusés. Vérifiez la correspondance URL ↔ champ avant d'enregistrer.
Vérifier que ça marche
- Dans Stripe, ouvrez la destination Paiements → Send test event → choisissez
payment_intent.succeeded→ envoyez. - La réponse doit être
200. Une réponse401 Invalid signaturesignifie que le secret de ce type est absent ou ne correspond pas à cette destination. - Dans DURUM.ai, ouvrez la page Logs (menu principal) : l'événement apparaît avec la source
stripeet son statut (traité, ignoré, dédoublonné). - Répétez avec la destination Remboursements (
charge.refunded).
Événements captés
| Destination | Événements Stripe acceptés | Résultat dans DURUM.ai |
|---|---|---|
/api/webhook/payment | payment_intent.succeeded, charge.succeeded, invoice.paid, charge.refunded | Paiement (montant, courriel, nom, téléphone, produit) ; charge.refunded y est aussi accepté comme remboursement |
/api/webhook/refund | charge.refunded, charge.dispute.* | Remboursement (montant négatif) ou litige |
/api/webhook/sale | checkout.session.completed | Vente (montant total de la session) |
| Import initial (clé API) | Charges réussies, remboursements, abonnements créés ou annulés sur 90 jours | Ventes, remboursements, abonnements historiques, dédoublonnés par identifiant Stripe |
Détails utiles :
- Pas de double comptage :
payment_intent.succeededetcharge.succeededd'un même paiement sont rattachés au même Payment Intent et ne comptent qu'une fois. Une transaction iClosed dont la source est Stripe est ignorée si votre intégration Stripe est active. - Attribution : DURUM.ai rattache le paiement au lead par courriel et par téléphone. Si vous créez vos sessions Checkout côté serveur, vous pouvez ajouter dans
metadatales champsclient_key,product_key,visitor_id,fbclid,gclid,fbpetutm_*: ils survivent même si l'acheteur paie avec une autre adresse courriel. - Types activables : dans Configuration, la liste des événements actifs permet d'exclure un type (Ventes, Paiements, Remboursements, Abonnements) sans toucher à Stripe.
Dépannage
| Problème | Cause probable | Solution |
|---|---|---|
Réponse 401 Invalid signature dans Stripe | Secret absent, ou collé dans le mauvais champ, ou URL sans bid= | Ouvrez la destination dans Stripe, copiez son Signing secret, collez-le dans le champ correspondant de Configuration, vérifiez l'URL |
Réponse 200 mais rien dans DURUM.ai | Type d'événement non écouté par cette URL | Vérifiez les événements cochés (par exemple invoice.paid, pas invoice.created) ; statut « ignoré » dans les Logs |
| Message « Stripe n'est pas connecté pour ce client » à l'enregistrement des secrets | La clé API n'a pas encore été connectée | Faites l'étape 1 d'abord |
| Message « Secret invalide » | Le secret ne commence pas par whsec_ ou contient un espace | Recopiez-le depuis Stripe |
| Destination désactivée dans Stripe | Trop d'erreurs consécutives (souvent des 401) | Corrigez le secret, puis réactivez la destination dans Developers → Webhooks |
Erreur 429 | Trop de requêtes simultanées | Stripe réessaie automatiquement |
| Erreur « Permissions insuffisantes » à la connexion de la clé | La clé restreinte ne lit pas Charges, Customers, Refunds, Subscriptions, Invoices | Modifiez la clé dans Stripe et reconnectez |
FAQ
Est-ce que je dois configurer un secret de signature ?
Oui. Depuis le 14 septembre 2026, un webhook Stripe sans signature vérifiable est refusé. Vous saisissez vous-même les secrets dans Configuration ; personne d'autre n'a à les manipuler.
Pourquoi deux destinations obligatoires et une optionnelle ?
Chaque destination a son propre secret et sa propre liste d'événements. Paiements et remboursements sont les deux flux qui font vivre vos chiffres d'encaissé. La destination Ventes ne sert que si Stripe Checkout est votre point de vente et que vous voulez compter la vente au moment du checkout.
bid= ou client_key= ?
Les deux sont reconnus, mais l'app affiche vos URLs avec bid= (votre Business ID). Utilisez celles-là.
DURUM.ai peut-il effectuer un paiement ou modifier mon compte Stripe ?
Non. La clé est en lecture seule, chiffrée, et jamais réaffichée. Aucune écriture n'est faite chez Stripe.
Que se passe-t-il si je reconnecte ma clé API ?
Les secrets déjà enregistrés sont conservés. Seuls les secrets que vous collez dans la fenêtre de reconnexion remplacent ceux de leur type.
J'utilise Stripe Connect avec plusieurs comptes
Si le payload porte un identifiant de compte connecté, DURUM.ai retrouve votre compte grâce à celui enregistré à la connexion de la clé. Le bid= dans l'URL reste nécessaire pour la vérification de signature.
Checklist rapide
- [ ] Clé API restreinte connectée (import des 90 jours lancé)
- [ ] Destination Paiements créée avec
bid=et les événementspayment_intent.succeeded,charge.succeeded - [ ] Destination Remboursements créée avec
bid=etcharge.refunded+ litiges - [ ] Secrets collés dans Configuration, chacun dans le champ de sa destination
- [ ] Test event Stripe : réponse
200, événement visible dans Logs