Pular para conteúdo

Tutorial: Campanha de Marketing Multicanal Coordenada

Aprenda a orquestrar campanhas complexas de marketing que coordenam mensagens através de Email, WhatsApp, LinkedIn, SMS e notificações push, com personalização e timing perfeito.

O Que Você Vai Construir

Um sistema de campanha multicanal que: 1. Segmenta audiência baseada em comportamento e dados 2. Personaliza mensagens para cada canal 3. Coordena timing entre canais (não enviar tudo junto) 4. Rastreia engajamento cross-channel 5. Ajusta estratégia baseado em resultados 6. Para campanha se usuário converter 7. Implementa A/B testing automático

Tempo estimado: 55 minutos Nível: Avançado Impacto esperado: +45% no engajamento, +30% na conversão

O Que Você Vai Aprender

  • Segmentação avançada de audiência
  • Orquestração de múltiplos canais
  • Personalização dinâmica de conteúdo
  • Timing e cadência otimizados
  • Tracking cross-channel
  • A/B testing automatizado
  • Attribution modeling

Pré-requisitos

  • ✅ SendGrid ou Mailgun (Email)
  • ✅ WhatsApp Business API
  • ✅ LinkedIn API ou PhantomBuster
  • ✅ Twilio (SMS)
  • ✅ OneSignal ou Firebase (Push)
  • ✅ PostgreSQL com dados de usuários

Parte 1: Estrutura de Dados

1.1. Criar Tabelas

-- Campanhas
CREATE TABLE campaigns (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  description TEXT,
  type VARCHAR(50), -- product_launch, promotion, nurture, reengagement
  status VARCHAR(50) DEFAULT 'draft', -- draft, scheduled, active, paused, completed
  start_date TIMESTAMP,
  end_date TIMESTAMP,
  target_audience JSONB,
  ab_test_enabled BOOLEAN DEFAULT false,
  ab_variant VARCHAR(10), -- A, B
  created_at TIMESTAMP DEFAULT NOW()
);

-- Contatos da campanha
CREATE TABLE campaign_contacts (
  id SERIAL PRIMARY KEY,
  campaign_id INT REFERENCES campaigns(id),
  user_email VARCHAR(255) NOT NULL,
  user_data JSONB,
  segment VARCHAR(100),
  ab_variant VARCHAR(10),
  status VARCHAR(50) DEFAULT 'pending', -- pending, in_progress, completed, opted_out
  current_stage INT DEFAULT 0,
  enrolled_at TIMESTAMP DEFAULT NOW()
);

-- Mensagens da campanha
CREATE TABLE campaign_messages (
  id SERIAL PRIMARY KEY,
  campaign_id INT REFERENCES campaigns(id),
  contact_id INT REFERENCES campaign_contacts(id),
  stage INT NOT NULL,
  channel VARCHAR(50), -- email, whatsapp, sms, linkedin, push
  message_type VARCHAR(50),
  subject VARCHAR(500),
  content TEXT,
  sent_at TIMESTAMP,
  delivered_at TIMESTAMP,
  opened_at TIMESTAMP,
  clicked_at TIMESTAMP,
  converted_at TIMESTAMP,
  metadata JSONB
);

-- Eventos de engajamento
CREATE TABLE campaign_events (
  id SERIAL PRIMARY KEY,
  campaign_id INT REFERENCES campaigns(id),
  contact_id INT REFERENCES campaign_contacts(id),
  message_id INT REFERENCES campaign_messages(id),
  event_type VARCHAR(100), -- sent, delivered, opened, clicked, converted, opted_out
  channel VARCHAR(50),
  event_data JSONB,
  created_at TIMESTAMP DEFAULT NOW()
);

-- Índices
CREATE INDEX idx_campaign_contacts_email ON campaign_contacts(user_email);
CREATE INDEX idx_campaign_contacts_status ON campaign_contacts(status);
CREATE INDEX idx_campaign_messages_sent ON campaign_messages(sent_at);
CREATE INDEX idx_campaign_events_type ON campaign_events(event_type);

1.2. Dados de Exemplo

-- Inserir campanha
INSERT INTO campaigns (name, description, type, status, start_date, target_audience, ab_test_enabled)
VALUES (
  'Lançamento Flow Builder 2.0',
  'Campanha de lançamento da nova versão do Flow Builder',
  'product_launch',
  'active',
  NOW(),
  '{"segments": ["active_users", "trial_users"], "min_engagement": 3}',
  true
);

-- Segmentos de usuários (simulado)
-- Na prática, você busca do seu banco de usuários

Parte 2: Segmentação de Audiência

