Ce dont vous avez besoin
- Un compte Make.com avec une connexion Google Sheets
- Une feuille Google Sheets avec une ligne d'en-tête, par exemple : Reçu le, Nom, E-mail, Message
- L'outil qui enverra le webhook, ou un moyen d'envoyer une requête de test (curl, Postman ou le client HTTP de votre choix)
- Une idée approximative des champs que l'expéditeur inclura
Construction étape par étape
1. Créez le webhook
Créez un nouveau scénario et ajoutez Webhooks – Custom webhook comme déclencheur. Cliquez sur Add, donnez-lui un nom comme « Formulaire de contact du site » et enregistrez. Make affiche une URL qui ressemble à https://hook.<region>.make.com/<long-random-string>. Copiez-la. Traitez-la comme un mot de passe : toute personne qui la possède peut envoyer des données dans votre scénario.
2. Mettez-le en écoute
Cliquez sur Run once. Le module attend maintenant des données et l'indique. Il n'apprend la structure que lorsqu'il est en écoute : ne sautez donc pas cette étape.
3. Envoyez une requête d'exemple
Depuis un terminal, envoyez un exemple réaliste. Avec curl :
curl -X POST "https://hook.<region>.make.com/<your-id>" \
-H "Content-Type: application/json" \
-d '{"name": "Anna Berg", "email": "[email protected]", "message": "Hello"}'
Sous Windows, utilisez explicitement curl.exe dans PowerShell, car curl y est un alias d'une autre commande. Postman fonctionne aussi. Make répond par un court message « Accepted » et le module passe au vert.
4. Vérifiez que la structure de données a été déterminée
Ouvrez la bulle de sortie. Vous devriez voir name, email et message sous forme de champs. C'est la structure que Make utilisera dans le panneau de mapping. Si l'expéditeur peut ajouter d'autres champs plus tard, ou si certains sont facultatifs, envoyez un deuxième exemple qui les contient tous. Pour modifier la structure ultérieurement, cliquez sur Detect new values dans le module Custom webhook et envoyez une nouvelle requête. Si vous connaissez les champs à l'avance, vous pouvez plutôt choisir une structure de données dans les paramètres avancés du webhook ; Make rejette alors avec le statut 400 les requêtes qui ne correspondent pas.
5. Ajoutez un filtre pour les champs obligatoires
Cliquez sur la liaison qui suit le webhook et ajoutez un filtre : email, exists, et message, exists. Les requêtes incomplètes ou envoyées par erreur s'arrêtent alors ici au lieu de créer des lignes vides.
6. Ajoutez Google Sheets – Add a Row
Sélectionnez le classeur et la feuille. Mappez :
- Reçu le :
{{formatDate(now; "YYYY-MM-DD HH:mm")}} - Nom :
{{1.name}} - E-mail :
{{trim(1.email)}} - Message :
{{1.message}}
Le 1. correspond au numéro du module webhook dans cet exemple : utilisez le panneau de mapping pour trouver le vôtre.
7. Gérez les données imbriquées
Les payloads réels contiennent souvent des objets ou des arrays imbriqués, comme customer.address.city ou une liste d'items. Les objets imbriqués se mappent en parcourant l'arborescence dans le panneau de mapping. Les arrays nécessitent un itérateur si chaque élément doit devenir sa propre ligne. Si vous voulez une seule ligne, utilisez join(map(...)) pour transformer l'array en texte.
8. Renvoyez une réponse si l'expéditeur en a besoin
Certains outils attendent une réponse précise, comme {"status": "ok"}. Ajoutez Webhooks – Webhook response, réglez le statut sur 200 et le body sur ce qu'attend l'expéditeur. Sans ce module, Make répond par un message « Accepted » par défaut. Make attend la réponse jusqu'à 180 secondes ; au-delà, il renvoie quand même 200 Accepted.
9. Sécurisez l'URL
Voici les options concrètes, de la plus simple à la plus poussée :
- Gardez l'URL secrète. Ne la collez pas dans des dépôts publics, des captures d'écran ou du JavaScript côté client que les visiteurs peuvent lire.
- Utilisez l'authentification par API Key. Lorsque vous créez ou modifiez le webhook, ajoutez une ou plusieurs clés API. L'expéditeur inclut alors la clé dans un en-tête
x-make-apikey, et Make rejette directement au niveau du webhook les requêtes sans clé valide. - Limitez par adresse IP. Si l'expéditeur publie des adresses IP fixes, saisissez-les, séparées par des virgules, dans le paramètre IP restrictions du webhook (les plages CIDR fonctionnent aussi). Les requêtes provenant d'autres adresses ne sont pas traitées.
- Si l'expéditeur ne peut pas envoyer cet en-tête, vérifiez plutôt un secret partagé. Demandez-lui d'ajouter un en-tête comme
x-webhook-secretavec une longue valeur aléatoire. Dans les paramètres avancés du webhook, réglez Get request headers sur Yes, puis ajoutez un filtre : l'en-tête est égal à votre secret. Les requêtes qui ne l'ont pas s'arrêtent au filtre. - Si l'URL a fuité, créez un nouveau webhook et mettez à jour l'expéditeur. L'ancienne URL n'atteint alors plus votre scénario.
Un secret vérifié dans un filtre n'empêche pas les requêtes d'atteindre Make : chacune lance tout de même une exécution, et le déclencheur webhook consomme des crédits. Il les empêche seulement d'atteindre votre feuille. L'authentification par API Key et les IP restrictions agissent au niveau du webhook lui-même, mais traitez de toute façon l'URL comme un secret.
10. Activez et testez en conditions réelles
Activez le scénario, déclenchez un vrai événement dans l'outil expéditeur, puis vérifiez l'onglet History et la feuille. Par défaut, un scénario à webhook s'exécute immédiatement à l'arrivée des données ; laissez ce réglage, sauf si vous voulez traiter la file d'attente par lots selon un planning. Notez qu'un scénario réglé pour s'exécuter immédiatement est désactivé après sa première erreur : envisagez donc une route de gestion des erreurs, comme dans notre guide sur les error handlers de Make.
Erreurs fréquentes et solutions
Le module attend indéfiniment. La requête est partie vers la mauvaise URL ou la mauvaise région, ou l'expéditeur a été bloqué par un pare-feu ou une faute de frappe. Comparez l'URL caractère par caractère et assurez-vous que Run once est actif avant d'envoyer.
Les champs n'apparaissent pas dans le panneau de mapping. La structure a été déterminée à partir d'une requête vide ou différente. Redéterminez la structure de données (Redetermine data structure), envoyez un exemple complet et vérifiez la bulle.
Le body arrive sous forme d'une seule valeur texte au lieu de champs. L'expéditeur a utilisé le mauvais content type. Pour du JSON, l'en-tête doit être Content-Type: application/json. Les données encodées en formulaire fonctionnent aussi, mais l'expéditeur doit indiquer de quel format il s'agit.
Les données arrivent, mais rien n'atteint la feuille. Le scénario est désactivé, donc les requêtes attendent dans la file d'attente du webhook, ou bien le filtre de l'étape 5 les a bloquées. Ouvrez Webhooks dans la barre latérale gauche, sélectionnez le webhook et vérifiez son onglet Queue, puis vérifiez la condition du filtre. Une fois le scénario activé, les éléments en file d'attente sont traités.
Lignes en double. Certains expéditeurs réessaient s'ils ne reçoivent pas rapidement une réponse de succès, et d'autres envoient deux fois le même événement. Incluez si possible un ID d'événement dans le payload et vérifiez-le dans la feuille avant d'ajouter une ligne, comme dans notre guide Typeform vers Google Sheets.
Un champ présent hier est maintenant vide. L'expéditeur a modifié son payload. Examinez une nouvelle requête dans la bulle, redéterminez la structure et mettez à jour votre mapping. Utilisez ifempty() pour les champs parfois absents.