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
- Lead Scoring - Qualifique antes de nutrir
- Influencer Outreach - Automatize parcerias
- Feedback Loop - Ouça seus clientes
Última atualização: Janeiro 2025