2.1. Flow: Inscrever Usuários na Campanha

Crie um flow com Schedule Trigger (executar 1x ao dia ou ao iniciar campanha):

// Database Query: "Buscar Campanhas Ativas"
SELECT id, name, target_audience, ab_test_enabled
FROM campaigns
WHERE status = 'active'
  AND start_date <= NOW()
  AND (end_date IS NULL OR end_date >= NOW());

2.2. Para Cada Campanha

// Loop/ForEach: Iterar pelas campanhas
// Para cada campanha, executar segmentação

2.3. Segmentar Usuários

// Database Query: "Buscar Usuários Elegíveis"
WITH user_engagement AS (
  SELECT
    user_email,
    COUNT(*) as activity_count,
    MAX(last_active_at) as last_active,
    user_segment,
    user_data
  FROM users
  WHERE status = 'active'
    AND user_segment IN ('active_users', 'trial_users') -- do target_audience
    AND NOT EXISTS (
      SELECT 1 FROM campaign_contacts
      WHERE campaign_id = {{ $item.id }}
        AND user_email = users.user_email
    )
  GROUP BY user_email, user_segment, user_data
  HAVING COUNT(*) >= 3 -- min_engagement
)
SELECT * FROM user_engagement
LIMIT 1000; -- processar em batches

2.4. Atribuir Variante A/B

// Function Node: "Atribuir Variantes"
{{
  (() => {
    const campaign = $nodes['buscar-campanhas'].output.rows[0];
    const users = $nodes['buscar-usuarios'].output.rows;

    return users.map((user, index) => {
      // Se A/B test habilitado, distribui 50/50
      const variant = campaign.ab_test_enabled ?
        (index % 2 === 0 ? 'A' : 'B') :
        'A';

      return {
        campaignId: campaign.id,
        userEmail: user.user_email,
        userData: user.user_data,
        segment: user.user_segment,
        abVariant: variant
      };
    });
  })()
}}

2.5. Inserir Contatos na Campanha

// Database Insert (Batch): "Inscrever Usuários"
{
  "table": "campaign_contacts",
  "data": "{{ $nodes['atribuir-variantes'].output.map(u => ({ campaign_id: u.campaignId, user_email: u.userEmail, user_data: JSON.stringify(u.userData), segment: u.segment, ab_variant: u.abVariant, status: 'pending', enrolled_at: new Date().toISOString() })) }}"
}

Parte 3: Orquestração da Campanha

3.1. Flow Principal: Executar Stages

Crie outro flow com Schedule Trigger (executar a cada hora):

// Database Query: "Buscar Contatos Pendentes"
SELECT
  cc.id as contact_id,
  cc.campaign_id,
  cc.user_email,
  cc.user_data,
  cc.segment,
  cc.ab_variant,
  cc.current_stage,
  cc.enrolled_at,
  c.name as campaign_name,
  c.type as campaign_type
FROM campaign_contacts cc
JOIN campaigns c ON c.id = cc.campaign_id
WHERE cc.status IN ('pending', 'in_progress')
  AND c.status = 'active'
  -- Regras de timing (exemplos):
  AND (
    -- Stage 0: enviar imediatamente após inscrição
    (cc.current_stage = 0 AND cc.enrolled_at <= NOW() - INTERVAL '5 minutes')
    OR
    -- Stage 1: enviar 24h após stage 0
    (cc.current_stage = 1 AND NOT EXISTS (
      SELECT 1 FROM campaign_messages
      WHERE contact_id = cc.id AND stage = 1
    ) AND EXISTS (
      SELECT 1 FROM campaign_messages
      WHERE contact_id = cc.id AND stage = 0 AND sent_at <= NOW() - INTERVAL '24 hours'
    ))
    OR
    -- Stage 2: enviar 48h após stage 1
    (cc.current_stage = 2 AND NOT EXISTS (
      SELECT 1 FROM campaign_messages
      WHERE contact_id = cc.id AND stage = 2
    ) AND EXISTS (
      SELECT 1 FROM campaign_messages
      WHERE contact_id = cc.id AND stage = 1 AND sent_at <= NOW() - INTERVAL '48 hours'
    ))
    -- Adicione mais stages conforme necessário
  )
LIMIT 100; -- processar em batches

3.2. Verificar Se Já Converteu

// If/Else: "Usuário Já Converteu?"
// Verificar se o usuário realizou a ação desejada
{{
  (() => {
    const userData = JSON.parse($item.user_data);
    // Exemplo: verificar se fez upgrade, comprou produto, etc
    return userData.has_converted || userData.subscription_status === 'paid';
  })()
}}

