AutomationFlowsData & Sheets › Fluxo D - Campanhas Recorrentes (luz Da Lua)

Fluxo D - Campanhas Recorrentes (luz Da Lua)

Fluxo D - Campanhas Recorrentes (Luz da Lua). Uses googleSheets, httpRequest. Scheduled trigger; 8 nodes.

Cron / scheduled trigger★★★★☆ complexity8 nodesGoogle SheetsHTTP Request
Data & Sheets Trigger: Cron / scheduled Nodes: 8 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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.

Pro

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 →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

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

Google Sheets, HTTP Request, Form Trigger +2
Data & Sheets

YogiAI. Uses googleSheets, googleSheetsTool, httpRequest, stopAndError. Scheduled trigger; 61 nodes.

Google Sheets, Google Sheets Tool, HTTP Request +1
Data & Sheets

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

Google Calendar, Google Sheets, HTTP Request +1
Data & Sheets

ofn hook v0.24.0 beta. Uses start, httpRequest, functionItem, itemLists. Scheduled trigger; 42 nodes.

Start, HTTP Request, Function Item +3
Data & Sheets

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

Email Send, HTTP Request, Google Sheets +1