flowspag / tutoriels / relance-devis-automatique-n8n-ia
№ 010 15 min · intermédiaire

Relance de devis automatique : n8n et l'IA rédigent tes relances à J+3, J+7 et J+14

Automatise la relance de tes devis sans réponse avec n8n et l'IA : relances personnalisées en brouillon Gmail, suivi Google Sheets à jour. Testé et chiffré.

n8ngoogle-sheetsgmailgeminislack

TL;DR

  • Chaque matin, n8n lit tes devis « Envoyé » dans Google Sheets et repère ceux à relancer.
  • L’IA rédige une relance différente à J+3, J+7 et J+14, posée en brouillon Gmail.
  • La 3e relance clôt poliment le dossier, et le Sheet passe le devis en « Sans réponse ».
  • Testé en réel : 6 devis lus, 4 relances rédigées en 28 secondes.
  • Coût IA mesuré : 0,00035 $ par relance. Rien ne part sans ta relecture.

Tu envoies un devis. Le client répond « super, je regarde ça cette semaine ». Puis plus rien. Tu te dis que tu relanceras lundi. Lundi, tu as un rush client. Trois semaines plus tard, tu retombes sur le devis et c’est gênant de relancer.

Ce n’est pas un problème de motivation. Relancer demande d’y penser au bon moment, puis d’écrire un message qui ne sonne ni robot ni désespéré. Deux choses qu’une machine fait mieux que toi un mardi chargé.

Dans ce tuto, on construit un workflow n8n qui fait les deux. Il calcule qui relancer, l’IA écrit la relance adaptée, et tu n’as plus qu’à cliquer sur « Envoyer ». Je l’ai testé sur un vrai Google Sheet, avec un vrai modèle d’IA : tout ce que tu vas lire vient de ces exécutions.


Pourquoi tes devis dorment

Un devis sans réponse n’est pas un « non ». C’est souvent un client qui hésite sur le prix, attend une validation interne ou a juste oublié. Les guides de relance convergent sur un rythme court : une première relance quelques jours après l’envoi, puis une ou deux autres, chacune avec un rôle différent.

Camille est consultante SEO freelance. Elle envoie 8 devis par mois, entre 900 € et 3 500 € HT. Trois relances par devis, ça fait jusqu’à 24 emails à écrire par mois, au bon moment. En pratique, elle en écrit la moitié. Et les devis non relancés sont ceux qu’elle perd sans savoir pourquoi.

Le piège classique, c’est l’automatisation « bête » : le même email copié-collé à J+7. Le client le sent tout de suite. Ce qui marche, c’est une relance qui reprend le contexte du devis, et qui change de ton à chaque étape :

RelanceQuandRôleLongueur
n°1J+3Prendre des nouvelles, une seule question ouverte4 lignes
n°2J+7Lever une objection probable, proposer 15 min d’échange6 lignes
n°3J+14Clore le dossier poliment, laisser la porte ouverte4 lignes
ℹ️
Pourquoi la 3e relance clôt le dossier

« Sans nouvelles, je considère que ce n’est plus d’actualité » : c’est souvent la relance qui obtient une réponse, parce qu’elle demande un oui ou un non clair. Et si c’est non, tu le sais enfin, et tu arrêtes d’y penser.


Ce qu’on construit

Le workflow tourne chaque matin de semaine à 9 h. Il lit ton tableau de suivi, calcule pour chaque devis si une relance est due, fait rédiger les relances par l’IA, puis les dépose dans tes brouillons Gmail. Il met ensuite le Sheet à jour et t’envoie un récap Slack.

Workflow n8n de relance automatique des devis : déclencheur quotidien, lecture Google Sheets, calcul de la relance due, rédaction IA, brouillon Gmail, mise à jour du suivi et récap Slack

12 nœuds, plus 2 sous-nœuds pour l’IA. Les choix qui comptent :


Ce qu’il te faut

ÉlémentÀ quoi ça sertCoût
n8n (cloud ou auto-hébergé)Faire tourner le workflowStarter : 20 €/mois en annuel pour 2 500 exécutions. Auto-hébergé : gratuit hors serveur
Google SheetsLe tableau de suivi des devisGratuit
GmailRecevoir les brouillonsGratuit
Une clé API Gemini (Google AI Studio)Rédiger les relancesPalier gratuit, ou 0,25 $ / 1,50 $ par million de tokens (entrée / sortie)
Slack (optionnel)Récap du matin et alertesGratuit