Branch TRUE: Marcar como completado e pular

// Database Update: "Marcar Como Convertido"
{
  "table": "campaign_contacts",
  "data": {
    "status": "completed",
    "updated_at": "{{ new Date().toISOString() }}"
  },
  "where": {
    "id": "{{ $item.contact_id }}"
  }
}

Branch FALSE: Continuar com envio

3.3. Determinar Mensagens por Stage

// Function Node: "Definir Mensagens do Stage"
{{
  (() => {
    const stage = $item.current_stage;
    const variant = $item.ab_variant;
    const campaignType = $item.campaign_type;

    // Configuração de mensagens por stage
    // Stage 0: Anúncio inicial
    // Stage 1: Benefícios e features
    // Stage 2: Prova social e urgência
    // Stage 3: Última chamada

    const messages = {
      0: {
        channels: ['email', 'push'],
        delay: 0,
        emailSubject: variant === 'A' ?
          'Novidade: Flow Builder 2.0 está aqui! 🚀' :
          'Você precisa ver isso: Flow Builder 2.0',
        priority: 'high'
      },
      1: {
        channels: ['email', 'whatsapp'],
        delay: 24, // horas
        emailSubject: variant === 'A' ?
          '5 recursos que vão transformar seu trabalho' :
          'Descubra o que há de novo no Flow Builder 2.0',
        priority: 'medium'
      },
      2: {
        channels: ['email', 'sms'],
        delay: 48,
        emailSubject: variant === 'A' ?
          '1.000+ empresas já migraram. E você?' :
          'Casos de sucesso: como empresas usam o 2.0',
        priority: 'medium'
      },
      3: {
        channels: ['email', 'whatsapp', 'linkedin'],
        delay: 72,
        emailSubject: variant === 'A' ?
          '⏰ Últimas horas: migre com desconto' :
          'Não perca: oferta especial termina hoje',
        priority: 'high'
      }
    };

    return messages[stage] || null;
  })()
}}

3.4. Personalizar Conteúdo

