Nous avons créé un prototype de document Grist pour une petite mairie, pour la gestion du bois d’affouage. Grist permet de gérer les commandes et la facturation. Nous allons automatiser 2 processus grâce à n8n :
- envoi automatique de confirmation de commande, dès que les utilisateur·ices ont soumis le formulaire de commande
- au clic sur un bouton, envoi des factures personnalisées à chaque habitant·e
Pour utiliser n8n, vous pouvez héberger votre propre instance (l’auto-hébergement de la version communautaire est gratuit), utiliser le SaaS, ou vous rapprocher d’un prestataire. Si vous êtes une petite collectivité ou agent·e de l’ANCT, contactez donnees@anct.gouv.fr
Envoi de confirmation de commande
Le document Grist contient une page « Commandes » avec un formulaire de commande, qui alimente une table « Commandes ».
Le formulaire est envoyé aux habitant·es. Il leur est notamment demandé leur email :
Dans le document, nous allons ajouter une sous-page « Mail de confirmation de commande », avec une table « Mail_automatique_confirmation_commande » dans laquelle nous définissons l’objet, l’expéditeur et le contenu du mail à envoyer.
Nous pourrions définir ces données directement dans n8n, mais le but est de paramétrer le maximum de données dans Grist, pour faciliter la gestion et les modifications éventuelles.
Création et test du point d’ancrage
Nous allons maintenant créer le « point d’ancrage », qui permettra de déclencher le workflow n8n dès l’ajout d’une nouvelle ligne à la table « Commandes » - donc dès que le formulaire est soumis. Les étapes sont les suivantes :
-
Dans n8n, dans un nouveau workflow, ajouter un noeud de type « Webhook », choisir
HTTP Method= POST et copier l’URL de test (qui s’affiche après POST)
(vous pouvez modifier le chemin de l’url si nécessaire dans le champPath)
-
Dans Grist,
Paramètres>Points d'ancrage web, créez un nouveau webhook :
Nom: Envoi confirmation commandes
Types d'événements: add (pour « ajout de ligne à la table »)
Table: la table à observer, ici « Commandes »
Filtrer les changements dans ces colonnes(facultatif) : spécifiez le nom de la colonne à observer (inutile ici)
URL: collez l’URL de test de N8N
Activé: ON
- Dans n8n, cliquez sur
Listen for test event - Dans Grist, ouvrez le formulaire, remplissez-le et validez
- Dans N8N, voyez que l’événement a bien été reçu, et observez le résultat de la requête dans le panneau de droite. Vous pouvez choisir une vue « Schéma », « Table » ou « JSON » :
Nous utiliserons uniquement le champ mail, qui nous servira pour envoyer l’email au bon destinataire.
Récupération du contenu du mail à envoyer
Lors du déclenchement du point d’ancrage, on ne récupère que les données de la table qui a été mise à jour. Il n’est pas possible de récupérer les données d’autres tables.
Or, nous avons besoin de récupérer le contenu, l’objet et l’expéditeur de notre mail, que nous avons défini précédemment dans la table « Mail_automatique_confirmation_commande ».
Nous allons donc dans n8n utiliser un noeud « Grist » pour aller lire cette table.
- Dans votre workflow n8n, ajoutez un noeud « Grist » et connectez-le au noeud précédent
- Configurez le noeud :
Credential to connect with : configurez votre authentification Grist : clé API (lien dans Paramètres > Console API) ; « Self-hosted » et l’url de votre instance incluant l’espace d’équipe
DocumentID : à récupérer dans l’url de votre document, de la forme fgsUvXYaVqqL
TableID : id de votre table, ici Mail_automatique_confirmation_commande
- Cliquez sur « Execute step » et voyez le résultat de la requête de lecture de table :
Envoi des mails
Nous avons désormais tout ce qu’il nous faut pour envoyer les mails : le mail de la personne ayant soumis le formulaire, ainsi que les infos à envoyer. Nous allons utiliser un outil de mailing de masse, Brevo, pour envoyer facilement nos mails.
- Dans votre workflow n8n, ajoutez un noeud « Brevo »
Credential to connect with : configurez votre authentification
Resource : Email
Operation : Send
Subject: faites glisser/déposer le champ du panneau de gauche - ou écrivez directement {{ $json.Objet }}
Text content : {{ $json.Corps }}
Sender: {{ $json.Expediteur }}
Recipient : {{ $('Webhook').item.json.body[0].Mail }}, sachant que $('Webhook') va permettre de chercher la donnée issue du noeud « Webhook »
- Cliquez
Execute step, vérifiez que vous avez bien reçu l’e-mail. Tests validés !
Passer le workflow « en production »
Pour activer le workflow pour qu’il soit en écoute « permanente » de l’ajout de données dans la table Commandes :
- Dans n8n, ouvrez le noeud « Webhook », basculez sur
Production URLet copiez l’url. - Activez le workflow grâce au petit bouton switch au-dessus du canevas (obligatoire, sinon votre requête ne sera pas reçue !) et sauvegardez.
- Dans Grist, dans la configuration du Webhook, dans le champ
URL, remplacez l’url de test par l’url de production. En cas d’erreur visible dans le champStatut, désactivez et réactivez le boutonActivé. - Soumettez à nouveau une réponse au formulaire, et vérifiez que vous avez bien reçu l’e-mail dans votre client mail

