Webhooks entrants
Recevez des événements provenant de plateformes externes et attribuez des graines à vos clients automatiquement. Les webhooks entrants vous permettent de connec
📥 Webhooks entrants
Recevez des événements provenant de plateformes externes et attribuez des graines à vos clients automatiquement. Les webhooks entrants vous permettent de connecter n'importe quel outil tiers — applications de quiz, formulaires, plateformes d'avis, Zapier, Make, et plus — à votre programme de fidélité LoyaltyTree.

Comment ça fonctionne
Le système de webhook entrant utilise un modèle Sources & Codes :
- Créer une Source — Une source représente une plateforme ou un outil externe (par exemple, "Typeform", "Zapier", "Mon Application de Quiz"). Chaque source obtient une URL de webhook unique et une clé secrète pour la sécurité.
- Ajouter des Codes à la Source — Chaque code définit une action spécifique qui attribue des graines (par exemple, "quiz_completed", "form_submitted", "birthday_claimed"). Vous définissez combien de graines chaque code attribue, avec des limites optionnelles.
- Envoyer des requêtes POST — Votre plateforme externe envoie une requête POST à l'URL du webhook avec le code et les informations du client. LoyaltyTree trouve ou crée le client et attribue les graines automatiquement.
Plateforme Externe → POST à l'URL du Webhook → LoyaltyTree valide & attribue des graines → Solde du client mis à jour
Commencer
Étape 1 : Créer une Source de Webhook
Accédez à Boutiques → [Votre Boutique] → Intégrations → Webhooks entrants. Cliquez sur + Ajouter une Source et donnez-lui un nom qui décrit la plateforme externe (par exemple, "Quiz Typeform" ou "Automatisation Zapier").
Lorsque la source est créée, vous recevrez :
- URL de Webhook — Le point de terminaison auquel votre plateforme externe enverra des requêtes
- Secret de Webhook — Une clé secrète pour signer les requêtes (recommandée pour la sécurité)