// Function Node: "Personalizar Mensagens"
{{
  (() => {
    const user = JSON.parse($item.user_data);
    const firstName = user.first_name || 'usuário';
    const company = user.company || 'sua empresa';
    const stage = $item.current_stage;
    const variant = $item.ab_variant;

    // Templates por stage e variante
    const templates = {
      0: {
        A: {
          email: `
            <h1>Olá, ${firstName}! 🎉</h1>
            <p>Temos uma novidade incrível para você: o <strong>Flow Builder 2.0</strong> acabou de ser lançado!</p>
            <p>Preparamos uma atualização completa com recursos que você pediu:</p>
            <ul>
              <li>✅ Performance 3x mais rápida</li>
              <li>✅ Nova interface intuitiva</li>
              <li>✅ 50+ novas integrações</li>
              <li>✅ Colaboração em tempo real</li>
            </ul>
            <a href="https://lumina.app.br/2.0?utm_source=campaign&utm_medium=email&utm_campaign=launch_2.0&variant=A" style="background: #5c6ac4; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0;">
              Explorar o Flow Builder 2.0
            </a>
          `,
          whatsapp: `Olá, ${firstName}! 🎉\n\nO *Flow Builder 2.0* acabou de ser lançado!\n\n✨ Performance 3x mais rápida\n✨ 50+ novas integrações\n✨ Interface renovada\n\nConheça agora: https://lumina.app.br/2.0`,
          push: {
            title: 'Flow Builder 2.0 está aqui! 🚀',
            body: 'Performance 3x mais rápida e 50+ novas integrações. Confira!',
            url: 'https://lumina.app.br/2.0?utm_source=push'
          }
        },
        B: {
          email: `
            <h1>Você precisa ver isso, ${firstName}!</h1>
            <p>Acabamos de lançar algo que vai mudar a forma como ${company} trabalha com automações.</p>
            <p>O <strong>Flow Builder 2.0</strong> traz o que você sempre quis:</p>
            <ul>
              <li>⚡ 3x mais rápido</li>
              <li>🎨 Design completamente renovado</li>
              <li>🔗 Dezenas de novas integrações</li>
              <li>👥 Trabalhe em equipe em tempo real</li>
            </ul>
            <a href="https://lumina.app.br/2.0?utm_source=campaign&utm_medium=email&utm_campaign=launch_2.0&variant=B" style="background: #5c6ac4; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0;">
              Ver o que mudou
            </a>
          `,
          whatsapp: `${firstName}, você precisa conhecer o *Flow Builder 2.0*!\n\n⚡ 3x mais rápido\n🎨 Nova interface\n🔗 Novas integrações\n\nVeja as novidades: https://lumina.app.br/2.0`,
          push: {
            title: 'Algo incrível acabou de chegar',
            body: 'Flow Builder 2.0: mais rápido, mais poderoso. Veja agora!',
            url: 'https://lumina.app.br/2.0?utm_source=push'
          }
        }
      },
      1: {
        A: {
          email: `
            <h1>5 recursos que vão transformar seu trabalho</h1>
            <p>Olá, ${firstName}!</p>
            <p>Ontem apresentamos o Flow Builder 2.0. Hoje vamos mostrar como ele vai economizar horas do seu dia:</p>

            <h3>1. 🚀 Performance 3x Mais Rápida</h3>
            <p>Seus flows executam em segundos, não minutos. Empresas reportam economia de 60% no tempo de processamento.</p>

            <h3>2. 🎨 Editor Visual Renovado</h3>
            <p>Arraste, solte, configure. Tão intuitivo que você não vai precisar de treinamento.</p>

            <h3>3. 🔗 50+ Novas Integrações</h3>
            <p>Shopify, Salesforce, Stripe, Notion... Conecte tudo que você usa.</p>

            <h3>4. 👥 Colaboração em Tempo Real</h3>
            <p>Toda a equipe trabalhando no mesmo flow, ao mesmo tempo. Como Google Docs, mas para automações.</p>

            <h3>5. 🔍 Debug Inteligente</h3>
            <p>IA identifica problemas e sugere correções automaticamente.</p>

            <a href="https://lumina.app.br/2.0/features?utm_source=campaign&variant=A">Ver todos os recursos</a>
          `,
          whatsapp: `${firstName}, veja como o Flow Builder 2.0 vai economizar horas do seu dia:\n\n🚀 3x mais rápido\n🎨 Editor renovado\n🔗 50+ integrações\n👥 Colaboração em tempo real\n🔍 Debug inteligente\n\nDetalhes: https://lumina.app.br/2.0/features`
        },
        B: {
          email: `
            <h1>Descubra o que há de novo no Flow Builder 2.0</h1>
            <p>Ei, ${firstName}!</p>
            <p>Preparamos uma atualização pensando nos desafios de ${company}:</p>

            <h3>⚡ Performance Turbinada</h3>
            <p>Processamento 3x mais rápido = mais produtividade para sua equipe.</p>

            <h3>🎯 Interface Intuitiva</h3>
            <p>Redesenhamos tudo baseado no feedback de milhares de usuários como você.</p>

            <h3>🌐 Conecte Tudo</h3>
            <p>Adicionamos 50+ integrações. Se você usa, nós integramos.</p>

            <h3>🤝 Trabalho em Equipe</h3>
            <p>Múltiplos usuários no mesmo flow, sem conflitos. Magia pura.</p>

            <h3>🤖 Inteligência Artificial</h3>
            <p>Debug automático, sugestões inteligentes, otimização de performance.</p>

            <a href="https://lumina.app.br/2.0/features?utm_source=campaign&variant=B">Explorar recursos</a>
          `,
          whatsapp: `Novidades do Flow Builder 2.0 para ${company}:\n\n⚡ Performance turbinada\n🎯 Interface intuitiva\n🌐 50+ integrações\n🤝 Trabalho em equipe\n🤖 IA integrada\n\nSaiba mais: https://lumina.app.br/2.0/features`
        }
      },
      2: {
        A: {
          email: `
            <h1>1.000+ empresas já migraram. E você?</h1>
            <p>${firstName}, veja o que empresas como ${company} estão dizendo sobre o Flow Builder 2.0:</p>

            <blockquote>
              "Migramos 200 flows em um fim de semana. A performance melhorou 300%. Incrível!"
              <br>— Carlos Silva, CTO na TechCorp
            </blockquote>

            <blockquote>
              "A interface nova é tão intuitiva que treinamos a equipe em 1 hora. Antes levava dias."
              <br>— Maria Santos, Head of Ops na StartupXYZ
            </blockquote>

            <blockquote>
              "As novas integrações economizaram 40 horas/mês do nosso time. ROI imediato."
              <br>— Pedro Costa, CEO na Ecommerce Plus
            </blockquote>

            <p><strong>Migre hoje e ganhe:</strong></p>
            <ul>
              <li>✅ Suporte prioritário durante 30 dias</li>
              <li>✅ Sessão de onboarding personalizada</li>
              <li>✅ 20% de desconto no próximo plano</li>
            </ul>

            <a href="https://lumina.app.br/migrate?utm_source=campaign&variant=A">Migrar Agora</a>
          `,
          sms: `${firstName}, 1.000+ empresas migraram para o Flow Builder 2.0 e estão economizando 40% do tempo. Migre hoje e ganhe 20% OFF: https://lumina.app.br/migrate`
        },
        B: {
          email: `
            <h1>Casos de sucesso: como empresas usam o 2.0</h1>
            <p>Olá, ${firstName}!</p>
            <p>Separamos 3 histórias reais de empresas que transformaram operações com o Flow Builder 2.0:</p>

            <h3>🏢 TechCorp - Fintech com 500 funcionários</h3>
            <p><strong>Desafio:</strong> Processar 100k transações/dia com confiabilidade<br>
            <strong>Solução:</strong> Migraram para 2.0 e usaram a nova arquitetura escalável<br>
            <strong>Resultado:</strong> 99.99% uptime, processamento 4x mais rápido</p>

            <h3>🛍️ Ecommerce Plus - Loja online em crescimento</h3>
            <p><strong>Desafio:</strong> Integrar 15 ferramentas diferentes<br>
            <strong>Solução:</strong> Usaram as novas integrações nativas do 2.0<br>
            <strong>Resultado:</strong> Economia de 40h/mês em manutenção</p>

            <h3>🚀 StartupXYZ - Time enxuto, grandes ambições</h3>
            <p><strong>Desafio:</strong> Automatizar vendas com time de 3 pessoas<br>
            <strong>Solução:</strong> Interface intuitiva permitiu autonomia total<br>
            <strong>Resultado:</strong> 200% mais automações, zero devs alocados</p>

            <a href="https://lumina.app.br/case-studies?utm_source=campaign&variant=B">Ler casos completos</a>
          `,
          sms: `${firstName}, empresas economizaram 40h/mês migrando para o Flow Builder 2.0. Leia os casos de sucesso: https://lumina.app.br/cases`
        }
      },
      3: {
        A: {
          email: `
            <h1>⏰ Últimas horas: migre com desconto</h1>
            <p>${firstName}, esta é sua última chance!</p>

            <p style="background: #fff3cd; padding: 20px; border-left: 4px solid #ffc107;">
              <strong>⏰ Oferta termina em 24 horas:</strong><br>
              Migre agora e ganhe <strong>20% de desconto</strong> no próximo upgrade + suporte VIP por 30 dias.
            </p>

            <p>O Flow Builder 2.0 já está transformando empresas:</p>
            <ul>
              <li>✅ 1.247 empresas migraram</li>
              <li>✅ 95% reportam economia de tempo</li>
              <li>✅ 4.8/5 estrelas de satisfação</li>
            </ul>

            <p><strong>Não fique para trás.</strong> A migração leva apenas 15 minutos e você pode reverter a qualquer momento.</p>

            <a href="https://lumina.app.br/migrate-now?utm_source=campaign&variant=A&urgency=true" style="background: #d32f2f; color: white; padding: 20px 40px; font-size: 18px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0;">
              Migrar com Desconto →
            </a>

            <p style="color: #666; font-size: 14px;">Oferta válida até ${new Date(Date.now() + 24*60*60*1000).toLocaleDateString('pt-BR')} às 23:59</p>
          `,
          whatsapp: `⏰ *ÚLTIMA CHANCE, ${firstName}!*\n\nOferta termina em 24h:\n✅ 20% OFF no upgrade\n✅ Suporte VIP 30 dias\n✅ Migração em 15 min\n\n1.247 empresas já migraram!\n\nGaranta seu desconto: https://lumina.app.br/migrate-now`,
          linkedin: `${firstName}, não perca a oportunidade de transformar as automações de ${company}. O Flow Builder 2.0 está em oferta por apenas 24 horas. 1.247 empresas já migraram e estão economizando 40% do tempo. Garanta 20% OFF: https://lumina.app.br/migrate-now`
        },
        B: {
          email: `
            <h1>Não perca: oferta especial termina hoje</h1>
            <p>Olá, ${firstName}!</p>

            <p>Durante esta semana, mostramos como o Flow Builder 2.0 está transformando empresas como ${company}.</p>

            <p style="background: #e3f2fd; padding: 20px; border-left: 4px solid #2196F3;">
              <strong>🎁 Oferta exclusiva (válida por 24h):</strong><br>
              • 20% de desconto no próximo plano<br>
              • Onboarding personalizado (valor: R$ 2.000)<br>
              • Suporte prioritário por 30 dias<br>
              • Migração assistida pela nossa equipe
            </p>

            <p><strong>Por que migrar agora?</strong></p>
            <ol>
              <li><strong>Zero risco:</strong> Reverta a qualquer momento</li>
              <li><strong>Suporte completo:</strong> Nossa equipe te ajuda</li>
              <li><strong>Ganhos imediatos:</strong> Performance 3x melhor no dia 1</li>
            </ol>

            <p>Mais de 1.200 empresas já migraram. A pergunta não é "se", mas "quando" você vai migrar. Que tal hoje, com 20% OFF?</p>

            <a href="https://lumina.app.br/migrate-now?utm_source=campaign&variant=B&urgency=true" style="background: #2196F3; color: white; padding: 20px 40px; font-size: 18px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0;">
              Garantir Minha Oferta →
            </a>

            <p style="color: #666; font-size: 14px;">Aproveite até ${new Date(Date.now() + 24*60*60*1000).toLocaleDateString('pt-BR')} às 23:59</p>
          `,
          whatsapp: `${firstName}, sua oferta exclusiva termina em 24h!\n\n🎁 20% OFF + Onboarding\n🎁 Suporte VIP 30 dias\n🎁 Migração assistida\n\nZero risco, ganhos imediatos.\n\nGaranta agora: https://lumina.app.br/migrate-now`,
          linkedin: `Última chamada, ${firstName}! Oferta especial do Flow Builder 2.0 termina hoje. 20% OFF + onboarding personalizado + suporte VIP. Não perca esta oportunidade de revolucionar as automações de ${company}: https://lumina.app.br/migrate-now`
        }
      }
    };

    const stageTemplates = templates[stage];
    if (!stageTemplates) return null;

    const variantTemplates = stageTemplates[variant];
    return variantTemplates;
  })()
}}