Envoi des factures personnalisées
Le document Grist contient une page « Facturation », qui contient une formule de génération html d’une facture, personnalisée pour chaque habitant·e.
On ajoute une table « Texte_pour_mail_facturation » qui contient les informations statiques du mail à envoyer :
- expéditeur
- Objet
- Contenu fixe du mail
Cette table a également une colonne « Année », qui nous permettra de filtrer les factures à envoyer uniquement sur l’année en cours .
On ajoute une autre table « Envoi_factures_n8n » qui contient :
- une colonne « Envoyer » qui affiche le nombre d’envoi de factures effectué (normalement, il y en aura 1 par an)
- la formule d’un bouton d’action, qui, si cliqué, incrémente la valeur de la colonne « Envoyer » de la table :
La formule du bouton est la suivante :
{
"button":"Envoyer",
"description":":)",
"actions":[[
"UpdateRecord",
"Envoi_factures_n8n",
1,
{
"Envoyer": Envoi_factures_n8n.lookupOne(id=1).Envoyer + 1,
"Statut": "✅"
}
]]
}
- une colonne « Statut », qui est mise à jour par défaut avec un
lors du clic sur le bouton d’envoi, et qui sera mise à jour avec un
si l’une des requêtes de l’API de Brevo échoue.
Dans n8n, nous mettons en place le workflow suivant :
Le premier noeud est un webhook dont nous récupérons l’url de test (cf section précédente) pour créer notre point d’ancrage dans Grist.
Ce dernier va déclencher une requête à chaque mise à jour de la colonne « Envoyer » (donc à chaque clic sur le bouton d’action « Envoyer »).
Pour tester le webhook, il faut cliquer dans n8n sur « Listen for test event », puis, dans Grist cliquer sur notre bouton d’action pour mettre à jour la colonne « Envoyer ».
On récupère alors dans notre noeud webhook les données de notre table « Envoi_factures_n8n » :
Le noeud suivant est un noeud Grist qui va récupérer le contenu statique du mail de notre table « Texte_pour_mail_facturation ».
Le troisième nœud est un noeud Grist qu permet de lire notre table des Factures, en filtrant sur l’année obtenue via le nœud précédent :
si on souhaite envoyer uniquement les factures qui ont été livrées, on pourrait rajouter un filtre dans le nœud pour filtrer sur la colonne « Livrée ? »
Enfin, un noeud Brevo permet d’envoyer les mails en masse, en bouclant sur le nombre de factures obtenues via le nœud Grist des factures, et en récupérant les les données du mail dans le premier nœud Grist.
Dans n8n, pour cibler les données du nœud qui précède (le nœud Grist Factures), on utilise
$json.Nom_du_champ. Pour cibler les données du nœud Grist d’email, on utilise$('Grist récupérer mail').first().json, avecfirstcar nos données sont dans la première ligne de la table, et'Grist récupérer mail'qui est le nom de notre nœud.
Le contenu du mail, indiqué dans le champ « HTML Content » du nœud Brevo, est une concaténation entre la partie mail statique, et le html obtenu grâce à notre formule de publipostage.
{{$('Grist récupérer mail').first().json.Contenu + "\n\n\n" + $json.Formule_pour_PDF }}
On envoie ainsi à chaque mail sa propre facture !
Pour boucler la boucle, on paramètre le noeud Brevo pour retourner une erreur si une des requêtes d’envoi n’aboutit pas :
Cela nous permet de mettre à jour la colonne « Statut » de notre table « Envoi_factures_n8n » avec un
suivi du message d’erreur.
On ajoute pour cela un noeud Grist qui se déclenchera en cas d’échec d’envoi via Brevo :
On peut le paramétrer pour qu’il ne s’exécute qu’une fois (sinon, il va itérer autant de fois que le nombre de requêtes en échec, ce qui est inutile pour nous puisqu’on aura déjà un
affiché dans notre colonne).
Le fait qu’il n’y ait pas d’erreur suite au noeud Brevo ne signifie pas que tous les mails ont bien été reçus par les destinataires, mais seulement que Brevo a bien effectué toutes les requêtes d’envoi de mails transactionnels. Il faudra ensuite regarder dans l’interface de Brevo s’il y a eu des emails non reçus (« soft bounces » ou « hard bounces »).
Passer le workflow « en production »
Pour activer le workflow pour qu’il soit en écoute « permanente » du clic sur le bouton d’envoi :
- Dans n8n, ouvrez le noeud « Webhook », basculez sur
Production URLet copiez l’url. - Activez le workflow grâce au petit bouton switch au-dessus du canevas (obligatoire, sinon votre requête ne sera pas reçue !) et sauvegardez.
- Dans Grist, dans la configuration du Webhook, dans le champ
URL, remplacez l’url de test par l’url de production. En cas d’erreur visible dans le champStatut, désactivez et réactivez le boutonActivé. - Cliquez sur le bouton « Envoi », et vérifiez dans n8n, onglet « Exécutions », que le workflow s’est bien déclenché, et dans Brevo que vos emails ont bien été envoyés

Liens utiles :
Infos utiles
Si vous utilisez Grist sur une instance de l’ANCT ou de la DINUM, les webhooks vers des url non connues sont bloquées pour raisons de sécurité - si vous auto-hébergez votre propre instance de n8n, il vous faudra contacter l’équipe (sur Tchap ou par mail donnees@anct.gouv.fr ou contact@grist.numerique.gouv.fr) en amont pour demander une validation de votre sous-domaine. Si vous hébergez sur un domaine .gouv.fr, il sera de facto autorisé.
Sur l’instance de l’ANCT, pour vous permettre de réaliser vos tests, nous avons autorisé les webhooks vers les instances cloud de n8n (n8n.cloud) et Activepieces (cloud.activepieces.com).























