Un achat en ligne → une invitation
Quand un client règle un achat sur Stripe, invite-le dans ton coaching avec Fit'Distance, après un premier passage en aperçu, avec n8n ou Make.
Quand un client règle un achat sur Stripe, il reçoit l'e-mail d'invitation de Fit'Distance avec son code. Ce cas pratique écrit en ton nom et prévient quelqu'un : il lui faut une clé avec Élèves › Écrire (students:write) et une offre qui inclut les écritures. Crée la clé dans l'app, conditions d'usage acceptées.
Ce que fait ce cas pratique
- Déclencheur : Stripe envoie
checkout.session.completedà la fin du paiement, etcheckout.session.async_payment_succeededquand un prélèvement ou un virement est encaissé ; une session dontpayment_statusestunpaidn'invite personne. L'adresse de l'acheteur est dansdata.object.customer_details.email, l'identifiant de la session dansdata.object.id(il commence parcs_). - Durée : le contrat commence à la date du paiement et dure
weekssemaines, lues dansdata.object.metadata.weeks, 12 sans valeur. - Invitation : un
POST /operations/students.invitecrée un code et envoie l'e-mail d'invitation à l'acheteur. - Pour toi : un e-mail facultatif te dit qui a été invité, jusqu'à quand.
curl -X POST https://api.fitdistance.io/api/partner/v1/operations/students.invite \
-H "Authorization: Bearer fd_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: vente-cs_live_a1B2" \
-d '{"email": "lea@example.com", "contractStartAt": "2026-10-26T09:00:00.000Z", "contractEndAt": "2027-01-18T09:00:00.000Z", "dry_run": true}'L'Idempotency-Key vaut vente-<cs_…>, l'identifiant de la session : deux événements distincts pour la même session ne font qu'une invitation, et le rejeu du même événement est remboursé, tant que la clé est gardée, de 24 à 48 heures. Voir Écritures et idempotence.
Poser weeks dans Stripe
Seules les métadonnées de la session arrivent dans l'événement, pas celles du produit. Pose weeks dans les métadonnées de ton lien de paiement, que Stripe copie sur chaque session du lien, ou à la création de la session. Un weeks qui n'est pas un nombre entier de 1 à 520, ou un achat sans e-mail, arrête le workflow avant l'invitation.
Ce que ça coûte
Une écriture coûte un crédit, débité avant l'appel : une invitation par achat. Un aperçu (dry_run: true) et l'e-mail pour toi ne coûtent rien. Un argument que le schéma de l'opération refuse est remboursé ; un 401, un 403 ou un 429 ne coûtent rien ; un rejeu est remboursé.
Un premier passage en aperçu
Le workflow est livré avec dry_run: true : rien n'est créé ni envoyé, et le message de la réponse dit ce qui partirait. Passe dry_run à false quand l'aperçu te convient. Il fait partie du corps : un achat déjà prévisualisé, rejoué ensuite, reçoit un 409 IDEMPOTENCY_MISMATCH gratuit ; les achats suivants ont une nouvelle clé.
Dans n8n
- Choisis Import from URL… et colle
https://fitdistance.io/documentation/api/cas-pratiques/vente-en-ligne-invitation.n8n.json, ou télécharge le workflow et choisis Import from File…. Choisis l'identifiantFit'Distance APIde Brancher n8n dans le nœud HTTP Request. - Dans Checkout completed, crée l'identifiant Stripe de n8n avec ta clé secrète de test (
sk_test_…) : activer le workflow enregistre son adresse chez Stripe, dans le mode de la clé. Le fichier écoute deux événements ; si tu rouvres le champ Events, garde les deux : n8n n'affiche pas le second dans sa liste, mais Stripe le reconnaît. - Dans Email me, choisis ton compte SMTP et remplace l'adresse d'exemple par la tienne, ou supprime le nœud.
- Exécute le workflow, fais un achat en mode test, puis lis le
messagede Invite the buyer.
L'invitation écrit à un vrai client
Invite the buyer est livré en aperçu. Une fois dry_run à false, chaque achat envoie l'e-mail d'invitation à son acheteur.
- Remplace la clé de l'identifiant Stripe par ta clé live (
sk_live_…), passedry_runàfalse, puis active le workflow : son adresse s'enregistre alors en mode live.
Contract dates tire les dates de l'événement, pas de l'heure du passage : un rejeu envoie le même corps.
Dans Make
- Premier module Stripe › Watch Events, pour les événements
checkout.session.completedetcheckout.session.async_payment_succeeded, puis un filtre :payment_statusdifférent deunpaid. Comme dans n8n, teste avec une clé de test, puis passe sur la clé live avant d'activer le scénario. - HTTP › Make a request :
POSTsurhttps://api.fitdistance.io/api/partner/v1/operations/students.invite,Idempotency-Key=vente-suivi de l'identifiant de la session (data.object.id), Body content typeapplication/JSON, Body input methodJSON string, corps{"email": "…", "contractEndAt": "{{addDays(now; 84)}}", "dry_run": true}, avec l'adresse decustomer_details.email. Avecweeks, remplace84par sept fois sa valeur.
Dans Make, now change à chaque exécution : un rejeu reçoit un 409 IDEMPOTENCY_MISMATCH gratuit, sans seconde invitation. Avec Systeme.io ou Shopify, le chemin est le même : leur webhook de commande payée (chez Shopify, orders/paid) remplace Stripe ; la clé prend l'identifiant de la commande. Référence : invitation d'un élève.