Parte 4: Enviar Mensagens por Canal

4.1. Enviar Email

// Send Email
{
  "to": "{{ $item.user_email }}",
  "from": "marketing@lumina.app.br",
  "fromName": "Equipe Lumina",
  "subject": "{{ $nodes['definir-mensagens'].output.emailSubject }}",
  "html": "{{ $nodes['personalizar'].output.email }}",
  "tracking": {
    "campaign_id": "{{ $item.campaign_id }}",
    "contact_id": "{{ $item.contact_id }}",
    "stage": "{{ $item.current_stage }}",
    "variant": "{{ $item.ab_variant }}"
  }
}

4.2. Enviar WhatsApp (Se no Array de Canais)

// If/Else: "Deve Enviar WhatsApp?"
{{
  $nodes['definir-mensagens'].output.channels.includes('whatsapp') &&
  JSON.parse($item.user_data).phone
}}
// WhatsApp - Send Message
{
  "to": "{{ JSON.parse($item.user_data).phone }}",
  "type": "text",
  "text": {
    "body": "{{ $nodes['personalizar'].output.whatsapp }}"
  }
}

4.3. Enviar Push Notification

// HTTP Request: "Enviar Push (OneSignal)"
{
  "method": "POST",
  "url": "https://onesignal.com/api/v1/notifications",
  "headers": {
    "Authorization": "Basic {{ $credentials.onesignal.apiKey }}",
    "Content-Type": "application/json"
  },
  "body": {
    "app_id": "{{ $credentials.onesignal.appId }}",
    "include_external_user_ids": ["{{ $item.user_email }}"],
    "headings": {
      "en": "{{ $nodes['personalizar'].output.push.title }}"
    },
    "contents": {
      "en": "{{ $nodes['personalizar'].output.push.body }}"
    },
    "url": "{{ $nodes['personalizar'].output.push.url }}",
    "data": {
      "campaign_id": "{{ $item.campaign_id }}",
      "contact_id": "{{ $item.contact_id }}",
      "stage": "{{ $item.current_stage }}"
    }
  }
}

