Pourquoi choisir n8n pour l'automatisation email ?
La plupart des outils d'automatisation email (Mailchimp, ActiveCampaign, HubSpot) facturent par contact et vous enferment dans leur plateforme. n8n adopte une approche différente : open-source, self-hosted, il traite l'email comme un simple node dans un workflow plus large — aux côtés de Stripe, des CRM, des tableurs et des API d'IA.
C'est décisif quand votre logique email dépend d'événements externes : un paiement réussi, un ticket support clôturé, un formulaire soumis, une ligne de base de données modifiée. n8n gère ces déclencheurs nativement. Sans colle Zapier. Sans copies de données entre plateformes.
| Plateforme | Coût mensuel (10k emails) | Self-hosted ? | Personnalisation IA ? |
|---|
| n8n + SES | ~15 EUR | ✅ Oui | ✅ Via Claude API |
| Mailchimp | ~100 USD | ❌ Non | ⚠️ Limitée |
| ActiveCampaign | ~149 USD | ❌ Non | ⚠️ Basique |
| HubSpot Marketing | ~800 USD | ❌ Non | ✅ Intégrée |
| Zapier + Mailgun | ~50 USD | ❌ Non | ⚠️ Via étape OpenAI |
Prérequis : n8n installé en 5 minutes
Si n8n n'est pas encore en place, voici la méthode la plus rapide. Le self-hosting sur un VPS à 5 EUR/mois (Hetzner, DigitalOcean) est recommandé pour la production.
# docker-compose.yml — copiez et lancez
version: "3.8"
services:
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=changez_ce_mot_de_passe
- WEBHOOK_URL=https://votre-domaine.com
- N8N_ENCRYPTION_KEY=votre_cle_32_caracteres
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
# Démarrage :
# docker compose up -d
# Accès : http://localhost:5678 (ou votre domaine)
Pour l'envoi d'emails, vous aurez besoin des identifiants d'un fournisseur :
- Amazon SES : 1 USD/1 000 emails — idéal pour les gros volumes. Vérifiez votre domaine, créez des identifiants SMTP et ajoutez-les au node Envoyer un Email de n8n.
- SendGrid : Gratuit jusqu'à 100/jour, puis 19,95 USD/mois pour 50k — bonne délivrabilité, API facile. Utilisez le node SendGrid de n8n.
- Gmail OAuth2 : Gratuit, jusqu'à 2 000 emails/jour — parfait pour les automatisations internes. Configurez les identifiants Google Cloud OAuth2 dans n8n.
- Mailgun : Pay-as-you-go, 0,80 USD/1 000 emails — fiable pour le transactionnel. Utilisez le node Requête HTTP avec l'API Mailgun.
Les 10 templates ci-dessous utilisent le node Envoyer un Email (SMTP) ou le nodeRequête HTTPciblant l'API SendGrid. Remplacez simplement par vos propres identifiants.
Template 1 : Séquence de Bienvenue Nouvel Utilisateur (3 Emails)
Cas d'usage
Quand un nouvel utilisateur s'inscrit (via webhook, formulaire ou insertion en base de données), déclenchez une séquence de bienvenue échelonnée : confirmation immédiate, conseils d'onboarding à 24h, et prise de nouvelles à J+7. Sans automatisation, cela demande des relances manuelles ou une plateforme coûteuse. Avec n8n, vous configurez une fois pour toutes.
Résultats attendus
- Temps économisé : 2h/semaine de relances manuelles supprimées
- Amélioration du taux d'activation : +20 à +35% (benchmark industrie pour les séquences de bienvenue)
- Coût : 0,003 EUR par nouvel utilisateur (3 emails via SES)
JSON du workflow n8n
{
"name": "Séquence Bienvenue - 3 Emails",
"nodes": [
{
"name": "Webhook Déclencheur",
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "nouvel-utilisateur",
"httpMethod": "POST",
"responseMode": "onReceived"
},
"position": [250, 300]
},
{
"name": "Email 1 — Bienvenue (Immédiat)",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "bonjour@votreentreprise.com",
"toEmail": "={{ $json.email }}",
"subject": "Bienvenue, {{ $json.prenom }} ! Voici comment démarrer",
"emailType": "html",
"html": "<h1>Bienvenue, {{ $json.prenom }} !</h1><p>Nous sommes ravis de vous accueillir...</p>"
},
"position": [450, 300]
},
{
"name": "Attente 24h",
"type": "n8n-nodes-base.wait",
"parameters": { "amount": 24, "unit": "hours" },
"position": [650, 300]
},
{
"name": "Email 2 — Conseils d'Onboarding",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "bonjour@votreentreprise.com",
"toEmail": "={{ $node['Webhook Déclencheur'].json.email }}",
"subject": "3 astuces pour tirer le meilleur de [Produit]",
"emailType": "html",
"html": "<h2>Prêt à aller plus loin ?</h2><p>Voici vos 3 premières étapes...</p>"
},
"position": [850, 300]
},
{
"name": "Attente 6 Jours",
"type": "n8n-nodes-base.wait",
"parameters": { "amount": 6, "unit": "days" },
"position": [1050, 300]
},
{
"name": "Email 3 — Prise de Nouvelles J+7",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "bonjour@votreentreprise.com",
"toEmail": "={{ $node['Webhook Déclencheur'].json.email }}",
"subject": "Comment se passe votre expérience, {{ $node['Webhook Déclencheur'].json.prenom }} ?",
"emailType": "html",
"html": "<p>Cela fait une semaine — des questions ? Répondez directement à cet email.</p>"
},
"position": [1250, 300]
}
],
"connections": {
"Webhook Déclencheur": { "main": [[ { "node": "Email 1 — Bienvenue (Immédiat)", "type": "main", "index": 0 } ]] },
"Email 1 — Bienvenue (Immédiat)": { "main": [[ { "node": "Attente 24h", "type": "main", "index": 0 } ]] },
"Attente 24h": { "main": [[ { "node": "Email 2 — Conseils d'Onboarding", "type": "main", "index": 0 } ]] },
"Email 2 — Conseils d'Onboarding": { "main": [[ { "node": "Attente 6 Jours", "type": "main", "index": 0 } ]] },
"Attente 6 Jours": { "main": [[ { "node": "Email 3 — Prise de Nouvelles J+7", "type": "main", "index": 0 } ]] }
}
}
Comment importer: dans n8n, cliquez sur l'icône menu → Importer depuis JSON → collez la configuration ci-dessus. Mettez à jour les champs fromEmail et les templates HTML pour correspondre à votre charte.
Astuce pro : Ajoutez un node Vérification Désinscription avant chaque email qui interroge votre liste de suppression (PostgreSQL ou Airtable). Cela vous maintient automatiquement en conformité RGPD/CAN-SPAM.
Template 2 : Confirmation de Commande + Notification d'Expédition
Cas d'usage
Déclenché par un webhook de paiement Stripe réussi ou un événement de commande WooCommerce. Envoie une confirmation de commande immédiate, puis un second email quand le statut passe à "expédié" (interrogé depuis votre base de données ou API e-commerce toutes les 30 minutes).
Résultats attendus
- Tickets support réduits : -40% d'emails "où est ma commande ?" (remplace les mises à jour d'expédition manuelles)
- Coût : 0,001 EUR par commande (2 emails via SES)
- Temps de mise en place : 45 minutes une fois, tourne indéfiniment
{
"name": "Confirmation Commande + Expédition",
"nodes": [
{
"name": "Webhook Stripe",
"type": "n8n-nodes-base.webhook",
"parameters": { "path": "stripe-paiement", "httpMethod": "POST" },
"position": [250, 300]
},
{
"name": "Filtre: payment_intent.succeeded",
"type": "n8n-nodes-base.if",
"parameters": {
"conditions": {
"string": [{
"value1": "={{ $json.type }}",
"operation": "equals",
"value2": "payment_intent.succeeded"
}]
}
},
"position": [450, 300]
},
{
"name": "Email Confirmation Commande",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "commandes@votreboutique.com",
"toEmail": "={{ $json.data.object.receipt_email }}",
"subject": "Commande confirmée — #{{ $json.data.object.metadata.order_id }}",
"emailType": "html",
"html": "<h1>Merci pour votre commande !</h1><p>Commande #{{ $json.data.object.metadata.order_id }} confirmée.</p><p>Montant : {{ ($json.data.object.amount / 100).toFixed(2) }} EUR</p><p>Nous vous enverrons un email dès l'expédition.</p>"
},
"position": [650, 200]
},
{
"name": "Vérification Statut Toutes les 30min",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": { "interval": [{ "field": "minutes", "minutesInterval": 30 }] }
},
"position": [250, 500]
},
{
"name": "Commandes Expédiées en BDD",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT * FROM commandes WHERE statut = 'expediee' AND email_expedition_envoye = false LIMIT 50"
},
"position": [450, 500]
},
{
"name": "Email Notification Expédition",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "commandes@votreboutique.com",
"toEmail": "={{ $json.email_client }}",
"subject": "Votre commande #{{ $json.id_commande }} est en route !",
"emailType": "html",
"html": "<h1>Bonne nouvelle — c'est parti !</h1><p>Suivi : <a href='{{ $json.url_suivi }}'>{{ $json.numero_suivi }}</a></p>"
},
"position": [650, 500]
},
{
"name": "Marquer Email Envoyé en BDD",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "UPDATE commandes SET email_expedition_envoye = true WHERE id_commande = '{{ $json.id_commande }}'"
},
"position": [850, 500]
}
]
}
Template 3 : Digest Hebdomadaire Personnalisé par IA
Cas d'usage
Chaque lundi à 8h, récupérez l'activité de la semaine depuis votre base de données (ou Notion, Airtable), faites-la passer par l'API Claude pour rédiger un résumé personnalisé pour chaque utilisateur, puis envoyez-le. Aucun digest n'est identique — Claude adapte le ton et les points saillants selon l'activité récente de chaque utilisateur.
Résultats attendus
- Taux d'ouverture : 45–55% (vs. 20% pour les newsletters génériques — les digests personnalisés surperforment constamment)
- Coût : 0,002 EUR par utilisateur par semaine (Claude Haiku pour la synthèse + SES)
- Temps économisé : 4h/semaine de reporting manuel pour des équipes jusqu'à 500 utilisateurs
{
"name": "Digest Hebdomadaire IA",
"nodes": [
{
"name": "Planification : Lundi 8h",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [{
"field": "cronExpression",
"expression": "0 8 * * 1"
}]
}
},
"position": [250, 300]
},
{
"name": "Récupération Utilisateurs Actifs",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT user_id, email, prenom, stats_semaine FROM utilisateurs WHERE actif = true AND digest_opt_in = true"
},
"position": [450, 300]
},
{
"name": "Boucle Utilisateurs",
"type": "n8n-nodes-base.splitInBatches",
"parameters": { "batchSize": 1 },
"position": [650, 300]
},
{
"name": "Claude : Génération Résumé Personnalisé",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "https://api.anthropic.com/v1/messages",
"headers": {
"x-api-key": "={{ $env.ANTHROPIC_API_KEY }}",
"anthropic-version": "2023-06-01",
"content-type": "application/json"
},
"body": {
"model": "claude-haiku-4-5-20251001",
"max_tokens": 300,
"messages": [{
"role": "user",
"content": "Rédigez un digest hebdomadaire sympathique en 3 phrases pour {{ $json.prenom }}. Activité cette semaine : {{ JSON.stringify($json.stats_semaine) }}. Mettez en valeur les progrès réalisés, pas seulement les chiffres. Soyez encourageant et précis."
}]
},
"bodyContentType": "json"
},
"position": [850, 300]
},
{
"name": "Envoi Email Digest",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "digest@votreapp.com",
"toEmail": "={{ $node['Boucle Utilisateurs'].json.email }}",
"subject": "Votre semaine en résumé, {{ $node['Boucle Utilisateurs'].json.prenom }} 📊",
"emailType": "html",
"html": "<h2>Votre semaine en résumé</h2><p>{{ $json.content[0].text }}</p><hr/><p><a href='https://votreapp.com/tableau-de-bord'>Voir les statistiques complètes →</a></p><p style='font-size:12px;color:#888;'><a href='{{ $env.UNSUBSCRIBE_BASE_URL }}?email={{ $node["Boucle Utilisateurs"].json.email }}'>Se désinscrire</a></p>"
},
"position": [1050, 300]
}
]
}
Calcul du coût pour 500 utilisateurs/semaine : Claude Haiku à 0,00025 USD/1K tokens d'entrée + 0,00125 USD/1K tokens de sortie. Chaque résumé : ~100 tokens d'entrée + ~80 tokens de sortie = 0,000125 USD/utilisateur. 500 utilisateurs = 0,06 USD/semaine. Ajoutez SES (0,50 USD pour 1 000) = 0,25 USD. Total : moins de 1 USD/semaine pour un digest entièrement personnalisé par IA.
Template 4 : Séquence de Relance Facture Impayée
Cas d'usage
Vérifie quotidiennement votre système de facturation (Stripe, QuickBooks ou PostgreSQL) pour les factures en retard. Envoie des relances progressivement plus fermes à J+1, J+7 et J+14 de retard. S'arrête automatiquement au paiement. Escalade vers un humain à J+30.
Résultats attendus
- Taux de recouvrement : 35–60% des factures impayées réglées dans les 14 jours avec des relances automatisées (vs. 15% sans)
- Temps économisé : 3–5h/semaine de relances manuelles pour les entreprises avec 50+ clients
- Coût : 0,003 EUR par facture (3 emails maximum)
{
"name": "Séquence Relance Facture",
"nodes": [
{
"name": "Vérification Quotidienne 9h",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": { "interval": [{ "field": "cronExpression", "expression": "0 9 * * *" }] }
},
"position": [250, 300]
},
{
"name": "Récupération Factures Impayées",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT facture_id, email_client, nom_client, montant, date_echeance, jours_retard, nb_relances FROM factures WHERE statut = 'impayee' AND date_echeance < NOW() AND nb_relances < 3"
},
"position": [450, 300]
},
{
"name": "Routage selon Jours de Retard",
"type": "n8n-nodes-base.switch",
"parameters": {
"dataType": "number",
"value1": "={{ $json.jours_retard }}",
"rules": {
"rules": [
{ "operation": "between", "value1": 1, "value2": 6, "output": 0 },
{ "operation": "between", "value1": 7, "value2": 13, "output": 1 },
{ "operation": "largerEqual", "value1": 14, "output": 2 }
]
}
},
"position": [650, 300]
},
{
"name": "Relance 1 — Amicale (J1-6)",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "facturation@votreentreprise.com",
"toEmail": "={{ $json.email_client }}",
"subject": "Facture #{{ $json.facture_id }} — Petit rappel",
"emailType": "html",
"html": "<p>Bonjour {{ $json.nom_client }},</p><p>Petit rappel amical : la facture #{{ $json.facture_id }} de {{ $json.montant }} EUR était due le {{ $json.date_echeance }}.</p><p><a href='{{ $env.LIEN_PAIEMENT_BASE }}/{{ $json.facture_id }}'>Régler maintenant →</a></p>"
},
"position": [850, 150]
},
{
"name": "Relance 2 — Ferme (J7-13)",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "facturation@votreentreprise.com",
"toEmail": "={{ $json.email_client }}",
"subject": "Action requise : Facture #{{ $json.facture_id }} en retard de {{ $json.jours_retard }} jours",
"emailType": "html",
"html": "<p>Bonjour {{ $json.nom_client }},</p><p>La facture #{{ $json.facture_id }} accuse {{ $json.jours_retard }} jours de retard. Merci de régulariser dans les meilleurs délais pour éviter des pénalités.</p><p><a href='{{ $env.LIEN_PAIEMENT_BASE }}/{{ $json.facture_id }}'>Régler {{ $json.montant }} EUR →</a></p>"
},
"position": [850, 300]
},
{
"name": "Relance 3 — Urgente (J14+)",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "facturation@votreentreprise.com",
"toEmail": "={{ $json.email_client }}",
"subject": "URGENT : Facture #{{ $json.facture_id }} — Dernier avis avant mise en recouvrement",
"emailType": "html",
"html": "<p>Bonjour {{ $json.nom_client }},</p><p>Ceci est un dernier avis automatique. La facture #{{ $json.facture_id }} accuse {{ $json.jours_retard }} jours de retard. Sans règlement sous 48h, votre dossier sera transmis à notre service de recouvrement.</p><p><a href='{{ $env.LIEN_PAIEMENT_BASE }}/{{ $json.facture_id }}'>Régler maintenant →</a></p>"
},
"position": [850, 450]
},
{
"name": "Incrémenter Compteur Relances",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "UPDATE factures SET nb_relances = nb_relances + 1, derniere_relance = NOW() WHERE facture_id = '{{ $json.facture_id }}'"
},
"position": [1050, 300]
}
]
}
Template 5 : Récupération de Panier Abandonné
Cas d'usage
Détecte quand un panier est inactif depuis 1 heure (article ajouté mais pas d'achat). Envoie un email de récupération avec le contenu du panier et un code de réduction limité dans le temps. Un second email à 24h si toujours pas converti.
Résultats attendus
- Taux de récupération : 5–15% des paniers abandonnés récupérés (moyenne industrie : 8%)
- Revenu par email : en moyenne 12-18 EUR récupérés par email envoyé
- Coût : 0,001 EUR par panier (2 emails)
{
"name": "Récupération Panier Abandonné",
"nodes": [
{
"name": "Vérification Horaire",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": { "interval": [{ "field": "hours", "hoursInterval": 1 }] }
},
"position": [250, 300]
},
{
"name": "Paniers Abandonnés en BDD",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT panier_id, email_utilisateur, nom_utilisateur, articles, total FROM paniers WHERE statut = 'actif' AND mis_a_jour_le < NOW() - INTERVAL '1 hour' AND mis_a_jour_le > NOW() - INTERVAL '2 hours' AND email_recuperation_1_envoye = false"
},
"position": [450, 300]
},
{
"name": "Génération Code Promo",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const code = 'ECO10-' + Math.random().toString(36).substr(2, 8).toUpperCase(); return [{ ...item.json, code_promo: code }];"
},
"position": [650, 300]
},
{
"name": "Email 1 — Rappel Panier avec Réduction",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "boutique@votremagasin.com",
"toEmail": "={{ $json.email_utilisateur }}",
"subject": "Vous avez oublié quelque chose, {{ $json.nom_utilisateur }} — 10% de remise pour finaliser",
"emailType": "html",
"html": "<h2>Votre panier vous attend !</h2><p>Voici ce que vous avez laissé :</p><pre>{{ JSON.stringify($json.articles, null, 2) }}</pre><p>Total : {{ $json.total }} EUR</p><p>Utilisez le code <strong>{{ $json.code_promo }}</strong> pour 10% de remise. Expire dans 24h.</p><p><a href='{{ $env.URL_BOUTIQUE }}/panier/{{ $json.panier_id }}'>Finaliser ma commande →</a></p>"
},
"position": [850, 300]
}
]
}
Template 6 : Mise à Jour Statut Ticket Support
Cas d'usage
Dès qu'un ticket support change de statut dans votre helpdesk (Zendesk, Freshdesk ou une table PostgreSQL), envoyez automatiquement un email au client avec la mise à jour. Aucun agent n'a besoin de copier-coller manuellement les messages de statut.
Résultats attendus
- Amélioration CSAT : +12 points en moyenne (les clients détestent le silence — les mises à jour proactives changent tout)
- Temps agent économisé : 30 min/agent/jour supprimés des emails de mise à jour de statut
- Coût : 0,0005 EUR par mise à jour de ticket (1 email via SES)
{
"name": "Mise à Jour Statut Ticket Support",
"nodes": [
{
"name": "Webhook Zendesk",
"type": "n8n-nodes-base.webhook",
"parameters": { "path": "mise-a-jour-ticket", "httpMethod": "POST" },
"position": [250, 300]
},
{
"name": "Association Statut → Message",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const messages = { 'ouvert': 'Votre ticket a été ouvert et assigné à notre équipe.', 'en_attente': 'Nous avons besoin d\'informations supplémentaires. Merci de répondre à cet email.', 'resolu': 'Votre ticket a été résolu. Si le problème persiste, répondez sous 7 jours pour le rouvrir.', 'ferme': 'Ce ticket a été clôturé. Merci de votre patience.' }; return [{ ...item.json, message_statut: messages[item.json.statut_ticket] || 'Votre ticket a été mis à jour.' }];"
},
"position": [450, 300]
},
{
"name": "Envoi Mise à Jour Statut",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "support@votreentreprise.com",
"toEmail": "={{ $json.email_demandeur }}",
"subject": "[Ticket #{{ $json.id_ticket }}] Statut : {{ $json.statut_ticket }}",
"emailType": "html",
"html": "<p>Bonjour {{ $json.nom_demandeur }},</p><p>{{ $json.message_statut }}</p><p><strong>Ticket #{{ $json.id_ticket }}</strong> : {{ $json.sujet_ticket }}</p><p><a href='{{ $json.url_ticket }}'>Voir le ticket →</a></p>"
},
"position": [650, 300]
}
]
}
Template 7 : Qualification IA Lead + Routage
Cas d'usage
Quand un prospect soumet un formulaire de contact, Claude analyse son message pour attribuer un score (A/B/C), identifier son besoin principal et rédiger une réponse personnalisée. La réponse est envoyée automatiquement pour les leads C ; les leads A et B reçoivent un draft envoyé au commercial assigné pour un workflow d'approbation en 1 clic.
Résultats attendus
- Délai de réponse : De 24h en moyenne à moins de 5 minutes pour tous les leads
- Temps de qualification : 15 min par lead → 30 secondes (Claude fait la lecture)
- Coût : 0,002 EUR par lead (classification Claude Haiku + brouillon de réponse)
{
"name": "Qualification Lead + Réponse Auto",
"nodes": [
{
"name": "Webhook Formulaire",
"type": "n8n-nodes-base.webhook",
"parameters": { "path": "formulaire-contact", "httpMethod": "POST" },
"position": [250, 300]
},
{
"name": "Claude : Qualification Lead",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "https://api.anthropic.com/v1/messages",
"headers": {
"x-api-key": "={{ $env.ANTHROPIC_API_KEY }}",
"anthropic-version": "2023-06-01",
"content-type": "application/json"
},
"body": {
"model": "claude-haiku-4-5-20251001",
"max_tokens": 500,
"messages": [{
"role": "user",
"content": "Analysez ce lead et répondez en JSON. Lead : Nom={{ $json.nom }}, Entreprise={{ $json.entreprise }}, Message={{ $json.message }}.
Répondez UNIQUEMENT avec : {"score": "A|B|C", "besoin_principal": "...", "brouillon_reponse": "..."}.
A = budget élevé + urgent + besoin clair. B = potentiel moyen. C = vague ou pas adapté.
Le brouillon_reponse doit être personnalisé selon leur message spécifique (2-3 phrases)."
}]
},
"bodyContentType": "json"
},
"position": [450, 300]
},
{
"name": "Parsing Réponse Claude",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const rep = JSON.parse(item.json.content[0].text); return [{ ...item.json, score: rep.score, besoin_principal: rep.besoin_principal, brouillon_reponse: rep.brouillon_reponse }];"
},
"position": [650, 300]
},
{
"name": "A/B : Envoi au Commercial pour Approbation",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "crm@votreentreprise.com",
"toEmail": "commercial@votreentreprise.com",
"subject": "[Lead {{ $json.score }}] {{ $json.nom }} de {{ $json.entreprise }}",
"emailType": "html",
"html": "<p><strong>Nouveau lead score {{ $json.score }} :</strong></p><p>Nom : {{ $json.nom }}<br>Entreprise : {{ $json.entreprise }}<br>Besoin : {{ $json.besoin_principal }}</p><p><strong>Réponse suggérée :</strong></p><blockquote>{{ $json.brouillon_reponse }}</blockquote><p><a href='{{ $env.CRM_URL }}/approuver/{{ $json.lead_id }}'>Approuver et envoyer →</a></p>"
},
"position": [1050, 150]
},
{
"name": "C : Envoi Automatique Réponse",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "bonjour@votreentreprise.com",
"toEmail": "={{ $json.email }}",
"subject": "Re : Votre demande",
"emailType": "html",
"html": "<p>Bonjour {{ $json.nom }},</p><p>{{ $json.brouillon_reponse }}</p><p>Cordialement,<br>L'équipe</p>"
},
"position": [1050, 450]
}
]
}
Template 8 : Séquence d'Onboarding Employé
Cas d'usage
Déclenché quand les RH ajoutent un nouvel employé dans le SIRH (BambooHR, Personio ou un tableur). Envoie un email de bienvenue avant l'arrivée, la logistique J+1, un guide de configuration des outils J+2, un check-in à la fin de la semaine 1, et une demande de feedback à 30 jours. La séquence s'arrête si l'employé est marqué inactif.
Résultats attendus
- Temps d'adaptation : -20% (livraison structurée de l'information vs. briefings verbaux)
- Temps RH économisé : 3h par nouvelle recrue supprimées
- Coût : 0,005 EUR par employé (5 emails sur 30 jours)
{
"name": "Onboarding Employé",
"nodes": [
{
"name": "Webhook SIRH (nouvelle recrue)",
"type": "n8n-nodes-base.webhook",
"parameters": { "path": "nouvel-employe", "httpMethod": "POST" },
"position": [250, 300]
},
{
"name": "Email Bienvenue Avant Arrivée",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "rh@votreentreprise.com",
"toEmail": "={{ $json.email_personnel }}",
"subject": "Bienvenue chez [Entreprise], {{ $json.prenom }} ! Votre démarrage : {{ $json.date_debut }}",
"emailType": "html",
"html": "<h1>Vivement votre arrivée !</h1><p>Bonjour {{ $json.prenom }},</p><p>Votre date d'entrée est le {{ $json.date_debut }}. Documents à apporter : pièce d'identité, contrat signé (ci-joint).</p><p>Votre manager {{ $json.nom_manager }} vous contactera avant votre premier jour.</p>"
},
"position": [450, 300]
},
{
"name": "Attente jusqu'à la Date de Début",
"type": "n8n-nodes-base.wait",
"parameters": {
"amount": "={{ Math.max(0, Math.ceil((new Date($json.date_debut) - new Date()) / (1000 * 60 * 60 * 24))) }}",
"unit": "days"
},
"position": [650, 300]
},
{
"name": "J1 : Email Logistique",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "rh@votreentreprise.com",
"toEmail": "={{ $json.email_pro }}",
"subject": "Checklist J1 — tout ce dont vous avez besoin aujourd'hui",
"emailType": "html",
"html": "<h2>Bonjour {{ $json.prenom }} !</h2><ul><li>Votre bureau : 3e étage, poste 14B</li><li>WiFi : ReseauEntreprise / mot de passe envoyé séparément</li><li>Déjeuner d'équipe à 12h30 dans la grande cuisine</li><li>Rendez-vous IT à 10h pour la configuration de votre poste</li></ul>"
},
"position": [850, 300]
}
]
}
Template 9 : Workflow d'Approbation Multi-Niveaux
Cas d'usage
Un membre de l'équipe soumet une demande (congés, budget, achat) via un formulaire ou une commande Slack. n8n la route vers le premier approbateur, attend sa décision (lien approuver/refuser dans l'email), puis la route vers le second approbateur si nécessaire. Le demandeur est notifié à chaque étape.
Résultats attendus
- Délai de décision : De plusieurs jours à quelques heures (fini le "à qui dois-je envoyer cet email ?")
- Piste d'audit : Chaque approbation stockée en PostgreSQL avec horodatage et ID approbateur
- Coût : 0,001 EUR par demande (2-3 emails)
{
"name": "Approbation Multi-Niveaux",
"nodes": [
{
"name": "Webhook Formulaire Demande",
"type": "n8n-nodes-base.webhook",
"parameters": { "path": "demande-approbation", "httpMethod": "POST" },
"position": [250, 300]
},
{
"name": "Email Approbateur Niveau 1",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "approbations@votreentreprise.com",
"toEmail": "={{ $json.email_approbateur_n1 }}",
"subject": "[Action requise] Demande de {{ $json.type_demande }} de {{ $json.nom_demandeur }}",
"emailType": "html",
"html": "<h2>Approbation Requise</h2><p>{{ $json.nom_demandeur }} a soumis une demande de {{ $json.type_demande }} :</p><blockquote>{{ JSON.stringify($json.details) }}</blockquote><p><a href='{{ $env.URL_APPROBATION }}/approuver/{{ $json.id_demande }}?approbateur={{ $json.id_approbateur_n1 }}' style='background:#16a34a;color:white;padding:10px 20px;text-decoration:none;border-radius:5px;'>✓ Approuver</a> <a href='{{ $env.URL_APPROBATION }}/refuser/{{ $json.id_demande }}?approbateur={{ $json.id_approbateur_n1 }}' style='background:#dc2626;color:white;padding:10px 20px;text-decoration:none;border-radius:5px;'>✗ Refuser</a></p>"
},
"position": [650, 300]
},
{
"name": "Notifier Demandeur : Approuvé",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "approbations@votreentreprise.com",
"toEmail": "={{ $json.email_demandeur }}",
"subject": "✓ Votre demande de {{ $json.type_demande }} a été approuvée",
"emailType": "html",
"html": "<p>Bonjour {{ $json.nom_demandeur }},</p><p>Votre demande a été approuvée par {{ $json.nom_approbateur }}.</p>"
},
"position": [1250, 200]
},
{
"name": "Notifier Demandeur : Refusé",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "approbations@votreentreprise.com",
"toEmail": "={{ $json.email_demandeur }}",
"subject": "✗ Votre demande de {{ $json.type_demande }} n'a pas été approuvée",
"emailType": "html",
"html": "<p>Bonjour {{ $json.nom_demandeur }},</p><p>Votre demande n'a pas été approuvée. Motif : {{ $json.motif_refus }}. Contactez {{ $json.nom_approbateur }} directement si vous avez des questions.</p>"
},
"position": [1250, 400]
}
]
}
Template 10 : Inscription Événement + Rappels Automatiques
Cas d'usage
Quand quelqu'un s'inscrit à un webinaire ou un événement présentiel (via Stripe, webhook Eventbrite ou un formulaire), envoyez une confirmation instantanée avec invitation calendrier, un rappel 48h avant, un dernier rappel 1h avant. Après l'événement, envoyez un suivi avec le lien de replay.
Résultats attendus
- Taux de présence : 60–75% avec des rappels échelonnés (vs. 40% avec confirmation seule)
- Travail manuel supprimé : 2h par événement (plus de copier-coller des listes de participants)
- Coût : 0,004 EUR par inscrit (4 emails)
{
"name": "Inscription Événement + Rappels",
"nodes": [
{
"name": "Webhook Inscription",
"type": "n8n-nodes-base.webhook",
"parameters": { "path": "inscription-evenement", "httpMethod": "POST" },
"position": [250, 300]
},
{
"name": "Confirmation + Invitation Calendrier",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "evenements@votreentreprise.com",
"toEmail": "={{ $json.email_participant }}",
"subject": "Inscription confirmée : {{ $json.nom_evenement }} le {{ $json.date_evenement }}",
"emailType": "html",
"attachments": "={{ [{ 'filename': 'evenement.ics', 'content': 'BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nDTSTART:' + $json.datetime_ics + '\nDTEND:' + $json.datetime_fin_ics + '\nSUMMARY:' + $json.nom_evenement + '\nDESCRIPTION:Lien de connexion: ' + $json.lien_connexion + '\nEND:VEVENT\nEND:VCALENDAR', 'type': 'text/calendar' }] }}",
"html": "<h2>C'est confirmé ! 🎉</h2><p>Bonjour {{ $json.prenom }},</p><p>Vous êtes inscrit(e) à <strong>{{ $json.nom_evenement }}</strong>.</p><p>📅 {{ $json.date_evenement }} à {{ $json.heure_evenement }}<br>🔗 Lien de connexion : <a href='{{ $json.lien_connexion }}'>{{ $json.lien_connexion }}</a></p><p>Invitation calendrier en pièce jointe. À bientôt !</p>"
},
"position": [450, 300]
},
{
"name": "Attente jusqu'à 48h Avant",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const heureEvenement = new Date(item.json.datetime_evenement); const heureRappel = new Date(heureEvenement - 48 * 60 * 60 * 1000); const maintenant = new Date(); const attenteMs = Math.max(0, heureRappel - maintenant); return [{ ...item.json, heures_attente: Math.ceil(attenteMs / (1000 * 60 * 60)) }];"
},
"position": [650, 300]
},
{
"name": "Rappel 48h Avant",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "evenements@votreentreprise.com",
"toEmail": "={{ $json.email_participant }}",
"subject": "Rappel : {{ $json.nom_evenement }} dans 2 jours",
"emailType": "html",
"html": "<p>Bonjour {{ $json.prenom }},</p><p>Petit rappel : <strong>{{ $json.nom_evenement }}</strong> a lieu dans 2 jours, le {{ $json.date_evenement }} à {{ $json.heure_evenement }}.</p><p><a href='{{ $json.lien_connexion }}'>Lien de connexion →</a></p>"
},
"position": [950, 300]
},
{
"name": "Rappel 1h Avant",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"fromEmail": "evenements@votreentreprise.com",
"toEmail": "={{ $json.email_participant }}",
"subject": "Dans 1 heure : {{ $json.nom_evenement }}",
"emailType": "html",
"html": "<p>Bonjour {{ $json.prenom }}, votre événement commence dans 1 heure !</p><p><a href='{{ $json.lien_connexion }}' style='background:#7c3aed;color:white;padding:12px 24px;text-decoration:none;border-radius:6px;font-weight:bold;'>Rejoindre maintenant →</a></p>"
},
"position": [1150, 300]
}
]
}
Guide de Déploiement : Du Local à la Production
Étape 1 : Configurer les variables d'environnement
Dans n8n, accédez à Paramètres → Variables et ajoutez :
# Requis pour tous les templates email
ANTHROPIC_API_KEY=sk-ant-... # API Claude (templates 3, 7)
SMTP_HOST=email-smtp.eu-west-1.amazonaws.com
SMTP_USER=AKIAIOSFODNN7EXAMPLE
SMTP_PASS=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
SMTP_PORT=587
# Spécifiques aux templates
LIEN_PAIEMENT_BASE=https://paiement.votreentreprise.com
URL_BOUTIQUE=https://votreboutique.com
URL_APPROBATION=https://votreapp.com/approbations
UNSUBSCRIBE_BASE_URL=https://votreapp.com/desinscription
CRM_URL=https://crm.votreentreprise.com
Étape 2 : Configurer les notifications d'erreur
Chaque workflow en production doit intégrer une gestion des erreurs. Ajoutez un nodeError Trigger qui capte toute défaillance et vous envoie une alerte Slack ou email :
{
"name": "Gestionnaire d'Erreurs",
"nodes": [
{
"name": "Déclencheur d'Erreur",
"type": "n8n-nodes-base.errorTrigger",
"position": [250, 300]
},
{
"name": "Alerte Slack",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#alertes-n8n",
"text": "❌ Workflow en erreur : {{ $json.workflow.name }}\nErreur : {{ $json.execution.error.message }}\nExécution : {{ $env.N8N_URL }}/workflow/{{ $json.workflow.id }}/executions/{{ $json.execution.id }}"
},
"position": [450, 300]
}
]
}
Étape 3 : Activer la rétention des données d'exécution
Dans les Paramètres n8n → Paramètres Workflow, configurez la purge des données d'exécution à 30 jours. Cela évite que votre base de données grossisse indéfiniment tout en conservant suffisamment d'historique pour le débogage.
# Dans docker-compose.yml, ajoutez dans l'environnement n8n :
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=720 # 30 jours en heures
- EXECUTIONS_DATA_SAVE_ON_ERROR=all
- EXECUTIONS_DATA_SAVE_ON_SUCCESS=none # Ne pas sauvegarder les succès (économise le disque)
- EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true
Étape 4 : Surveiller la délivrabilité
Après le déploiement, mettez en place un contrôle de délivrabilité minimal :
- Enregistrement SPF : Ajoutez
v=spf1 include:amazonses.com ~all dans votre DNS - DKIM : Vérifiez votre domaine dans la Console SES → Identités vérifiées → activez DKIM
- DMARC : Ajoutez
v=DMARC1; p=quarantine; rua=mailto:dmarc@votredomaine.com - Test de délivrabilité : Utilisez mail-tester.com pour scorer votre premier email — visez 9+/10
Questions Fréquentes
n8n supporte-t-il Gmail, Outlook et SMTP ?
Oui. n8n dispose de nodes natifs pour Gmail (OAuth2), Microsoft Outlook/Microsoft 365 (OAuth2), et un node SMTP générique compatible avec tous les fournisseurs (SendGrid, Mailgun, Postmark, Amazon SES). Pour les volumes transactionnels, privilégiez SendGrid ou Amazon SES — meilleure délivrabilité et tracking par message. Gmail OAuth2 fonctionne bien pour les automatisations internes à faible volume (<500 emails/jour).
Combien coûte l'envoi de 10 000 emails/mois avec n8n ?
Infrastructure uniquement : n8n self-hosted sur un VPS à 5 EUR/mois (Hetzner CX11). Envoi email : Amazon SES coûte 1 USD pour 1 000 emails = 10 USD pour 10k. Total : ~15 EUR/mois. Comparaison : Mailchimp Automations à 100 USD/mois pour 10k contacts. En ajoutant Claude API pour la personnalisation des objets (modèle Haiku) : ~0,0005 USD par email = 5 USD pour 10k. Automatisation email entièrement personnalisée par IA à grande échelle : ~20 EUR/mois.
Puis-je utiliser n8n pour la prospection par email ?
n8n peut techniquement envoyer des emails en masse, mais la prospection à froid comporte des implications légales et de délivrabilité. En France et dans l'UE, le RGPD exige un consentement explicite pour les emails marketing B2C. Pour le B2B, le consentement implicite est accepté dans certains cas (intérêt légitime). Pour une prospection légitime vers des prospects ayant consenti : utilisez n8n + SendGrid + gestion correcte des désinscriptions. Ne scrapez jamais des contacts pour les emailer en masse — votre domaine sera blacklisté en quelques jours.
Quelle est la différence entre l'automatisation email n8n et Mailchimp/ActiveCampaign ?
Mailchimp et ActiveCampaign sont des plateformes d'email marketing dédiées avec éditeurs drag-and-drop, analytics intégrés et gestion de la délivrabilité. n8n est une plateforme d'automatisation généraliste — plus flexible mais qui demande plus de configuration. Utilisez n8n quand : l'email fait partie d'un workflow plus large (ex : paiement Stripe → mise à jour CRM → envoi email), vous voulez un contrôle total sur les données, ou les coûts comptent. Utilisez Mailchimp quand : vous avez besoin principalement de campagnes broadcast, de gestion de listes et d'A/B testing pour vos emails marketing.
Comment gérer les désinscriptions dans les workflows email n8n ?
Bonne pratique : utilisez un service d'envoi d'emails (SendGrid, Mailgun, Amazon SES) qui gère automatiquement les liens de désinscription et les listes de suppression. Configurez votre workflow n8n pour vérifier la liste de suppression avant l'envoi en interrogeant l'API SendGrid : GET /v3/suppression/unsubscribes. Alternativement, créez un webhook de désinscription dédié dans n8n : lors du clic, ajoutez l'email à votre table 'ne pas contacter' en PostgreSQL ou Airtable, et filtrez tous les workflows sortants contre cette liste.