Cockpit de marketing — analytics de redes sociais, Meta Ads e Funil Vivo (React Flow) com conversão ao vivo. Arquitetura MockAdapter→MetaAdapter sem tocar na UI.
Cockpit unificado de marketing: painel de redes sociais (Instagram, Facebook, YouTube, TikTok), Meta Ads com ROAS/CPC/CPA e alertas automáticos, e Funil Vivo — canvas React Flow com métricas ao vivo injetadas por adapter intercambiável (Mock → Meta) sem alterar a UI.
Time de marketing BWC Corp — gestores de tráfego, analistas de redes sociais e diretores que acompanham funil de conversão ao vivo.
Systemd user service bwc-marketing.service — Caddy → 172.18.0.1:3050
A UI nunca fala com a Meta diretamente. Ela consome /api/metrics?keys=..., que delega a um MetricsAdapter plugável:
FunilVivo.tsx; busca do próprio backend em /api/metrics — o backend que decide qual adapter usarPara ir de Mock para Meta: setar META_ACCESS_TOKEN + META_IG_USER_ID/META_AD_ACCOUNT_ID no ambiente do serviço. Zero mudança de código.
Funnel — layout React Flow serializado em JSON (nodes + edges, com metas por estágio) ·
Snapshot — histórico de métricas por stageKey (comparativo semana a semana) ·
SocialAccount — contas de rede conectadas (instagram, facebook, youtube, tiktok) com followers/reach/engagement ·
Campaign — campanhas Meta Ads com spend/revenue/impressions/clicks/conversions ·
Diagram — diagramas livres (modo Lucid genérico) ·
Setting — configurações chave-valor (ex.: roas_alert_threshold)
FunnelStageNode com tier (topo/meio/fundo) e métrica ao vivo injetada a cada 4 sFunnelEdge com taxa de conversão calculada em tempo real (source → target) e benchmark configurável (verde ≥ benchmark, vermelho abaixo)PUT /api/funnels/:id; criação com nome via POST /api/funnelsSnapshot (base para comparativo semana a semana)alerted_campaigns)Protegidos por CRON_SECRET via query param ?key=.... Notificações via sendTelegram().
/api/metricsMetricsAdapter plugável. Resposta: { values: { stageKey: number }, at: ISO }. Fonte: Mock (dev) ou Meta real (quando credenciais presentes)./api/status{ dataSource: "meta" | "mock", live: boolean }./api/social{ accounts: SocialAccount[], totals: { followers, reach, avgEngagement } }./api/ads{ campaigns, totals: { spend, revenue, conversions, blendedRoas }, threshold, alerts }. Alertas disparados quando campanha de conversão ativa fica abaixo do threshold de ROAS configurado./api/funnels{ name, data } onde data é o JSON serializado do canvas React Flow.{ name?, data? }./api/diagrams{ name, data? }./api/sync{ ok, synced: { instagram, campaigns } }. Retorna 400 se credenciais não configuradas./api/report/api/settingsroas_alert_threshold).{ key, value }./api/cron/:job?key=CRON_SECRET.?key=CRON_SECRET.?key=CRON_SECRET.file:./pulse.db)
META_ACCESS_TOKENToken de system user da Meta (long-lived) com escopos: instagram_basic, instagram_manage_insights, pages_read_engagement, ads_read
META_IG_USER_IDID da conta Instagram Business/Creator
META_AD_ACCOUNT_IDID da conta de anúncios (só números, sem "act_")
META_FB_PAGE_ID(Opcional) ID da página do Facebook
META_GRAPH_VERSION(Opcional) Versão da Graph API — default v21.0
CRON_SECRETChave para proteger endpoints /api/cron/* via ?key=...
TELEGRAM_BOT_TOKENToken do bot Telegram para alertas e digest
TELEGRAM_CHAT_IDChat ID do destinatário das notificações
META_ACCESS_TOKEN + META_IG_USER_ID/META_AD_ACCOUNT_ID o app roda em modo Mock — Funil Vivo "respira" com dados simulados, sem nenhuma chamada externa.bwc-marketing.service (systemd user)
└─ Next.js 14 (porta 3050)
↑
Caddy Reverse Proxy → 172.18.0.1:3050
↑
pulse.bwccorp.com.br (HTTPS — Cloudflare + Let's Encrypt)
Fonte de dados (plugável via env):
MockMetricsAdapter ←─ sem credenciais Meta (modo dev/demo)
MetaMetricsAdapter ←─ com META_ACCESS_TOKEN (modo produção)
↕
ApiMetricsAdapter (FunilVivo.tsx → /api/metrics → adapter acima)
Jobs agendados (cron externo ou systemd timer):
POST /api/cron/snapshot → historico WoW
POST /api/cron/digest → Telegram digest diário
POST /api/cron/alerts → Telegram ROAS alert (dedupe)
Gerado automaticamente — BlackCat Corp • Voltar ao índice