4.4. Enviar SMS (Twilio)

// SMS - Send (Twilio)
{
  "to": "{{ JSON.parse($item.user_data).phone }}",
  "from": "{{ $credentials.twilio.phoneNumber }}",
  "body": "{{ $nodes['personalizar'].output.sms }}"
}

4.5. Enviar LinkedIn Message (PhantomBuster)

// HTTP Request: "Enviar LinkedIn Message"
{
  "method": "POST",
  "url": "https://api.phantombuster.com/api/v2/agents/launch",
  "headers": {
    "X-Phantombuster-Key": "{{ $credentials.phantombuster.apiKey }}"
  },
  "body": {
    "id": "{{ $vars.linkedinMessagingAgentId }}",
    "argument": {
      "sessionCookie": "{{ $credentials.linkedin.sessionCookie }}",
      "profileUrls": ["{{ JSON.parse($item.user_data).linkedin_url }}"],
      "message": "{{ $nodes['personalizar'].output.linkedin }}"
    }
  }
}

Parte 5: Registrar Envios e Atualizar Status

5.1. Salvar Mensagens Enviadas

// Database Insert (Multiple): "Registrar Mensagens"
{
  "table": "campaign_messages",
  "data": [
    {
      "campaign_id": "{{ $item.campaign_id }}",
      "contact_id": "{{ $item.contact_id }}",
      "stage": "{{ $item.current_stage }}",
      "channel": "email",
      "subject": "{{ $nodes['definir-mensagens'].output.emailSubject }}",
      "content": "{{ $nodes['personalizar'].output.email }}",
      "sent_at": "{{ new Date().toISOString() }}",
      "metadata": "{{ JSON.stringify({ message_id: $nodes['enviar-email'].output.messageId }) }}"
    },
    // Adicionar outros canais se enviados
    "{{ $nodes['enviar-whatsapp'] ? { campaign_id: $item.campaign_id, contact_id: $item.contact_id, stage: $item.current_stage, channel: 'whatsapp', content: $nodes['personalizar'].output.whatsapp, sent_at: new Date().toISOString() } : null }}",
    // ... etc
  ]
}