Tarifs vérifiés le 16 octobre 2026 sur n8n.io/pricing et la grille tarifaire de l’API Gemini.

💡
Gemini, Claude ou OpenAI : au choix

J’ai testé avec Gemini Flash-Lite parce que c’est le modèle le moins cher qui tient la consigne. Le nœud « Modèle IA » se remplace en 30 secondes par Claude ou OpenAI : le reste du workflow ne bouge pas.

Compte 30 minutes de mise en place, dont 10 pour créer les connexions Google.


Construire le workflow pas à pas

01
Le tableau de suivi des devis

Crée un Google Sheet avec un onglet Devis et ces colonnes, dans cet ordre :

colonnes-onglet-devis.txt
numero | client | contact_prenom | email | objet | montant_ht | date_envoi | statut | nb_relances | derniere_relance | notes

Trois règles simples. date_envoi au format 2026-10-13. statut vaut Envoyé tant que tu attends une réponse : tu le passes à la main à Signé ou Perdu. La colonne notes est lue par l’IA : écris-y ce que tu sais du client (« attend la validation de ses associés », « budget serré », « tutoiement OK »). C’est elle qui rend les relances crédibles.

02
Le déclencheur et le bloc Paramètres

Ajoute un Schedule Trigger que tu nommes « Chaque matin en semaine » : intervalle hebdomadaire, du lundi au vendredi, à 9 h.

Branche ensuite un nœud Edit Fields (Set) nommé « Paramètres ». Tout ce que tu voudras changer plus tard est ici, et nulle part ailleurs :

parametres.txt
delais_relance       (Array)  = {{ [3, 7, 14] }}
ecart_minimum_jours  (Number) = 3
mon_prenom           (String) = Camille
mon_activite         (String) = Consultante SEO freelance (audits, accompagnement mensuel) pour TPE/PME.
ma_signature         (String) = Camille — Studio Lumen
                                06 12 34 56 78

delais_relance donne le nombre de jours après l’envoi pour la relance 1, 2 et 3. ecart_minimum_jours empêche deux relances trop rapprochées, utile quand tu ajoutes un vieux devis au suivi.

03
Lire les devis en attente

Ajoute un nœud Google Sheets, opération Get Row(s), nommé « Lire les devis en attente ». Choisis ton fichier et l’onglet Devis, puis ajoute un filtre : colonne statut, valeur Envoyé.

Dans Options, ajoute When Filter Has Multiple Matches et choisis Return All Matches.

⚠️
Sans cette option, un seul devis est lu

Par défaut, le filtre Google Sheets de n8n ne renvoie que la première ligne qui correspond. Ton workflow tourne sans erreur… et ne relance jamais que le premier devis du tableau.

04
Calculer la relance due

Un nœud Edit Fields (Set) nommé « Calculer la relance due », avec Include Other Input Fields sur All. Il ajoute quatre champs à chaque devis :

calculer-la-relance-due.txt
jours_depuis_envoi (Number)
{{ Math.floor($today.diff((DateTime.fromISO(String($json.date_envoi)).isValid ? DateTime.fromISO(String($json.date_envoi)) : DateTime.fromFormat(String($json.date_envoi), 'dd/MM/yyyy')), 'days').days) }}

relance_numero (Number)
{{ Number($json.nb_relances || 0) + 1 }}

delai_requis (Number)
{{ $('Paramètres').first().json.delais_relance[Number($json.nb_relances || 0)] ?? 9999 }}

jours_depuis_derniere_relance (Number)
{{ $json.derniere_relance ? Math.floor($today.diff((DateTime.fromISO(String($json.derniere_relance)).isValid ? DateTime.fromISO(String($json.derniere_relance)) : DateTime.fromFormat(String($json.derniere_relance), 'dd/MM/yyyy')), 'days').days) : 9999 }}

La double lecture de date (2026-10-13 ou 13/10/2026) évite de casser le workflow le jour où tu tapes une date à la française. Le ?? 9999 veut dire « plus de relance prévue » : après la 3e, le devis ne passera plus jamais le filtre.

05
Ne garder que les relances dues

Un nœud Filter nommé « Relance due ? », avec trois conditions reliées par AND :

relance-due.txt
{{ $json.jours_depuis_envoi }}             is greater than or equal  {{ $json.delai_requis }}
{{ $json.jours_depuis_derniere_relance }}  is greater than or equal  {{ $('Paramètres').first().json.ecart_minimum_jours }}
{{ $json.email }}                          is not empty

