This workflow follows the Google Sheets → 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": "Fluxo D - Campanhas Recorrentes (Luz da Lua)",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 13 * * 1"
}
]
}
},
"id": "d1",
"name": "Schedule semanal segunda 10h BRT",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
240,
300
],
"notes": "Cron 0 13 * * 1 = segunda 10h BRT (assumindo UTC). Use 0 10 * * 1 se GENERIC_TIMEZONE=America/Sao_Paulo."
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "PLACEHOLDER_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "PLACEHOLDER_SHEET_NAME",
"mode": "name"
},
"options": {}
},
"id": "d2",
"name": "Sheets - Get rows",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
460,
300
],
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// Filtra contatos eleg\u00edveis para nova campanha:\n// - opt_in = sim\n// - opt_out vazio\n// - status em [ativo, sem_interesse, atendida]\n// - data_ultimo_envio vazia ou >= 7 dias atr\u00e1s\nconst SETE_DIAS_MS = 7 * 24 * 60 * 60 * 1000;\nconst agora = Date.now();\nconst statusOk = new Set(['ativo', 'sem_interesse', 'atendida']);\n\nreturn items.filter(({ json }) => {\n if (json.opt_in !== 'sim') return false;\n if (json.opt_out === 'sim') return false;\n if (!statusOk.has(json.status_contato)) return false;\n\n const dt = json.data_ultimo_envio;\n if (!dt) return true;\n const t = Date.parse(dt);\n if (Number.isNaN(t)) return true;\n return (agora - t) >= SETE_DIAS_MS;\n});"
},
"id": "d3",
"name": "Code - Filtro eleg\u00edveis (7 dias)",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
680,
300
]
},
{
"parameters": {
"maxItems": 50
},
"id": "d4",
"name": "Limit por execu\u00e7\u00e3o",
"type": "n8n-nodes-base.limit",
"typeVersion": 1,
"position": [
900,
300
]
},
{
"parameters": {
"batchSize": 1,
"options": {}
},
"id": "d5",
"name": "SplitInBatches",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
1120,
300
]
},
{
"parameters": {
"method": "POST",
"url": "=https://graph.facebook.com/v21.0/{{$env.WHATSAPP_PHONE_NUMBER_ID}}/messages",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"messaging_product\": \"whatsapp\",\n \"to\": \"{{ $json.telefone }}\",\n \"type\": \"template\",\n \"template\": {\n \"name\": \"campanha_promo_mensal\",\n \"language\": { \"code\": \"pt_BR\" },\n \"components\": [\n {\n \"type\": \"body\",\n \"parameters\": [\n { \"type\": \"text\", \"text\": \"{{ $json.nome }}\" },\n { \"type\": \"text\", \"text\": \"{{ $json.segmento || 'novidades' }}\" }\n ]\n }\n ]\n }\n}",
"options": {
"response": {
"response": {
"fullResponse": false,
"neverError": true
}
}
}
},
"id": "d6",
"name": "WhatsApp - Send campanha",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1340,
300
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"onError": "continueRegularOutput",
"notes": "Substitua 'campanha_promo_mensal' pelo nome real do seu template MARKETING aprovado pela Meta."
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "PLACEHOLDER_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "PLACEHOLDER_SHEET_NAME",
"mode": "name"
},
"columns": {
"mappingMode": "defineBelow",
"matchingColumns": [
"telefone"
],
"value": {
"telefone": "={{ $('SplitInBatches').item.json.telefone }}",
"ultima_campanha": "campanha_promo_mensal",
"data_ultimo_envio": "={{ $now.toISO() }}",
"status_contato": "campanha_enviada",
"resposta_ultima_campanha": "",
"interessado": ""
}
},
"options": {}
},
"id": "d7",
"name": "Sheets - Update campanha_enviada",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
1560,
300
],
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"amount": "={{ Math.floor(Math.random() * 40) + 20 }}",
"unit": "seconds"
},
"id": "d8",
"name": "Wait 20-60s",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
1780,
300
]
}
],
"connections": {
"Schedule semanal segunda 10h BRT": {
"main": [
[
{
"node": "Sheets - Get rows",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Get rows": {
"main": [
[
{
"node": "Code - Filtro eleg\u00edveis (7 dias)",
"type": "main",
"index": 0
}
]
]
},
"Code - Filtro eleg\u00edveis (7 dias)": {
"main": [
[
{
"node": "Limit por execu\u00e7\u00e3o",
"type": "main",
"index": 0
}
]
]
},
"Limit por execu\u00e7\u00e3o": {
"main": [
[
{
"node": "SplitInBatches",
"type": "main",
"index": 0
}
]
]
},
"SplitInBatches": {
"main": [
[
{
"node": "WhatsApp - Send campanha",
"type": "main",
"index": 0
}
]
]
},
"WhatsApp - Send campanha": {
"main": [
[
{
"node": "Sheets - Update campanha_enviada",
"type": "main",
"index": 0
}
]
]
},
"Sheets - Update campanha_enviada": {
"main": [
[
{
"node": "Wait 20-60s",
"type": "main",
"index": 0
}
]
]
},
"Wait 20-60s": {
"main": [
[
{
"node": "SplitInBatches",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}
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.
googleSheetsOAuth2ApihttpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Fluxo D - Campanhas Recorrentes (Luz da Lua). Uses googleSheets, httpRequest. Scheduled trigger; 8 nodes.
Source: https://github.com/rodrigogr/shared-projects/blob/3a68abe13ba87467d3fc5fa0e72f91a2686d4bd3/whatsapp-mvp/n8n-workflows/fluxo-d-campanhas-recorrentes.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.
This workflow automates video distribution to 9 social platforms simultaneously using Blotato's API. It includes both a scheduled publisher (checks Google Sheets for videos marked "Ready") and a subwo
YogiAI. Uses googleSheets, googleSheetsTool, httpRequest, stopAndError. Scheduled trigger; 61 nodes.
This workflow monitors Google Calendar for events indicating that a customer will visit the company today or the next day, retrieves the required details, and sends reminder notifications to the relev
ofn hook v0.24.0 beta. Uses start, httpRequest, functionItem, itemLists. Scheduled trigger; 42 nodes.
Security teams, DevOps engineers, vulnerability analysts, and automation builders who want to eliminate repetitive Nessus scan parsing, AI-based risk triage, and manual reporting. Designed for orgs fo