Sur cette page
- Le flux décide par des règles écrites : échue, non payée, au moins 7 jours de retard ; le nombre de relances déjà faites choisit le ton.
- Au-delà de deux relances, la règle s'arrête : le dossier part à une personne, sans courriel au client.
- Chaque relance passe par « Send and Wait for Approval » : la comptable la reçoit, et le flux attend son clic avant d'écrire au client.
- Le nœud Code se teste hors de n8n, sur les factures de l'atelier : le résultat se compare aux montants du classeur.
- n8n compte une exécution par passage du flux, quel que soit le nombre de nœuds : une par lundi.
Objectif
Refaire dans n8n la relance de l'atelier : un flux qui, chaque lundi, lit les factures dans Google Sheets, prépare les relances, demande l'accord de la comptable pour chacune, envoie celles qu'elle approuve, et note la relance dans le tableur.
Factures fabriquées : les sociétés, les adresses en « .example », qui ne reçoivent aucun courriel, et les montants sont inventés.
Données fournies
Le tableau des huit factures de l'atelier, à ouvrir dans Google Sheets. Retards comptés au 8 octobre 2026 ; le flux les recalcule à partir des échéances.
- Factures en retardTélécharger
Voir le tableau
Exercice de Meridal. Les sociétés, les adresses et les montants sont fabriqués pour l'exercice ; les adresses en « .example » ne reçoivent aucun courriel. Les retards sont comptés au 8 octobre 2026.
Données fournies N° Client Contact Montant TTC (€) Échéance Jours de retard Payée Relances déjà faites Pénalités de retard (€) Indemnité forfaitaire (€) F-2026-097 Société A compta@societe-a.example 1250,00 15/09/2026 23 non 0 F-2026-101 Société B factures@societe-b.example 4320,00 30/08/2026 39 non 1 F-2026-104 Société C admin@societe-c.example 860,40 30/09/2026 8 non 0 F-2026-108 Société D paiements@societe-d.example 2975,00 05/10/2026 3 oui 0 F-2026-110 Société E compta@societe-e.example 610,00 31/07/2026 69 non 2 F-2026-112 Société F contact@societe-f.example 3400,00 15/10/2026 0 non 0 F-2026-115 Société B factures@societe-b.example 1980,00 20/09/2026 18 oui 1 F-2026-118 Société G daf@societe-g.example 7200,00 25/09/2026 13 non 0 Les deux colonnes calculées
**Pénalités de retard** : un calcul indicatif, montant × taux × jours de retard ÷ 365, avec le taux par défaut du second semestre 2026, 12,40 %. Ce taux est calculé par Meridal d'après l'article L441-10 du code de commerce : le taux de la Banque centrale européenne en vigueur au 1er juillet 2026, 2,40 %, majoré de 10 points ; aucune autorité ne le publie. Votre contrat peut prévoir un autre taux, jamais inférieur à trois fois le taux de l'intérêt légal, soit 8,25 % au second semestre 2026.
**Indemnité forfaitaire** : 40 euros pour frais de recouvrement, dus de plein droit par tout professionnel en retard de paiement (article D441-5 du code de commerce).
Les pénalités sont dues sans qu'un rappel soit nécessaire ; la relance ne crée pas le droit, elle le rappelle.
Consignes
Le flux, nœud par nœud
-
1
Chaque lundi à 8 h · Schedule Trigger
intervalle Weeks, Trigger on Weekdays : Monday, Trigger at Hour : 8am -
2
Lire les factures · Google Sheets
Get Row(s), le classeur et l'onglet des factures, sans filtre -
3
Préparer les relances · Code
Run Once for All Items ; le code ci-dessous -
4
Relance ou personne · If
action est égal à personne -
5
Prévenir une personne · Gmail
Send, à la comptable : le motif, sans écrire au client -
6
Une facture à la fois · Loop Over Items
Batch Size : 1 -
7
Faire approuver · Gmail
Send and Wait for Approval, à la comptable ; Approve and Disapprove -
8
Approuvée ? · If
la réponse d'approbation, lue dans la sortie du nœud précédent -
9
Écrire au client · Gmail
Send, au contact de la facture, avec l'objet et le texte préparés -
10
Noter la relance · Google Sheets
Update Row : Relances déjà faites plus un, repéré par le N°
- Ouvrez le tableau dans Google Sheets. Mettez votre propre adresse dans la colonne Contact de deux factures, pour recevoir de vrais courriels ; laissez les autres en « .example ».
- Dans n8n, créez les identifiants Google pour Sheets et pour Gmail, puis les dix nœuds de la figure.
- Collez le code du nœud 3, et lancez le flux à la main, avec le bouton d'essai : regardez la sortie de chaque nœud.
- Approuvez une relance, refusez-en une, laissez une sans réponse ; regardez ce qui part, et ce qui est noté dans le tableur.
- Ajoutez un flux d'erreur qui vous prévient si une exécution échoue.
- Enregistrez et publiez le flux : un déclencheur programmé ne part que sur un flux publié.
preparer-relances.js// Nœud Code de n8n, mode « Run Once for All Items » : une ligne par facture lue dans le tableur.
// Garde les factures échues et non payées ; prépare la relance ; envoie le reste à une personne.
const AUJOURDHUI = new Date('2026-10-08T12:00:00'); // pour l'exercice ; en service : new Date()
const SEUIL_JOURS = 7; // pas de relance avant 7 jours de retard
const TAUX = 0.124; // taux par défaut, second semestre 2026 (voir l'atelier)
const nombre = (v) => typeof v === 'number' ? v : Number(String(v).replace(/\s/g, '').replace(',', '.'));
const date = (v) => {
const m = String(v).match(/^(\d{2})\/(\d{2})\/(\d{4})$/); // 15/09/2026
return m ? new Date(`${m[3]}-${m[2]}-${m[1]}T12:00:00`) : new Date(`${v}T12:00:00`);
};
const euros = (x) => x.toLocaleString('fr-FR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' €';
const sortie = [];
for (const item of $input.all()) {
const f = item.json;
if (f['Payée'] === 'oui') continue;
const jours = Math.round((AUJOURDHUI - date(f['Échéance'])) / 86400000);
if (jours < SEUIL_JOURS) continue;
const montant = nombre(f['Montant TTC (€)']);
const relances = nombre(f['Relances déjà faites']);
const base = { numero: f['N°'], client: f['Client'], contact: f['Contact'], montant, jours, relances };
if (relances >= 2) { // la suite se décide par une personne
sortie.push({ json: { ...base, action: 'personne',
motif: `${relances} relances déjà faites, ${jours} jours de retard : la suite se décide par une personne.` } });
continue;
}
const penalites = Math.round(montant * TAUX * jours / 365 * 100) / 100;
const objet = `Facture ${f['N°']} : ${relances === 0 ? 'rappel' : 'deuxième rappel'}`;
let texte = `Bonjour,\n\nSauf erreur de notre part, la facture ${f['N°']}, d'un montant de ${euros(montant)} TTC, `
+ `arrivée à échéance le ${f['Échéance']}, reste à régler, soit ${jours} jours de retard.`;
if (relances === 1) {
texte += `\n\nÀ ce jour, les pénalités de retard s'élèvent à ${euros(penalites)}, auxquelles s'ajoute `
+ `l'indemnité forfaitaire de 40,00 € pour frais de recouvrement.`;
}
texte += `\n\nSi le règlement est déjà parti, merci de ne pas tenir compte de ce message.\n\nBien cordialement,`;
sortie.push({ json: { ...base, action: 'relance', penalites, objet, texte } });
}
return sortie;Le nœud Code exécute du JavaScript ; dans le mode « Run Once for All Items », par défaut, il tourne une fois pour toutes les lignes reçues. La date est figée au 8 octobre 2026 pour que vos résultats se comparent à la correction ; en service, new Date(). Les pénalités suivent le taux et la formule de l'atelier.
Critères de réussite
Indications
Le nœud Code ne rend rien
CauseLes noms de colonnes lus dans Sheets ne sont pas ceux du code : un accent, une majuscule, une parenthèse.
À faireRegardez la sortie du nœud Google Sheets, et recopiez les noms tels quels : « Payée », « Échéance », « Montant TTC (€) ».
Toutes les factures partent en relance
CauseLes dates arrivent dans une autre forme que JJ/MM/AAAA, et le calcul des jours échoue.
À faireLe code lit JJ/MM/AAAA et AAAA-MM-JJ ; regardez la forme reçue dans la sortie de Sheets.
La comptable reçoit toutes les demandes d'un coup, ou une seule
CauseLa boucle n'est pas en place, ou sa taille de lot n'est pas 1.
À faireLoop Over Items, Batch Size : 1, et le retour vers la boucle après le dernier nœud.
Le flux n'est pas parti lundi
CauseLe flux n'est pas publié, ou le fuseau horaire de l'instance n'est pas le bon.
À fairePubliez-le ; réglez le fuseau horaire (n8n : mise en place).
Des exécutions restent en attente
CauseUne demande d'approbation sans réponse garde son exécution ouverte.
À faireC'est voulu : rien ne part. Pour une approbation plus complexe, n8n conseille le nœud Wait, qui peut limiter le temps d'attente.
Une relance est partie deux fois
CauseLe flux a tourné deux fois avant la mise à jour du tableur.
À faireLe nœud 10 juste après l'envoi ; et un essai à la main sur des adresses en « .example » seulement.
Correction commentée
Ouvrir la correction
Le nœud Code, exécuté par Meridal hors de n8n : un petit programme lit les huit factures de l'atelier, les passe au code comme le ferait n8n, et affiche le résultat.
essai.mjs// Essai du nœud Code hors de n8n : $input est remplacé par les huit factures de l'atelier.
import { readFileSync } from 'node:fs';
const md = readFileSync(new URL('../../../automatiser/atelier-relance/fichiers/factures-en-retard.md', import.meta.url), 'utf8');
const lignes = md.split('\n').filter((l) => l.startsWith('| F-'));
const tete = md.split('\n').find((l) => l.startsWith('| N°')).split('|').slice(1, -1).map((c) => c.trim());
const items = lignes.map((l) => {
const cases = l.split('|').slice(1, -1).map((c) => c.trim());
return { json: Object.fromEntries(tete.map((t, i) => [t, cases[i]])) };
});
const code = readFileSync(new URL('./preparer-relances.js', import.meta.url), 'utf8');
const resultat = new Function('$input', code)({ all: () => items });
for (const { json: r } of resultat) {
console.log(`${r.numero} ${r.client} ${r.jours} jours ${r.action === 'relance' ? r.objet : 'à une personne'}`);
}
const deux = resultat.find((r) => r.json.objet && r.json.objet.includes('deuxième'));
console.log('\n--- ' + deux.json.objet + ' ---\n' + deux.json.texte);node essai.mjsF-2026-097 Société A 23 jours Facture F-2026-097 : rappelF-2026-101 Société B 39 jours Facture F-2026-101 : deuxième rappelF-2026-104 Société C 8 jours Facture F-2026-104 : rappelF-2026-110 Société E 69 jours à une personneF-2026-118 Société G 13 jours Facture F-2026-118 : rappel --- Facture F-2026-101 : deuxième rappel ---Bonjour, Sauf erreur de notre part, la facture F-2026-101, d'un montant de 4 320,00 € TTC, arrivée à échéance le 30/08/2026, reste à régler, soit 39 jours de retard. À ce jour, les pénalités de retard s'élèvent à 57,24 €, auxquelles s'ajoute l'indemnité forfaitaire de 40,00 € pour frais de recouvrement. Si le règlement est déjà parti, merci de ne pas tenir compte de ce message. Bien cordialement,
Exécuté le 9 octobre 2026 avec Node.js 22.17.0. Le flux complet dans n8n n'a pas encore été exécuté par Meridal.
Les trois écartées. F-2026-108 et F-2026-115 sont payées ; F-2026-112 arrive à échéance le 15 octobre. Une règle les écarte avant toute écriture, sans IA.
La Société E. Deux relances sans effet, 69 jours de retard : la suite, une mise en demeure, un appel, un arrangement, se décide par une personne qui connaît le client. Le flux le lui signale ; il n'écrit pas au client.
Ce qui compte le plus. L'ordre des nœuds 7 à 10 : l'approbation avant l'envoi, la mise à jour du tableur après. Un flux qui écrit au client puis demande l'avis de la comptable n'a pas d'approbation, il a un compte rendu.
Extensions
- Un texte rédigé par l'IA : un nœud de modèle à la place du texte fixe, avec la consigne de n'utiliser que les données de la facture ; l'approbation reste. n8n propose des nœuds pour les modèles d'OpenAI, d'Anthropic, de Mistral et d'autres.
- Un agent qui choisit ses outils : n8n peut exiger l'accord d'une personne avant chaque outil d'un agent ; il le recommande pour les envois (un agent en entreprise de bout en bout).
- Un tableur qui reste juste : la date de la dernière relance dans une colonne de plus, remplie par le nœud 10.
- Le même flux ailleurs : Power Automate, Make ou Zapier (les outils d'automatisation).
Lectures suivantes
Projet : une relance automatique avec validation sur n8n
Progression par projets · étape 6 sur 12
Les pages qui renvoient ici
Limites et sources
Les factures et les sociétés sont fabriquées ; le nœud Code a été exécuté hors de n8n, sur ces factures ; le flux complet n'a pas encore été exécuté par Meridal.
Les noms des nœuds et des réglages sont ceux de la documentation de n8n, lue le 9 octobre 2026, en anglais.
- n8n, Gmail, Send and Wait for Approval ; n8n, Google Sheets ; n8n, le nœud Code ; n8n, Loop Over Items ; n8n, Schedule Trigger.
- Le code :
apprendre/pages/projets/projet-relance-n8n/code/.
Écrit par Meridal, avec l'aide de l'IA ; chaque fait vérifié à sa source et relu avant publication. Texte et schémas sous licence CC BY 4.0 : reprenez-les en citant Meridal. Le code sous licence MIT.
Ne plus recopier d'un logiciel à l'autre
1 100 € à 3 400 €, puis sur devis