La 3e condition écarte les devis sans adresse email. Dans mon test, le devis du Garage Dupuis (email « à récupérer ») a été ignoré proprement au lieu de faire planter l’envoi.

06
Rédiger la relance avec l'IA

Ajoute un nœud Basic LLM Chain nommé « Rédiger la relance (IA) ». Active Require Specific Output Format. Le prompt (champ Prompt, mode Define below) donne le contexte du devis :

prompt-relance.txt
Devis {{ $json.numero }} envoyé il y a {{ $json.jours_depuis_envoi }} jours.
- Client : {{ $json.client }}
- Contact : {{ $json.contact_prenom }}
- Prestation : {{ $json.objet }}
- Montant : {{ $json.montant_ht }} € HT
- Notes internes : {{ $json.notes || "aucune" }}

C'est la relance n°{{ $json.relance_numero }} sur 3.

Ajoute un message de type System : c’est lui qui fixe le ton de chaque relance.

message-systeme.txt
Tu écris des relances de devis pour {{ $('Paramètres').first().json.mon_prenom }} ({{ $('Paramètres').first().json.mon_activite }}).
Objectif : obtenir une réponse (oui, non ou pas maintenant), pas forcer la signature.
Ton selon le numéro de relance :
1 = prise de nouvelles légère, une seule question ouverte, 4 lignes max.
2 = apporte une info utile liée à la prestation ou lève une objection probable (utilise les notes internes), propose un échange de 15 min, 6 lignes max.
3 = dernière relance : annonce que tu clos le dossier sans nouvelles, laisse la porte ouverte, 4 lignes max.
Règles : français, vouvoiement, jamais de remise ni de nouveau prix, jamais de fausse urgence. Pas de « Je me permets de vous relancer ». Tutoie seulement si les notes le précisent.
L'objet reprend le numéro du devis. Termine le message par la signature :
{{ $('Paramètres').first().json.ma_signature }}

Sous le nœud, branche deux sous-nœuds :

  • Modèle IA : Google Gemini Chat Model, modèle models/gemini-flash-lite-latest, température 0,5.
  • Format de la relance : Structured Output Parser, avec cet exemple JSON : { "objet": "Votre devis D-2026-041 — audit SEO", "message": "Bonjour Thomas, ..." }

Enfin, deux réglages qui évitent les mauvaises surprises. Dans Batch Processing, mets une taille de lot de 1 et un délai de 1 500 ms. Dans les Settings du nœud, règle On Error sur Continue.

07
Recoller le devis et vérifier la sortie de l'IA

Ajoute un nœud Merge nommé « Recoller les infos du devis », mode Combine, By Position. Entrée 1 : la sortie de « Relance due ? ». Entrée 2 : la sortie de l’IA. Chaque relance est ainsi recollée à son devis.

Puis un If nommé « Relance rédigée ? » : condition {{ $json.output?.message ?? "" }} is not empty. Branche true : on continue. Branche false : l’IA a échoué pour ce devis.

⚠️
Pourquoi ce Merge, et pas une simple référence au nœud précédent

C’est le piège qui m’a coûté le plus de temps. Quand l’IA échoue sur un devis et réussit sur les autres, les réponses réussies perdent leur lien avec le devis d’origine. Résultat : le nœud suivant plante avec « Paired item data unavailable ». Le Merge par position recolle les morceaux sans dépendre de ce lien.

08
Le brouillon Gmail et la mise à jour du Sheet

Sur la branche true, ajoute un nœud Gmail nommé « Créer le brouillon » : ressource Draft, opération Create.

creer-le-brouillon.txt
Subject   : {{ $json.output.objet }}
Message   : {{ $json.output.message }}
To Email  : {{ $json.email }}   (à ajouter dans Options)

Puis un nœud Google Sheets « Mettre à jour le suivi », opération Update Row, colonne de correspondance numero :

mettre-a-jour-le-suivi.txt
numero           : {{ $('Recoller les infos du devis').item.json.numero }}
nb_relances      : {{ $('Recoller les infos du devis').item.json.relance_numero }}
derniere_relance : {{ $today.toISODate() }}
statut           : {{ $('Recoller les infos du devis').item.json.relance_numero >= $('Paramètres').first().json.delais_relance.length ? 'Sans réponse' : 'Envoyé' }}

Dans Options, ajoute Cell Format et choisis RAW. Sans ça, Google Sheets réinterprète ce que tu écris (dates, numéros), et les calculs du lendemain partent de travers.

09
Le récap Slack et l'alerte d'échec