5.2. Atualizar Contato

// Database Update: "Atualizar Stage do Contato"
{
  "table": "campaign_contacts",
  "data": {
    "current_stage": "{{ $item.current_stage + 1 }}",
    "status": "{{ $item.current_stage >= 3 ? 'completed' : 'in_progress' }}",
    "updated_at": "{{ new Date().toISOString() }}"
  },
  "where": {
    "id": "{{ $item.contact_id }}"
  }
}

Parte 6: Tracking de Engajamento

6.1. Webhook para Email Opens/Clicks

Configure webhooks no seu provedor de email (SendGrid, Mailgun):

// Webhook Trigger: "Email Event"
// URL: https://api.lumina.app.br/v1/webhooks/wh_campaign_email_events
// Transform: "Processar Evento de Email"
{{
  {
    "eventType": $trigger.body.event, // open, click, bounce, etc
    "email": $trigger.body.email,
    "campaignId": $trigger.body.campaign_id,
    "contactId": $trigger.body.contact_id,
    "timestamp": $trigger.body.timestamp,
    "metadata": {
      "url": $trigger.body.url,
      "userAgent": $trigger.body.user_agent,
      "ip": $trigger.body.ip
    }
  }
}}
// Database Update: "Atualizar Message com Open/Click"
{
  "query": `
    UPDATE campaign_messages
    SET
      {{ $nodes['processar-evento'].output.eventType === 'open' ? 'opened_at' : 'clicked_at' }} = '{{ $nodes['processar-evento'].output.timestamp }}',
      metadata = metadata || '{{ JSON.stringify($nodes['processar-evento'].output.metadata) }}'::jsonb
    WHERE campaign_id = {{ $nodes['processar-evento'].output.campaignId }}
      AND contact_id = {{ $nodes['processar-evento'].output.contactId }}
      AND channel = 'email'
      AND stage = (SELECT current_stage - 1 FROM campaign_contacts WHERE id = {{ $nodes['processar-evento'].output.contactId }})
  `
}
// Database Insert: "Registrar Evento"
{
  "table": "campaign_events",
  "data": {
    "campaign_id": "{{ $nodes['processar-evento'].output.campaignId }}",
    "contact_id": "{{ $nodes['processar-evento'].output.contactId }}",
    "event_type": "{{ $nodes['processar-evento'].output.eventType }}",
    "channel": "email",
    "event_data": "{{ JSON.stringify($nodes['processar-evento'].output.metadata) }}",
    "created_at": "{{ $nodes['processar-evento'].output.timestamp }}"
  }
}

Parte 7: Análise e Otimização

7.1. Dashboard de Métricas

