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 :
| Relance | Quand | Rôle | Longueur |
|---|---|---|---|
| n°1 | J+3 | Prendre des nouvelles, une seule question ouverte | 4 lignes |
| n°2 | J+7 | Lever une objection probable, proposer 15 min d’échange | 6 lignes |
| n°3 | J+14 | Clore le dossier poliment, laisser la porte ouverte | 4 lignes |
« 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.

12 nœuds, plus 2 sous-nœuds pour l’IA. Les choix qui comptent :
- Rien n’est envoyé automatiquement. Les relances arrivent en brouillon. Tu relis, tu ajustes un mot, tu envoies. C’est ce qui rend le workflow utilisable dès le premier jour.
- Le Google Sheet reste la source de vérité. Tu passes un devis à « Signé » ou « Perdu », les relances s’arrêtent. Pas de base cachée.
- Un échec de l’IA ne casse rien. Si le modèle ne répond pas, tu reçois une alerte et le Sheet n’est pas modifié : le workflow réessaie le lendemain.
Ce qu’il te faut
| Élément | À quoi ça sert | Coût |
|---|---|---|
| n8n (cloud ou auto-hébergé) | Faire tourner le workflow | Starter : 20 €/mois en annuel pour 2 500 exécutions. Auto-hébergé : gratuit hors serveur |
| Google Sheets | Le tableau de suivi des devis | Gratuit |
| Gmail | Recevoir les brouillons | Gratuit |
| Une clé API Gemini (Google AI Studio) | Rédiger les relances | Palier gratuit, ou 0,25 $ / 1,50 $ par million de tokens (entrée / sortie) |
| Slack (optionnel) | Récap du matin et alertes | Gratuit |
Tarifs vérifiés le 16 octobre 2026 sur n8n.io/pricing et la grille tarifaire de l’API Gemini.
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
Crée un Google Sheet avec un onglet Devis et ces colonnes, dans cet ordre :
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.
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 :
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.
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.
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.
Un nœud Edit Fields (Set) nommé « Calculer la relance due », avec Include Other Input Fields sur All. Il ajoute quatre champs à chaque devis :
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.
Un nœud Filter nommé « Relance due ? », avec trois conditions reliées par AND :
{{ $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.
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 :
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.
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.
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.
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.
Sur la branche true, ajoute un nœud Gmail nommé « Créer le brouillon » : ressource Draft, opération Create.
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 :
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.
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 :
📬 {{ $('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 :
| Devis | Situation | Résultat |
|---|---|---|
| D-2026-037 Agence Horizon | Envoyé il y a 18 jours, jamais relancé | Relance n°1 (rattrapage) |
| D-2026-038 Boulangerie Martin | Envoyé il y a 3 jours | Relance n°1 |
| D-2026-039 Cabinet Petit | 1 relance, envoyé il y a 7 jours | Relance n°2 |
| D-2026-040 Maison Fontaine | 2 relances, envoyé il y a 14 jours | Relance n°3, passe en « Sans réponse » |
| D-2026-041 Atelier Leroy | Envoyé la veille | Rien, trop tôt |
| D-2026-042 Garage Dupuis | Pas d’email | Rien, écarté par le filtre |

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 :

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 :

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 :
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)
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.
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.
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.
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.
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.
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é.
| n8n | Make | |
|---|---|---|
| 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écutions | Environ 300 à 450 crédits (≈ 15-20 modules par matin avec 4 relances) |
| Plan gratuit | Auto-hébergé uniquement | 1 000 crédits/mois, sans carte bancaire |
| Prise en main | Plus technique | Plus 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.