Après « Mettre à jour le suivi », un nœud Slack « Récap Slack ». Dans ses Settings, active Execute Once pour recevoir un seul message, pas un par devis :

recap-slack.txt
📬 {{ $('Relance rédigée ?').all().length }} relance(s) de devis prête(s) dans tes brouillons Gmail :
{{ $('Relance rédigée ?').all().map(i => '• ' + i.json.client + ' — ' + i.json.numero + ' (' + i.json.montant_ht + ' € HT) · relance ' + i.json.relance_numero + '/3').join('\n') }}

Sur la branche false de « Relance rédigée ? », un second nœud Slack « Alerte relance non générée », lui aussi en Execute Once : il liste les devis concernés et précise que le suivi n’a pas été modifié. Pas de Slack ? Remplace ces deux nœuds par un email Gmail, ça marche pareil.


Le test réel : 6 devis, 4 relances

J’ai rempli le Sheet avec 6 devis au statut « Envoyé », dans des situations volontairement différentes. Le 16 octobre, le workflow a sélectionné les bons :

DevisSituationRésultat
D-2026-037 Agence HorizonEnvoyé il y a 18 jours, jamais relancéRelance n°1 (rattrapage)
D-2026-038 Boulangerie MartinEnvoyé il y a 3 joursRelance n°1
D-2026-039 Cabinet Petit1 relance, envoyé il y a 7 joursRelance n°2
D-2026-040 Maison Fontaine2 relances, envoyé il y a 14 joursRelance n°3, passe en « Sans réponse »
D-2026-041 Atelier LeroyEnvoyé la veilleRien, trop tôt
D-2026-042 Garage DupuisPas d’emailRien, écarté par le filtre

Exécution réelle du workflow de relance de devis dans n8n : 6 devis lus, 4 relances dues, 4 relances rédigées par l'IA en 28,4 secondes

Pendant ce test, j’ai neutralisé le brouillon Gmail et Slack pour ne pas écrire dans une vraie boîte. La lecture du Sheet, l’IA et la mise à jour du Sheet ont tourné pour de vrai. Voilà deux relances telles que l’IA les a rédigées :

Deux relances rédigées par l'IA : relance n°2 au tutoiement pour Marc qui attend la validation de ses associés, et relance n°3 de clôture pour Claire

Regarde la relance de Marc. Les notes disaient « Tutoiement OK. Attend la validation de ses associés ». L’IA tutoie, et propose 15 minutes pour aider Marc à répondre aux questions de ses associés. C’est exactement l’objection à lever. La relance de Claire, elle, clôt proprement.

Et le tableau, après le passage du workflow :

Onglet Devis de Google Sheets mis à jour par le workflow : nombre de relances et date de dernière relance, devis D-2026-040 passé en Sans réponse

J’ai relancé le workflow juste après : 0 devis dû, aucun doublon. Le calcul repart du Sheet, donc rejouer le workflow ne relance jamais deux fois le même jour.


Le coût réel, calculé

Le traçage de n8n donne la consommation de chaque appel à l’IA : 650 tokens en entrée et 123 en sortie par relance. Au tarif payant de Gemini 3.1 Flash-Lite (0,25 $ et 1,50 $ par million de tokens), ça fait :

cout-par-relance.txt
650 × 0,25 / 1 000 000  = 0,000163 $
123 × 1,50 / 1 000 000  = 0,000185 $
                  Total ≈ 0,00035 $ par relance

Les 24 relances mensuelles de Camille coûtent donc moins d’un centime. Côté n8n, le workflow tourne une fois par jour ouvré : environ 22 exécutions par mois, soit moins de 1 % du quota du plan Starter. En auto-hébergé, le coût marginal est nul.

Le vrai coût, c’est le temps de relecture : 30 secondes par brouillon. Et ça, je te conseille de le garder.


Les pièges (appris en les faisant)

⚠️
« Paired item data unavailable » quand l'IA échoue à moitié

Lors d’un test, l’IA a répondu pour 2 devis et échoué pour 2 autres. Le workflow a planté au nœud suivant, et aucune relance n’a été enregistrée, même les réussies. C’est ce qui justifie le duo Merge par position + If de l’étape 7. Depuis, un échec partiel donne des brouillons pour les devis réussis, une alerte pour les autres.

⚠️
Le palier gratuit de Gemini sature vite

Sur un test, 2 relances sur 4 sont tombées en erreur 429 (« too many requests »). Le palier gratuit limite le nombre d’appels par minute. Le lot de 1 avec 1,5 s de délai règle le problème pour quelques devis par jour. Au-delà, passe au palier payant : vu le coût par relance, ça ne se discute pas.

