Support

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 :

  1. 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é.
  2. 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.
  3. 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 ExternePOST à l'URL du WebhookLoyaltyTree valide & attribue des grainesSolde 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.

Exemple : Vous créez un code 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.

Exemple : Vous créez un code 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 ✅
Astuce : Vous pouvez combiner les deux limites ! Par exemple, définissez un code avec Graines = 10, Max = 30, et Temps de Recharge = 168 heures (7 jours) pour attribuer 10 graines par semaine, jusqu'à 30 au total.

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.

Comment signer votre requête :
  1. Prenez le corps brut de la requête JSON sous forme de chaîne
  2. Créez un hachage HMAC-SHA256 en utilisant votre Secret de Webhook comme clé
  3. 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-Signature
  • X-Hub-Signature-256
  • X-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.

💡 À Venir : Intégration du Zapier App Store

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 :

Configuration avec les Webhooks Zapier :
  1. Créez un Zap avec votre déclencheur souhaité (par exemple, "Nouvelle Réponse Typeform")
  2. Ajoutez une étape d'action : Webhooks by Zapier → POST
  3. Définissez l'URL sur votre URL de webhook entrant LoyaltyTree
  4. Définissez le Type de Charge Utile sur JSON
  5. Mappez les champs :
    • code → votre valeur de code (par exemple, "quiz_completed")
    • customer.email → l'e-mail du répondant provenant du déclencheur
  6. Sous En-têtes, ajoutez X-Token avec la valeur de votre secret de webhook
  7. 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-Token avec 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 code dans 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_Completed est différent de quiz_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: 0 et une explication dans le champ message
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

Was this helpful?

Let us know how we can improve our documentation.

contact_support

Still need help?

Our support team is available to assist you with any questions or technical issues.

Contact Support arrow_forward
feedback

Suggest an edit

Did you find an error or missing information? Help us improve our documentation.

Edit on GitHub open_in_new