-- Performance geral da campanha
SELECT
  c.name,
  COUNT(DISTINCT cc.id) as total_contacts,
  COUNT(DISTINCT cc.id) FILTER (WHERE cc.status = 'completed') as completed,
  COUNT(DISTINCT cc.id) FILTER (WHERE cc.status = 'opted_out') as opted_out,
  COUNT(DISTINCT cm.id) as total_messages,
  COUNT(DISTINCT cm.id) FILTER (WHERE cm.opened_at IS NOT NULL) as opened,
  COUNT(DISTINCT cm.id) FILTER (WHERE cm.clicked_at IS NOT NULL) as clicked,
  COUNT(DISTINCT cm.id) FILTER (WHERE cm.converted_at IS NOT NULL) as converted,
  ROUND(
    COUNT(DISTINCT cm.id) FILTER (WHERE cm.opened_at IS NOT NULL)::DECIMAL /
    NULLIF(COUNT(DISTINCT cm.id), 0) * 100,
    2
  ) as open_rate,
  ROUND(
    COUNT(DISTINCT cm.id) FILTER (WHERE cm.clicked_at IS NOT NULL)::DECIMAL /
    NULLIF(COUNT(DISTINCT cm.id) FILTER (WHERE cm.opened_at IS NOT NULL), 0) * 100,
    2
  ) as click_through_rate,
  ROUND(
    COUNT(DISTINCT cm.id) FILTER (WHERE cm.converted_at IS NOT NULL)::DECIMAL /
    NULLIF(COUNT(DISTINCT cc.id), 0) * 100,
    2
  ) as conversion_rate
FROM campaigns c
LEFT JOIN campaign_contacts cc ON cc.campaign_id = c.id
LEFT JOIN campaign_messages cm ON cm.campaign_id = c.id
WHERE c.id = 1
GROUP BY c.id, c.name;

-- Performance por canal
SELECT
  cm.channel,
  COUNT(*) as sent,
  COUNT(*) FILTER (WHERE cm.opened_at IS NOT NULL) as opened,
  COUNT(*) FILTER (WHERE cm.clicked_at IS NOT NULL) as clicked,
  ROUND(AVG(EXTRACT(EPOCH FROM (cm.opened_at - cm.sent_at))/3600), 2) as avg_hours_to_open
FROM campaign_messages cm
WHERE cm.campaign_id = 1
  AND cm.sent_at IS NOT NULL
GROUP BY cm.channel
ORDER BY opened DESC;

-- A/B Test Results
SELECT
  cc.ab_variant,
  COUNT(*) as contacts,
  COUNT(*) FILTER (WHERE cc.status = 'completed') as converted,
  ROUND(
    COUNT(*) FILTER (WHERE cc.status = 'completed')::DECIMAL /
    NULLIF(COUNT(*), 0) * 100,
    2
  ) as conversion_rate,
  AVG((
    SELECT COUNT(*)
    FROM campaign_events ce
    WHERE ce.contact_id = cc.id AND ce.event_type = 'clicked'
  )) as avg_clicks_per_contact
FROM campaign_contacts cc
WHERE cc.campaign_id = 1
  AND cc.ab_variant IS NOT NULL
GROUP BY cc.ab_variant
ORDER BY conversion_rate DESC;

-- Performance por stage
SELECT
  cm.stage,
  COUNT(*) as sent,
  COUNT(*) FILTER (WHERE cm.opened_at IS NOT NULL) as opened,
  COUNT(*) FILTER (WHERE cm.clicked_at IS NOT NULL) as clicked,
  ROUND(
    COUNT(*) FILTER (WHERE cm.opened_at IS NOT NULL)::DECIMAL /
    NULLIF(COUNT(*), 0) * 100,
    2
  ) as open_rate
FROM campaign_messages cm
WHERE cm.campaign_id = 1
GROUP BY cm.stage
ORDER BY cm.stage;

7.2. Relatório Automático (Flow Agendado)

// Schedule Trigger: Executar 1x por semana

// Database Query: Buscar métricas (usar queries acima)

// Function Node: Gerar relatório HTML

// Send Email: Enviar para stakeholders
{
  "to": ["marketing@empresa.com", "growth@empresa.com"],
  "subject": "📊 Relatório Semanal - Campanha {{ $vars.campaignName }}",
  "html": "{{ $nodes['gerar-relatorio'].output.html }}"
}

Teste Completo

# Simular inscrição de usuário teste
curl -X POST https://api.lumina.app.br/v1/webhooks/test_enroll_campaign \
  -H "Content-Type: application/json" \
  -d '{
    "campaign_id": 1,
    "user_email": "teste@example.com",
    "user_data": {
      "first_name": "João",
      "company": "TechCorp",
      "phone": "+5511999999999",
      "linkedin_url": "https://linkedin.com/in/joaotest"
    },
    "segment": "active_users"
  }'

# Acompanhar logs e verificar:
# ✅ Usuário inscrito
# ✅ Stage 0 enviado imediatamente (email + push)
# ✅ Após 24h, Stage 1 enviado (email + whatsapp)
# ✅ Eventos de open/click sendo registrados
# ✅ Métricas atualizando em tempo real

Próximos Passos

  1. Lead Scoring - Qualifique antes de nutrir
  2. Influencer Outreach - Automatize parcerias
  3. Feedback Loop - Ouça seus clientes

Última atualização: Janeiro 2025