⚠️
Le workflow ne voit pas les réponses de tes clients

Si Julie répond « on signe ! » par email, le workflow ne le sait pas. Il faut passer son devis à « Signé » dans le Sheet. Comme les relances arrivent en brouillon, tu ne risques pas d’envoyer une relance gênante : tu la supprimes. Mais prends le réflexe de mettre le Sheet à jour.

⚠️
Une panne de l'IA ne doit rien modifier

J’ai eu une exécution où les 4 appels ont échoué (erreur 503, modèle surchargé). Résultat : une alerte, et un Sheet intact. Le lendemain, les mêmes devis sont repartis normalement. Si ton workflow écrit « relancé » dans le Sheet avant d’être sûr que la relance existe, tu perds des relances en silence.

💡
Les notes font toute la différence

Sans notes, l’IA écrit une relance correcte mais générique. Avec « budget serré, veut des résultats avant Noël », elle écrit une relance qui parle du vrai blocage. Une ligne de notes par devis, c’est le meilleur investissement de ce workflow.

⚠️
Données clients et palier gratuit

Les conditions du palier gratuit de l’API Gemini autorisent Google à utiliser les contenus envoyés pour améliorer ses produits. Pour des devis clients réels, passe au palier payant, ou utilise Claude ou OpenAI via leur API.


Adapter à ton activité

Autre métier. Un artisan qui envoie des devis de travaux n’a pas le même tempo qu’une consultante. Change delais_relance en [5, 12, 25] et réécris mon_activite. Le prompt s’adapte tout seul.

Autre outil de devis. Tes devis sont dans Pennylane, Axonaut ou une base Notion ? Remplace uniquement « Lire les devis en attente » par le nœud correspondant (ou une requête HTTP sur leur API). Tant que tu sors les mêmes champs (numero, email, date_envoi…), le reste du workflow ne change pas. Sur Outlook, remplace le nœud Gmail par Microsoft Outlook, opération Create Draft.

Plus de volume. Au-delà de quelques dizaines de relances par jour, passe le modèle au palier payant et garde le lot de 1. Et ajoute une colonne relancer (oui/non) pour exclure à la main les clients que tu préfères appeler.


Make ou n8n pour relancer tes devis ?

Les deux savent faire. J’ai choisi n8n pour ce tuto parce que la gestion fine des échecs de l’IA (Merge par position, branche d’alerte) y est plus naturelle, et que l’exécution ne coûte rien en auto-hébergé.

n8nMake
FacturationÀ l’exécution (cloud) ou gratuit (auto-hébergé)Au crédit : chaque module exécuté en consomme au moins 1
Ce workflow, par mois~22 exécutionsEnviron 300 à 450 crédits (≈ 15-20 modules par matin avec 4 relances)
Plan gratuitAuto-hébergé uniquement1 000 crédits/mois, sans carte bancaire
Prise en mainPlus techniquePlus visuelle, pas de serveur

Le calcul côté Make est une estimation à partir du nombre de modules, pas une mesure : vérifie dans l’historique de ton scénario après une semaine. Pour 8 à 10 devis par mois, Make tient dans le plan gratuit. Pour reconstruire la même logique : Google Sheets › Search Rows, un filtre sur les jours écoulés, un module IA, Gmail › Create a draft, puis Google Sheets › Update a Row.

Créer ton compte Make gratuitement →

Si tu préfères n8n sans gérer de serveur, la version cloud se teste sur n8n.io.


Tu as maintenant un système qui relance chacun de tes devis au bon moment, avec le bon ton, sans que tu aies à y penser. Le tableau te dit en un coup d’œil ce qui est en attente, signé ou mort, et ça vaut presque autant que les relances.

Combien de devis dorment dans ta boîte d’envoi depuis plus de 15 jours ?

Pour aller plus loin, combine ce workflow avec la facturation automatique Toggl → Stripe une fois le devis signé, ou démarre avec Make gratuitement si tu préfères l’approche sans serveur.

Dans la même veine

Tutos connexes.

La newsletter

Un workflow utile
à chaque tuto.

Pas de spam. Pas de théorie. Le fichier du workflow, le piège rencontré pendant le test, le chiffre relevé. Un email le mardi, quand un tuto sort.

Le kit gratuit · envoyé à l'inscription
8 workflows Make et n8n
prêts à importer
Désabonnement en 1 clic. Aucune pub. Aucun sponsor.