This workflow follows the Emailsend → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Relances Devis Automatiques - IntuitionConcept",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * *"
}
]
}
},
"id": "trigger-cron",
"name": "D\u00e9clencheur Quotidien",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [
250,
300
],
"notes": "Ex\u00e9cution tous les jours \u00e0 9h"
},
{
"parameters": {
"url": "={{$env.VITE_API_BASE_URL}}/api/quotes/follow-up/pending",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"id": "get-quotes",
"name": "R\u00e9cup\u00e9rer Devis \u00e0 Relancer",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
450,
300
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"notes": "Appel API pour r\u00e9cup\u00e9rer les devis n\u00e9cessitant une relance"
},
{
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{$json.quotes.length}}",
"operation": "larger",
"value2": 0
}
]
}
},
"id": "check-quotes",
"name": "V\u00e9rifier si Devis",
"type": "n8n-nodes-base.if",
"typeVersion": 1,
"position": [
650,
300
],
"notes": "Continuer seulement s'il y a des devis"
},
{
"parameters": {
"fieldToSplitOut": "quotes",
"options": {}
},
"id": "split-quotes",
"name": "S\u00e9parer Devis",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
850,
200
],
"notes": "Traiter chaque devis individuellement"
},
{
"parameters": {
"jsCode": "// G\u00e9n\u00e9rer le contenu de l'email de relance\nconst quote = $input.item.json;\nconst followUpNumber = (quote.followUpCount || 0) + 1;\n\n// Calculer jours restants avant expiration\nlet daysLeft = null;\nif (quote.expiresAt) {\n const expiry = new Date(quote.expiresAt);\n const now = new Date();\n daysLeft = Math.ceil((expiry - now) / (1000 * 60 * 60 * 24));\n}\n\n// D\u00e9finir le sujet selon le num\u00e9ro de relance\nlet subject, urgency;\nif (followUpNumber === 1) {\n subject = `Rappel : Votre devis pour ${quote.projectName}`;\n urgency = 'Nous esp\u00e9rons que vous avez eu le temps de consulter notre proposition.';\n} else if (followUpNumber === 2) {\n subject = `2\u00e8me rappel : Devis ${quote.projectName} - Besoin d'informations ?`;\n urgency = 'Nous souhaitons nous assurer que vous avez toutes les informations n\u00e9cessaires.';\n} else {\n subject = `Derni\u00e8re chance : Devis ${quote.projectName}`;\n urgency = 'C\\'est votre derni\u00e8re opportunit\u00e9 de b\u00e9n\u00e9ficier de cette offre.';\n}\n\n// Texte d'expiration\nconst expiryText = daysLeft \n ? `<p><strong>\u26a0\ufe0f Attention :</strong> Ce devis expire dans ${daysLeft} jour${daysLeft > 1 ? 's' : ''}.</p>`\n : '';\n\n// G\u00e9n\u00e9rer le corps HTML\nconst body = `\n<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <style>\n body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center; border-radius: 10px 10px 0 0; }\n .content { background: #f9f9f9; padding: 30px; border-radius: 0 0 10px 10px; }\n .quote-details { background: white; padding: 20px; border-radius: 8px; margin: 20px 0; }\n .amount { font-size: 32px; font-weight: bold; color: #667eea; }\n .cta-button { display: inline-block; background: #667eea; color: white; padding: 15px 40px; text-decoration: none; border-radius: 8px; font-weight: bold; margin: 20px 0; }\n .urgency { background: #fff3cd; border-left: 4px solid #ffc107; padding: 15px; margin: 20px 0; }\n .footer { text-align: center; color: #666; font-size: 12px; margin-top: 30px; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>\ud83c\udfd7\ufe0f IntuitionConcept</h1>\n <p>Votre partenaire BTP de confiance</p>\n </div>\n \n <div class=\"content\">\n <h2>Bonjour ${quote.clientName},</h2>\n \n <p>${urgency}</p>\n \n <div class=\"quote-details\">\n <h3>\ud83d\udccb D\u00e9tails du devis</h3>\n <p><strong>Projet :</strong> ${quote.projectName}</p>\n <p><strong>Montant :</strong> <span class=\"amount\">${quote.amount.toLocaleString('fr-FR')} FCFA</span></p>\n ${quote.sentAt ? `<p><strong>Envoy\u00e9 le :</strong> ${new Date(quote.sentAt).toLocaleDateString('fr-FR')}</p>` : ''}\n ${quote.viewedAt ? `<p>\u2705 <em>Vous avez consult\u00e9 ce devis le ${new Date(quote.viewedAt).toLocaleDateString('fr-FR')}</em></p>` : ''}\n </div>\n \n ${expiryText}\n \n <div class=\"urgency\">\n <strong>\ud83d\udca1 Besoin d'aide ?</strong><br>\n Notre \u00e9quipe est \u00e0 votre disposition pour r\u00e9pondre \u00e0 toutes vos questions :\n <ul>\n <li>\ud83d\udcde Appelez-nous au +221 XX XXX XX XX</li>\n <li>\ud83d\udce7 R\u00e9pondez \u00e0 cet email</li>\n <li>\ud83d\udcac Contactez-nous via WhatsApp</li>\n </ul>\n </div>\n \n <div style=\"text-align: center;\">\n <a href=\"https://intuitionconcept.com/quotes/${quote.id}\" class=\"cta-button\">\n \ud83d\udcc4 Consulter mon devis\n </a>\n </div>\n \n <p style=\"margin-top: 30px;\">\n Nous serions ravis de collaborer avec vous sur ce projet !\n </p>\n \n <p>\n Cordialement,<br>\n <strong>L'\u00e9quipe IntuitionConcept</strong>\n </p>\n </div>\n \n <div class=\"footer\">\n <p>IntuitionConcept - Plateforme de Gestion BTP Intelligente</p>\n <p>Dakar, S\u00e9n\u00e9gal | www.intuitionconcept.com</p>\n </div>\n </div>\n</body>\n</html>\n`;\n\nreturn {\n quoteId: quote.id,\n clientEmail: quote.clientEmail,\n clientName: quote.clientName,\n subject: subject,\n body: body,\n followUpNumber: followUpNumber,\n shouldSendSMS: followUpNumber >= 3 || (daysLeft && daysLeft <= 2)\n};"
},
"id": "generate-email",
"name": "G\u00e9n\u00e9rer Email",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1050,
200
],
"notes": "G\u00e9n\u00e8re le contenu personnalis\u00e9 de l'email"
},
{
"parameters": {
"fromEmail": "noreply@intuitionconcept.com",
"toEmail": "={{$json.clientEmail}}",
"subject": "={{$json.subject}}",
"emailType": "html",
"message": "={{$json.body}}",
"options": {}
},
"id": "send-email",
"name": "Envoyer Email",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2,
"position": [
1250,
200
],
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"notes": "Envoi de l'email via SMTP"
},
{
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{$json.shouldSendSMS}}",
"value2": true
}
]
}
},
"id": "check-sms",
"name": "V\u00e9rifier SMS",
"type": "n8n-nodes-base.if",
"typeVersion": 1,
"position": [
1450,
200
],
"notes": "Envoyer SMS seulement si urgent"
},
{
"parameters": {
"url": "https://api.twilio.com/2010-04-01/Accounts/{{$env.TWILIO_ACCOUNT_SID}}/Messages.json",
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "To",
"value": "={{$json.clientPhone}}"
},
{
"name": "From",
"value": "={{$env.TWILIO_PHONE_NUMBER}}"
},
{
"name": "Body",
"value": "\u26a0\ufe0f URGENT ${$json.clientName} ! Votre devis \"${$json.projectName}\" expire bient\u00f4t. Consultez-le : https://intuitionconcept.com/quotes/${$json.quoteId}"
}
]
},
"options": {}
},
"id": "send-sms",
"name": "Envoyer SMS",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
1650,
100
],
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"notes": "Envoi SMS via Twilio"
},
{
"parameters": {
"url": "={{$env.VITE_API_BASE_URL}}/api/quotes/{{$json.quoteId}}/mark-followed-up",
"method": "POST",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "followUpNumber",
"value": "={{$json.followUpNumber}}"
},
{
"name": "emailSent",
"value": true
},
{
"name": "smsSent",
"value": "={{$json.shouldSendSMS}}"
}
]
},
"options": {}
},
"id": "update-quote",
"name": "Mettre \u00e0 Jour Devis",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
1850,
200
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"notes": "Marquer le devis comme relanc\u00e9"
},
{
"parameters": {},
"id": "loop-back",
"name": "Retour Boucle",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
2050,
200
],
"notes": "Retour pour traiter le devis suivant"
},
{
"parameters": {
"url": "={{$env.VITE_API_BASE_URL}}/api/automation/log",
"method": "POST",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "workflowName",
"value": "quote-follow-up"
},
{
"name": "status",
"value": "completed"
},
{
"name": "quotesProcessed",
"value": "={{$json.quotes.length}}"
},
{
"name": "timestamp",
"value": "={{new Date().toISOString()}}"
}
]
},
"options": {}
},
"id": "log-completion",
"name": "Logger Ex\u00e9cution",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
850,
400
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"notes": "Enregistrer les statistiques d'ex\u00e9cution"
}
],
"connections": {
"D\u00e9clencheur Quotidien": {
"main": [
[
{
"node": "R\u00e9cup\u00e9rer Devis \u00e0 Relancer",
"type": "main",
"index": 0
}
]
]
},
"R\u00e9cup\u00e9rer Devis \u00e0 Relancer": {
"main": [
[
{
"node": "V\u00e9rifier si Devis",
"type": "main",
"index": 0
}
]
]
},
"V\u00e9rifier si Devis": {
"main": [
[
{
"node": "S\u00e9parer Devis",
"type": "main",
"index": 0
}
],
[
{
"node": "Logger Ex\u00e9cution",
"type": "main",
"index": 0
}
]
]
},
"S\u00e9parer Devis": {
"main": [
[
{
"node": "G\u00e9n\u00e9rer Email",
"type": "main",
"index": 0
}
]
]
},
"G\u00e9n\u00e9rer Email": {
"main": [
[
{
"node": "Envoyer Email",
"type": "main",
"index": 0
}
]
]
},
"Envoyer Email": {
"main": [
[
{
"node": "V\u00e9rifier SMS",
"type": "main",
"index": 0
}
]
]
},
"V\u00e9rifier SMS": {
"main": [
[
{
"node": "Envoyer SMS",
"type": "main",
"index": 0
}
],
[
{
"node": "Mettre \u00e0 Jour Devis",
"type": "main",
"index": 0
}
]
]
},
"Envoyer SMS": {
"main": [
[
{
"node": "Mettre \u00e0 Jour Devis",
"type": "main",
"index": 0
}
]
]
},
"Mettre \u00e0 Jour Devis": {
"main": [
[
{
"node": "Retour Boucle",
"type": "main",
"index": 0
}
]
]
},
"Retour Boucle": {
"main": [
[
{
"node": "S\u00e9parer Devis",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "1",
"id": "quote-follow-up-workflow",
"tags": [
{
"createdAt": "2025-01-18T00:00:00.000Z",
"updatedAt": "2025-01-18T00:00:00.000Z",
"id": "1",
"name": "BTP"
},
{
"createdAt": "2025-01-18T00:00:00.000Z",
"updatedAt": "2025-01-18T00:00:00.000Z",
"id": "2",
"name": "Automatisation"
},
{
"createdAt": "2025-01-18T00:00:00.000Z",
"updatedAt": "2025-01-18T00:00:00.000Z",
"id": "3",
"name": "Devis"
}
]
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
httpBasicAuthhttpHeaderAuthsmtp
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Relances Devis Automatiques - IntuitionConcept. Uses httpRequest, emailSend. Scheduled trigger; 11 nodes.
Source: https://github.com/HerbertGourout/IntuitionConcept/blob/15241abcd70bd6996f3d7dc9cf09cf45fe68c21f/n8n-workflows/quote-follow-up-workflow.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Birthday Automation - Production (Fixed). Uses stopAndError, httpRequest, emailSend, bannerbear. Scheduled trigger; 86 nodes.
This workflow is an improvement of this workflow by Greg Brzezinka.
N8N-Self-Updater. Uses ssh, emailSend, httpRequest. Scheduled trigger; 27 nodes.
> An automated n8n workflow originally built for DigitalOcean-based n8n deployments, but fully compatible with any VPS or cloud hosting (e.g., AWS, Google Cloud, Hetzner, Linode, etc.) where n8n ru
What if you could spot a major sales problem—or a winning campaign—the very next morning, instead of weeks later? Imagine receiving a beautiful, data-rich alert directly in your inbox the moment your