{
  "name": "DPL · 4 · Follow-up Scheduler",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 1
            }
          ]
        }
      },
      "id": "n1",
      "name": "A cada hora",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "=SELECT id, nome, contato, followup_etapa, ultimo_toque, respondeu\nFROM leads_funil\nWHERE status IN ('consentido','qualificado','em_followup')\n  AND respondeu = false\n  AND COALESCE(followup_etapa,0) <= 2",
        "options": {}
      },
      "id": "n2",
      "name": "Buscar Leads em Follow-up",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.5,
      "position": [
        460,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "// Decide quais leads recebem o próximo toque agora.\n// Regra: pausa se respondeu; janelas D+0 (imediato), D+1 (+24h), toque 3 (+48h).\nconst now = Date.now(), H = 3600*1000;\nconst janela = { 0: 0, 1: 24*H, 2: 48*H };\nconst msg = {\n  0: n => `${n}, preparei as informações certas para o seu caso. Posso te enviar agora?`,\n  1: n => `${n}, ficou alguma dúvida sobre o que conversamos? Estou por aqui pra ajudar 🙂`,\n  2: n => `${n}, passando pra avisar que a condição especial vai até amanhã. Quer que eu finalize pra você?`,\n};\nconst out = [];\nfor (const it of $input.all()) {\n  const l = it.json;\n  const etapa = l.followup_etapa ?? 0;\n  if (etapa > 2) continue;\n  const ultimo = l.ultimo_toque ? new Date(l.ultimo_toque).getTime() : 0;\n  if (etapa > 0 && (now - ultimo) < janela[etapa]) continue; // ainda não é hora\n  out.push({ json: { id: l.id, contato: l.contato, msg: msg[etapa](l.nome || 'Oi'), nova_etapa: etapa + 1 } });\n}\nreturn out;"
      },
      "id": "n3",
      "name": "Quem está na hora?",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        680,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $env.EVOLUTION_URL }}/message/sendText/{{ $env.EVOLUTION_INSTANCE }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "apikey",
              "value": "={{ $env.EVOLUTION_APIKEY }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ number: $json.contato, text: $json.msg }) }}",
        "options": {}
      },
      "id": "n4",
      "name": "WhatsApp: Follow-up",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        900,
        300
      ]
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "=UPDATE leads_funil SET followup_etapa = {{ $json.nova_etapa }}, ultimo_toque = now(), status = 'em_followup', atualizado_em = now()\nWHERE id = '{{ $json.id }}'",
        "options": {}
      },
      "id": "n5",
      "name": "Marcar Toque",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.5,
      "position": [
        1120,
        300
      ]
    },
    {
      "parameters": {
        "content": "## WF4 · Follow-up Scheduler\nRoda de hora em hora. Envia a sequência D+0 / D+1 / toque 3 só para quem **não respondeu** e já está na janela. Ao responder, o inbound (WF3 / seu fluxo) deve setar `respondeu = true` para pausar aqui.\n\n**Configurar:** Postgres (Supabase) + variáveis da Evolution API. Ajuste as janelas/mensagens ao seu tom.",
        "width": 560,
        "height": 300
      },
      "id": "n6",
      "name": "Nota",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        240,
        -80
      ]
    }
  ],
  "connections": {
    "A cada hora": {
      "main": [
        [
          {
            "node": "Buscar Leads em Follow-up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Buscar Leads em Follow-up": {
      "main": [
        [
          {
            "node": "Quem está na hora?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Quem está na hora?": {
      "main": [
        [
          {
            "node": "WhatsApp: Follow-up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "WhatsApp: Follow-up": {
      "main": [
        [
          {
            "node": "Marcar Toque",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}