Étape 2 : Ajouter des Codes
Chaque code représente une action spécifique que vous souhaitez récompenser. Cliquez sur + Ajouter un Code sur votre source pour en créer un.
| Champ | Requis | Description |
|---|---|---|
| Code | Oui | La valeur exacte envoyée dans la charge utile du webhook (par exemple, quiz_completed). Cela doit correspondre à ce que votre plateforme externe envoie. |
| Nom d'affichage | Oui | Un nom convivial affiché dans le tableau de bord admin et l'historique des transactions (par exemple, "Quiz Complété"). |
| Description | Non | Une note optionnelle pour votre équipe sur le moment où ce code est utilisé. |
| Montant des Graines | Oui | Combien de graines attribuer chaque fois que ce code est déclenché. Par défaut, c'est 1. |
| Max Graines/Client | Non | Le nombre maximum total de graines qu'un seul client peut gagner avec ce code. Laissez vide pour illimité. Une fois qu'un client atteint cette limite, d'autres appels de webhook pour lui renverront un succès mais attribueront 0 graines. |
| Temps de Recharge (heures) | Non | Heures minimales entre les récompenses pour le même client sur ce code. Empêche les abus en limitant la fréquence à laquelle un client peut gagner des graines. Laissez vide pour pas de temps de recharge. |
| Activé | — | Basculer pour activer ou désactiver ce code sans le supprimer. Les codes désactivés renvoient une erreur 403. |
Étape 3 : Configurer Votre Plateforme Externe
Configurez votre plateforme externe (Zapier, Typeform, application personnalisée, etc.) pour envoyer une requête POST à votre URL de webhook chaque fois que l'action se produit. Consultez la section Format de Requête ci-dessous pour le format exact de la charge utile.
Codes & Limites Expliqués
Les codes et leurs limites fonctionnent ensemble pour vous donner un contrôle précis sur la manière dont les graines sont attribuées :
Montant des Graines
Chaque code a un montant de graines fixe. Chaque fois que le webhook est déclenché avec ce code, le client reçoit exactement ce nombre de graines. Par exemple, si vous définissez "quiz_completed" à 5 graines, chaque appel de webhook qualifié attribue 5 graines.
Max Graines par Client
Cela fixe un plafond à vie par client par code. C'est le total des graines que ce client peut gagner avec ce code spécifique, pas le nombre de fois qu'il peut le déclencher.
quiz_completed avec Montant des Graines = 5 et Max Graines/Client = 15.
- 1er quiz complété → +5 graines (total : 5) ✅
- 2ème quiz complété → +5 graines (total : 10) ✅
- 3ème quiz complété → +5 graines (total : 15) ✅
- 4ème quiz complété → +0 graines (limite atteinte) — renvoie succès mais aucune graine attribuée
Temps de Recharge (Heures)
Fixe un temps d'attente minimum entre les récompenses de graines pour le même client sur le même code. Le minuteur de recharge commence à partir de la dernière récompense réussie.
daily_visit avec Montant des Graines = 2 et Temps de Recharge = 24 heures.
- Lundi 10h → +2 graines ✅
- Lundi 15h → +0 graines (temps de recharge actif, réessayez dans 19 heures)
- Mardi 11h → +2 graines ✅
Format de Requête
Envoyez une requête POST à votre URL de webhook avec le corps JSON suivant :
{
"code": "your_code_here",
"customer": {
"email": "customer@example.com",
"shopify_customer_id": "12345",
"first_name": "Jane",
"last_name": "Smith"
},
"metadata": {
"quiz_score": 95,
"source_page": "spring-quiz"
}
}
| Champ | Requis | Description |
|---|---|---|
code |
Oui | La valeur du code qui correspond à l'un de vos codes configurés (par exemple, quiz_completed) |
customer.email |
Oui* | Adresse e-mail du client. Utilisée pour trouver ou créer le client. Requise pour les nouveaux clients. |
customer.shopify_customer_id |
Non* | L'ID Shopify du client. Peut être utilisé à la place de l'e-mail pour identifier les clients existants. |
customer.first_name |
Non | Prénom du client. Utilisé lors de la création de nouveaux clients. |
customer.last_name |
Non | Nom de famille du client. Utilisé lors de la création de nouveaux clients. |
metadata |
Non | Toutes les données supplémentaires que vous souhaitez stocker avec la transaction (par exemple, scores de quiz, informations sur la page). Stockées sous forme de JSON et visibles dans les journaux. |
* Au moins l'un de email ou shopify_customer_id est requis. L'e-mail est requis lorsque le client n'existe pas encore dans LoyaltyTree.
Vérification de la Signature HMAC (Recommandé)
Pour vérifier que les requêtes proviennent réellement de votre plateforme (et non de quelqu'un qui a trouvé votre URL de webhook), signez vos requêtes en utilisant HMAC-SHA256.
- Prenez le corps brut de la requête JSON sous forme de chaîne
- Créez un hachage HMAC-SHA256 en utilisant votre Secret de Webhook comme clé
- Incluez le hachage encodé en hexadécimal dans l'un des en-têtes pris en charge
En-têtes de signature pris en charge (LoyaltyTree vérifie tous ces en-têtes) :
X-Webhook-SignatureX-Hub-Signature-256X-Signature
La valeur de la signature peut être soit le hachage hexadécimal brut, soit préfixée par sha256= (les deux formats sont acceptés).
Alternative : Authentification par Token Simple
Si la signature HMAC n'est pas possible dans votre plateforme, vous pouvez passer votre secret de webhook comme un token simple dans l'en-tête X-Token. LoyaltyTree le comparera directement à votre secret.
Exemple : Signature avec Node.js
const crypto = require('crypto');
const payload = JSON.stringify({
code: 'quiz_completed',
customer: { email: 'jane@example.com' }
});
const signature = crypto
.createHmac('sha256', 'your_webhook_secret')
.update(payload)
.digest('hex');
fetch('https://loyaltytree.eco/webhooks/inbound/YOUR_SOURCE_ID', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Webhook-Signature': signature
},
body: payload
});
Exemple : Signature avec Python
import hmac, hashlib, json, requests
payload = json.dumps({
"code": "quiz_completed",
"customer": {"email": "jane@example.com"}
})
signature = hmac.new(
b'your_webhook_secret',
payload.encode('utf-8'),
hashlib.sha256
).hexdigest()
requests.post(
'https://loyaltytree.eco/webhooks/inbound/YOUR_SOURCE_ID',
headers={
'Content-Type': 'application/json',
'X-Webhook-Signature': signature
},
data=payload
)
Exemple : Utilisation de cURL (pour les tests)
curl -X POST https://loyaltytree.eco/webhooks/inbound/YOUR_SOURCE_ID \
-H "Content-Type: application/json" \
-H "X-Token: your_webhook_secret" \
-d '{"code":"quiz_completed","customer":{"email":"jane@example.com"}}'
Format de Réponse
Réponse Réussie (200)
{
"success": true,
"seeds_awarded": 5,
"transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"customer_id": "f0e1d2c3-b4a5-6789-0123-456789abcdef"
}
Réussi mais Limité (200)
Lorsque un temps de recharge ou une limite de graines maximum empêche l'attribution, vous obtenez toujours une réponse 200 mais avec 0 graines et une explication :
{
"success": true,
"seeds_awarded": 0,
"message": "Temps de recharge actif. Réessayez dans 18 heure(s)."
}
// ou
{
"success": true,
"seeds_awarded": 0,
"message": "Maximum de graines (15) déjà attribuées pour ce code."
}
Réponses d'Erreur
| Statut HTTP | Erreur | Signification |
|---|---|---|
| 400 | Champ requis manquant : code |
Le champ code n'a pas été inclus dans le corps de la requête |
| 400 | Champ requis manquant : customer.email ou customer.shopify_customer_id |
Aucun identifiant client n'a été fourni |
| 400 | Code inconnu : xyz |
Le code envoyé ne correspond à aucun code configuré pour cette source |
| 401 | Signature ou token de webhook invalide |
La signature HMAC ou le token ne correspondent pas. Vérifiez votre secret de webhook. |
| 403 | Source de webhook désactivée |
La source a été désactivée dans le tableau de bord admin |
| 403 | Code désactivé : xyz |
Le code spécifique a été désactivé |
| 404 | Source de webhook non trouvée |
L'ID de la source dans l'URL n'existe pas. Vérifiez l'URL du webhook. |
Exemples de Cas d'Utilisation
🧩 Complétion de Quiz
Récompensez les clients pour avoir complété un quiz sur votre site (réalisé avec Typeform, Google Forms, etc.).
- Code :
quiz_completed - Graines : 10
- Max Graines : 10 (une seule fois)
- Temps de Recharge : aucun
📋 Réponse au Sondage
Attribuez des graines lorsqu'un client complète un sondage post-achat.
- Code :
survey_completed - Graines : 5
- Max Graines : 25 (jusqu'à 5 sondages)
- Temps de Recharge : 168 heures (une fois par semaine)
🎂 Récompense d'Anniversaire
Offrez des graines le jour de l'anniversaire d'un client via votre plateforme marketing.
- Code :
birthday_reward - Graines : 25
- Max Graines : aucune (annuelle)
- Temps de Recharge : 8760 heures (365 jours)
📸 Tag Instagram
Récompensez les clients qui taguent votre marque sur Instagram (vérifié par votre équipe ou outil de médias sociaux).
- Code :
instagram_tag - Graines : 15
- Max Graines : 60 (jusqu'à 4 tags)
- Temps de Recharge : 72 heures (une fois tous les 3 jours)
Connexion avec Zapier
Zapier est l'un des moyens les plus populaires de connecter LoyaltyTree avec des centaines d'autres applications. Nous construisons une intégration LoyaltyTree dédiée dans le Zapier App Store, ce qui facilitera encore plus la configuration — recherchez-la dans le marché Zapier.
Nous ajoutons LoyaltyTree en tant qu'application native Zapier. Une fois disponible, vous pourrez rechercher "LoyaltyTree" dans le répertoire d'applications Zapier et le connecter directement — aucune configuration de webhook nécessaire. Restez à l'écoute !
En attendant, vous pouvez utiliser l'action Webhooks by Zapier pour vous connecter dès maintenant :
- Créez un Zap avec votre déclencheur souhaité (par exemple, "Nouvelle Réponse Typeform")
- Ajoutez une étape d'action : Webhooks by Zapier → POST
- Définissez l'URL sur votre URL de webhook entrant LoyaltyTree
- Définissez le Type de Charge Utile sur JSON
- Mappez les champs :
code→ votre valeur de code (par exemple, "quiz_completed")customer.email→ l'e-mail du répondant provenant du déclencheur
- Sous En-têtes, ajoutez
X-Tokenavec la valeur de votre secret de webhook - Testez et activez votre Zap
Connexion avec Make (Integromat)
Vous pouvez également utiliser le module HTTP / Faire une requête de Make pour envoyer des webhooks à LoyaltyTree. Configurez-le de la même manière que Zapier — définissez l'URL, ajoutez le corps JSON avec code et customer, et incluez votre secret dans l'en-tête X-Token.
Journaux de Webhook
Chaque appel de webhook entrant est enregistré et visible dans la section Webhooks entrants de votre page d'intégrations. Les journaux montrent :
- Horodatage – Quand le webhook a été reçu
- Source – Quelle source l'a reçu
- Statut – Succès ou échec
- Détails – Code utilisé, graines attribuées, ou message d'erreur
- Charge Utile – Le corps complet de la requête (crypté au repos)
Utilisez les journaux pour vérifier que votre intégration fonctionne correctement et pour résoudre tout problème.
Dépannage
Obtention de 401 "Signature de webhook invalide"
- Assurez-vous que vous signez la chaîne exacte du corps JSON que vous envoyez (pas d'espace supplémentaire ou de reformatage)
- Vérifiez que vous utilisez le bon secret de webhook (vous pouvez le révéler dans le tableau de bord admin)
- Si la signature HMAC n'est pas possible, utilisez l'en-tête
X-Tokenavec votre secret comme valeur simple - Vous pouvez régénérer le secret à partir des paramètres de la source si nécessaire
Obtention de 400 "Code inconnu"
- La valeur
codedans votre requête doit correspondre exactement à un code que vous avez configuré dans le tableau de bord admin - Les codes sont sensibles à la casse :
Quiz_Completedest différent dequiz_completed - Vérifiez que le code est activé (non désactivé)
Graines attribuées = 0
- Vérifiez si le client a atteint la limite Max Graines/Client pour ce code
- Vérifiez si le Temps de Recharge est toujours actif — le message de réponse vous indiquera combien d'heures attendre
- Les deux renvoient HTTP 200 avec
seeds_awarded: 0et une explication dans le champmessage
Client non créé
- Les nouveaux clients nécessitent une adresse e-mail. Si vous n'envoyez que
shopify_customer_id, le client doit déjà exister dans LoyaltyTree. - Si à la fois l'e-mail et l'ID Shopify sont fournis, LoyaltyTree recherche d'abord par e-mail, puis par ID Shopify, et crée un nouveau client uniquement si aucun des deux ne correspond.
Sécurité
- Chaque source obtient un secret de webhook unique de 64 caractères, généré automatiquement et crypté au repos
- Les secrets peuvent être régénérés à tout moment à partir des paramètres de la source (l'ancien secret cesse de fonctionner immédiatement)
- Les charges utiles de requête sont cryptées dans les journaux pour la confidentialité
- La vérification de signature utilise une comparaison sécurisée par temps pour prévenir les attaques par temporisation
- Les sources et les codes peuvent être désactivés individuellement sans les supprimer