SOL · pilar único SDR

Central completa da revisão. Página gerada por scripts/gerar-sol-sdr.py lendo a API do n8n PROD e os artefatos aprovados da revisão — nenhum número é digitado à mão.

Os três eixos — independentes

vida = pertencimento arquitetural (tag vida:*, só muda com evidência de aposentadoria). n8n = estado de runtime (campo active). revisão = varredura Workplace (tag workplace:*). Nenhum é derivado do outro.

27workflows atuais
1aposentados
26ativos
1inativos
0revisados
23pendentes
8sem eixo

Revisão Workplace — onde estamos

Acompanhamento por estado, não por conversa. O progresso é acumulado: uma regressão vira REABERTO e incrementa o contador, sem apagar o que já foi feito.

AGORACAPTAÇÃO — Meta e Landing modularizados e provados E2E; WhatsApp ainda misturado no inbound
PRÓXIMA AÇÃO ÚNICASeparar a CAPTAÇÃO do WhatsApp direto (Recepção + Ingestão) sem quebrar a QUALIFICAÇÃO
cadeiatotalnão iniciados em revisãoprontosrevisados 
CAPTAÇÃO320/3
QUALIFICAÇÃO5410/5
HANDOVER440/4
OPS990/9
OBSERVABILIDADE330/3

Por workflow

workflowcadeiaestadocorreções testesupabasevisualrevisadoreab.
sol.captacao.entrada-lead
histórico
  • 13/08 — auditoria no a no, 13 gaps
  • 13/08 — webhook autenticado + token rotacionado
  • 17/08 — origem/canal/Meta ids gravando
  • 18/08 — REABERTO: PUT da API quebrou o IF via webhook (corrigido no mesmo dia)
  • 18/08 — 4 correcoes: SM nao-silencioso, telefone terminal, evidencia 1o contato, retry
  • 18/08 — 4 correcoes aplicadas e validadas; renomeado para sol.captacao.entrada-lead
  • 18/08 — E2E provado em 2 leads organicos (sm_status Abertos + template_entregue true); lane Landing removida; renomeado para SOL - Captação - Ingestão de Leads Meta
CAPTACAOPRONTO4/4passousaneadoatualizadoNÃO1
sol.captacao.meta-poll
histórico
  • 13/08 — checkpoint por telefone: 32.544 execucoes/dia -> ~288
  • 17/08 — page_id real da Graph + campaign_id
  • 17/08 — falha da Graph deixou de virar success falso
  • 18/08 — provado na volta do OAuth: 9 represados, 7 entregues, 0 replay
  • 18/08 — renomeado para sol.captacao.meta-poll; no do cron passou a dizer a verdade (Cron 5min · 24h)
  • 18/08 — renomeado para SOL - Captação - Coleta de Leads Meta
CAPTACAOPRONTO4/4passoun/aatualizadoNÃO0
sol.captacao.meta-leadgen-receptor
histórico
  • 13/08 — auditado: tecnicamente completo, 0 execucoes desde que existe
  • 18/08 — aguarda decisao poll x webhook
  • 18/08 — arquivado: 0 execucoes desde que existe; endpoint /sol-meta-leadgen responde 404
CAPTACAOARQUIVADO0/0n/an/aatualizadoNÃO0
sol.inbound.whatsapp
histórico
  • 13/08 — auditado: 50 nos
  • 17/08 — branch de criacao grava WHATSAPP_DIRETO (parte da CAPTACAO)
QUALIFICACAOCORRIGINDO1/?pendenteparcialatualizadoNÃO0
2gZdr2EvcuB6UoRX
histórico
  • 18/08 — criado: separa a LEITURA da planilha do tronco
  • 18/08 — E2E linha 752 passou; 2 ciclos seguintes = 0 replay
CAPTAÇÃOPRONTOn/apassoun/aatualizadoNÃO0
TysfJ4xg1kvfKlx2
histórico
  • 18/08 — criado: tronco duplicado para dar independencia a Landing
  • 18/08 — E2E lead 612449: origem/pagina/canal/SM/template OK; contact_id NULL (pendente)
CAPTAÇÃOCORRIGINDO0/1passou com 1 ressalvaokatualizadoNÃO0

Bloqueadores reais

Só o que de fato impede fechar. Descoberta lateral vai para backlog e não trava o selo.

Placar da CAPTAÇÃO

A cadeia não fecha porque "o workflow roda". Fecha quando se responde, sem inferência: quantos entraram, por qual caminho, quantos viraram registro válido, quantos chegaram ao SolarMarket, quantos receberam a primeira abordagem, quantos ficaram pendentes, e se existe backlog.

Caminhos de entrada — estado real

caminhoestadoúltima entregaevidência
Meta Lead Ads · poll
sol.captacao.meta-poll (syCkKOzOyX7Uydbj)
OK2026-08-18 22:00RESTABELECIDO 18/08 14:55 UTC. Ficou parado 2 dias e 14 horas (16/08 00:20 -> 18/08 14:55, ~750 ciclos) por credencial OAuth invalidada. Ao voltar: Graph devolveu 131 leads, 131/131 com form_id 1355008362677886. Dos 9 leads represados, o checkpoint entregou 7 e barrou 2 corretamente (ja existiam por outro canal). Zero replay: 7 execucoes webhook para 7 leads.
Meta Lead Ads · webhook
sol.captacao.meta-webhook (pZ6aenKD92QjT755)
SEM EVENTOnunca0 execucoes retidas. Ativo e tecnicamente completo, mas a Meta nunca entregou nada nele.
Landing/Site · planilha
sol.captacao.entrada-lead — lane cron (Q8HFEmithXX9Do2b)
OK2026-08-18 23:20Cron de 5 min rodando: 250 execucoes retidas, 250 success.
WhatsApp direto · novo lead
sol.inbound.whatsapp (28WqoWNKIEanBI7G)
OK2026-08-18 21:4398 execucoes retidas, todas success. Conta como entrada SO quando o telefone nao existia antes: nesse caso a propria 1a mensagem cria o lead. Provado em 65/65 leads. E o unico caminho entregando volume hoje.

Entradas por dia

Entrada = telefone que não existia antes. META_LEAD_ADS + LANDING_PAGE + WHATSAPP_DIRETO. A última coluna, respostas, é mensagem de lead que já existia — isso é início da QUALIFICAÇÃO e está fora da conta de aquisição, de propósito. Linha marcada = nenhum lead do formulário Meta naquele dia.

diaentraramMETA_LEAD_ADSLANDING_PAGEWHATSAPP_DIRETO com SM1º contatoqualificadossem SM respostas
(não é entrada)
2026-08-12523524
2026-08-1383238442
2026-08-148628662
2026-08-153213201
2026-08-16312310
2026-08-1711291116
2026-08-1816112316123

Backlog do formulário Meta

no último ciclo que leu a Graph122 leads no formulário
120 reais (2 eram teste da própria Meta)
desses, no Supabase120 — todos
represados no instante da quebra0
represados agoraNAO DETERMINADO

No instante da quebra a conta fechava exata: 162 meta_ads no Supabase = 120 reais do form (122 menos 2 leads de teste da propria Meta) + 42 do backlog do form anterior. Zero represado. Depois de 16/08 00:20 UTC nao ha como contar: a Graph nao responde para a credencial do poll, entao todo lead que entrou no formulario desde entao esta invisivel para nos.

Regra: Entrada da CAPTACAO = META_LEAD_ADS + LANDING_PAGE + WHATSAPP_DIRETO. Resposta de lead que ja existia NAO entra na contagem de entrada: e inicio da QUALIFICACAO. A coluna "respostas" abaixo esta fora da conta de aquisicao, de proposito.

QUALIFICAÇÃO NORMAL 100%

A regra que essa cadeia inteira defende: valor informado no formulário não é conta validada. O valor declarado é sinal comercial; a conta de energia é prova. Só o OCR abre o gate.

SOL SDR CONTA OCR MÉDIA 3M PRAZO SCORE DECISÃO RESUMO HANDOVER

Gates e garantias

garantiaestadocomo
conta sempre solicitadaoko valor do formulário não abre mais o gate
PDF/imagem + OCRokgpt-4o, READ_OK/PARTIAL/FAIL, guard anti-modelo
valor declarado preservadookvalor_conta intacto
valor OCR separadookvalor_conta_ocr, coluna própria
histórico de consumookconsumo_historico jsonb
média 3 mesesoksó meses reais; menos de 3 = NULL
prazo como gateokperguntado só após a conta validada
score definitivookrecalculado após OCR + prazo
qualificação precoce bloqueadaokfastQualify virou prioridade, não rota
resumo canônicookum objeto → whisper + SolarMarket + gestão
handover ordenadookts_qualificado < ts_handoff
telemetria operacionalok1ª resposta, tempo de resposta, mensagens IA
ledger de IAok1 chamada = 1 evento, preço congelado
idempotência econômicaokrequest_key UNIQUE; retry não cobra 2×

Prova ponta a ponta — lead 612449 / projeto SM 14770

captaçãoLANDING_PAGE / GOOGLE / OLIMPIA
declarado no formulárioR$ 850,00/mês
validado pelo OCRR$ 144,35 · READ_OK · confiança 95%
prazoMais para o futuro
score / temperatura35 · FRIO
statusQUALIFICADO
closerDanieli Nicasso
SLA do handoverts_qualificado < ts_handoff por 12s
conversa persistida13 mensagens
custo de IA do leadUS$ 0,098853

Consumo lido na conta

Dez/2025408 kWh
Jan/2026441 kWh
Fev/2026371 kWh
média 3 meses406,67 kWh

Cobertura do backend

indicadorvalor
leads na base280
com conta validada por OCR4
com média de 3 meses4
com 1ª resposta medida4
handover em ordem correta36
eventos no ledger de IA18
custo de IA acumuladoUS$ 0.246548

Nenhum evento de IA sem precificacao: todo uso registrado tem custo calculado.

1 leads historicos ainda tem ts_handoff anterior a ts_qualificado. Sao anteriores a correcao e nao foram saneados — o saneamento so entra depois que o escritor esta certo, e agora esta.

SLA do handover — série histórica

O writer antigo gravava ts_handoff no início do handover, em ramo paralelo, enquanto o filho regravava ts_qualificado no fim. Resultado: 34 leads com SLA fisicamente impossível — handover antes da qualificação.

situaçãoleadscomo
invertidos antes do saneamento34
reconstruídos por evidência real33 20 pela execução n8n do handover · 13 pelo evento de transferência no Krolik
não reconstruíveis1mantidos como estavam, fora do SLA
timestamps fabricados0 nenhuma estimativa, nenhum swap de campo, nenhum "+1 segundo"

Distribuição do ts_handoff − ts_qualificado reconstruído: mín 0.656s · mediana 2.853s · p95 5.717s · máx 10.86s. Nenhum outlier absurdo.

Regressão no writer novo: 612453 +11.108s · 612457 +12.27s · 612449 +11.585s — todos positivos.

remanescentemotivo
lead 569563nenhum evento de transferencia no Krolik em ±5 min da qualificacao; execucao n8n fora da janela de retencao

Ressalva de leitura: Os historicos foram reconstruidos pelo instante da TRANSFERENCIA DO CHAT ao closer. O writer novo carimba ts_handoff quando o handover INTEIRO termina (SolarMarket + Krolik + gestao), alguns segundos depois. As duas metades da serie medem pontos ligeiramente diferentes do mesmo evento.

Regra de encerramento — quando a SOL para

A · QUALIFICOU + ENTREGOU AO CLOSER evidência: transferido_comercial = true e closer_id preenchido — os dois batem em 84 leads
B · DESQUALIFICOU evidência: status = 'DESQUALIFICADO' — 34 leads

Regra auditada nos 26 em 13/08/2026: o filtro de elegibilidade do sol.followup.janela-24h exige status in (ABERTO,QUALIFICACAO) e ts_qualificado is null e ts_transferido is null e ts_desqualificado is null — quatro guardas. Nenhum fluxo de SDR ou FUP retoma atuação depois do FIM SOL. Exposição residual: sol.followup.reprocessa-parados e sol.ops.altera-status-lead são webhooks sem autenticação que conseguem reescrever status e ressuscitar um lead encerrado.

Nas duas saídas a atuação da SOL como SDR termina naquele lead. Depois do handoff quem conduz é o closer, e o desfecho comercial mora no SolarMarket — não na SOL. ts_transferido não serve como prova de handoff: está em 153 leads contra 57 reais.

Jornada — CAPTAÇÃO → QUALIFICAÇÃO → HANDOVER → FIM SOL

Visão canônica da SOL. OPS e OBSERVABILIDADE são camadas de suporte, não etapas da jornada. Continua pilar único SDR — as divisões abaixo são cadeia:*, não pilares. Elo marcado NÃO ANALISADO não foi provado.

etapaworkflow(s)objeto supabaseestadorevisão
CAPTAÇÃO
Meta / Google → entrada → Supabase → SolarMarket → 1º contato
SOL - Captação - Coleta de Leads Meta [SOL] Meta Leadgen SOL - Captação - Ingestão de Leads Metalead + conversa(capture)QUALIFICACAOprovado
QUALIFICAÇÃO
Inbound → SDR → FUP → qualifica / desqualifica
sol.inbound.whatsapp [SOL] SDR Engine sol.followup.janela-24h sol.followup.reprocessa-parados sol.crm.garante-cliente-projetoconversa + campos de qualificaçãoQUALIFICACAOprovado
HANDOVER
Qualificado → closer → entrega → confirmação
[SOL] Qualificar Lead [SOL] Desqualificar [SOL] Router Tag sol.roteamento.fallback-tagstransferido_comercial + closer_idQUALIFICADO / DESQUALIFICADOprovado
FIM SOL
Qualificou e entregou, ou desqualificou. A SOL sai de cena.
ts_handoff / ts_desqualificadoterminalprovado
OPS · camada de suporte
Ferramentas internas de leitura e correção
sol.crm.token [SOL] Ops Query (read-only) sol.ops.le-lead sol.ops.meta-form-readonly [SOL] Ops SM Lookup (read-only) [SOL] Ops SM GraphQL (read-only) [SOL] Ops Krolik Lookup (read-only) [SOL] Ops Sheet Read (read-only) sol.ops.altera-status-leadtransversalprovado
OBSERVABILIDADE · camada de suporte
Vigias, métricas e briefing
sol.observabilidade.silencio-inbound sol.comercial.resposta-closer [SOL] Briefing Diário Rafael (08h BRT)alertastransversalprovado

Workflows · 27

Linha enxuta; a ficha completa abre abaixo, na seção de fichas.

idworkflowetapavidan8nworkplacenósdecisão
2gZdr2EvcuB6UoRXSOL - Captação - Coleta de Leads Landing PageNÃO ANALISADOsem eixo vidaativosem eixo revisão7
syCkKOzOyX7UydbjSOL - Captação - Coleta de Leads MetaCAPTAÇÃOvivoativopendente7pendente
TysfJ4xg1kvfKlx2SOL - Captação - Ingestão de Leads Landing PageNÃO ANALISADOsem eixo vidaativosem eixo revisão30
Q8HFEmithXX9Do2bSOL - Captação - Ingestão de Leads MetaCAPTAÇÃOvivoativopendente37pendente
YIfTKTi28C1R4z7bSOL - TESTE - Prepara E2E 14770 (one-shot)NÃO ANALISADOsem eixo vidainativosem eixo revisão5
MIJwx1qcLAJW6Lrt[SOL] Briefing Diário Rafael (08h BRT)OBSERVABILIDADEvivoativopendente6pendente
1NW8E0etgiPUc8kn[SOL] DesqualificarHANDOVERvivoativopendente23pendente
vtkHm3dMPdQu4bsB[SOL] Ops Krolik Lookup (read-only)OPSvivoativopendente3pendente
eEkCmi1xfiXlAqYz[SOL] Ops Query (read-only)OPSvivoativopendente3pendente
wwnlcgDy8f3gvkTA[SOL] Ops SM GraphQL (read-only)OPSvivoativopendente4pendente
ElyzB7oOlfIyC39k[SOL] Ops SM Lookup (read-only)OPSvivoativopendente4pendente
4a7NUQbfsbMQTBQN[SOL] Ops Sheet Read (read-only)OPSvivoativopendente3pendente
S2lRZ4ihpAiMMCHj[SOL] Qualificar LeadHANDOVERvivoativopendente40pendente
Vdc0MQeGJl5yvnp2[SOL] Router TagHANDOVERvivoativopendente21pendente
EsLDYIxZvp7jmr9D[SOL] SDR EngineQUALIFICAÇÃOvivoativopendente15pendente
RkaGtxj71VYewn8Asol.comercial.resposta-closerOBSERVABILIDADEvivoativopendente9pendente
XNjrr2RSn2TEzfoosol.crm.garante-cliente-projetoQUALIFICAÇÃOvivoativopendente17pendente
zkgVYMEviJ3NvoZwsol.crm.tokenOPSvivoativopendente4pendente
voSpd9sEtmMoREAzsol.followup.janela-24hQUALIFICAÇÃOvivoativopendente20pendente
gP5UBqGVqdSmSrAbsol.followup.reprocessa-paradosQUALIFICAÇÃOvivoativopendente10pendente
28WqoWNKIEanBI7Gsol.inbound.whatsappQUALIFICAÇÃOvivoativopendente62pendente
DJAnXCzk4ptkxZ1rsol.obs.registra-uso-iaNÃO ANALISADOsem eixo vidaativosem eixo revisão5
KBLy8U1eSBjjCzWksol.observabilidade.silencio-inboundOBSERVABILIDADEvivoativopendente8pendente
ls6fMFxOKVNVJJF9sol.ops.altera-status-leadOPSvivoativopendente3pendente
PKcR12bXg2DHuZZpsol.ops.le-leadOPSvivoativopendente4pendente
RYCHPYTrFE0NSKd9sol.ops.meta-form-readonlyOPSvivoativopendente4pendente
PxsIxCyRuxDBU00ksol.roteamento.fallback-tagsHANDOVERvivoativopendente5pendente

Aposentados · 1

Arquivados no n8n em 14/08/2026 — fora da contagem, dentro da memória. Continuam exportados em Sol-estrategia/n8n/workflows/ e o arquivamento é reversível.

idworkflownóspor que saiu
pZ6aenKD92QjT755[SOL] Meta Leadgen9

Fichas — 23 de 27 revisadas

Clique para abrir. Workflow ainda não revisado mostra só o que o n8n PROD sabe.

SOL - Captação - Coleta de Leads Landing Page2gZdr2EvcuB6UoRXNÃO ANALISADO

NÃO ANALISADO — este workflow ainda não passou pela revisão nó a nó. O que se sabe vem só do n8n PROD: 7 nós, ativo.

SOL - Captação - Coleta de Leads MetasyCkKOzOyX7Uydbjrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeVarre a Graph API da Meta a cada 5 minutos e injeta os leads do formulário no webhook do Ads Capture. É o feeder real da captação hoje.
contrato — o que deveria fazerBuscar APENAS os leads novos desde a última varredura e entregá-los uma única vez ao fluxo de entrada, mantendo marca do que já foi enviado.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: webhook /sol-ads-inbound
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: NÃO
retry: NENHUM · onError continue: 2 nós · 1 segredos inline
nome aprovadosol.captacao.meta-poll
RENOMEAR — o nó do cron mente
posição na jornadaCAPTAÇÃO
entra de: Graph API — form 1355008362677886
sai para: [SOL] Ads Capture (POST /sol-ads-inbound)
triggercron */5 * * * *
integraçõesCOM FACEBOOK
supabase lê: nada
escreve: nada
estados recebe: —
altera: —(não toca Supabase)
saída:
testeNAO TESTADO
Leitura da Graph confirmada: 114 leads, paging none.

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

BUG
  • ✅ CORRIGIDO 13/08 — B1 · GET /leads?limit=200 SEM filtro de data, SEM cursor, SEM registro do que já enviou. Reenvia os 112 leads reais do form a cada 5 min: 32.256 POSTs/dia contra o Ads Capture.
  • B2 · O cron é */5 * * * * 24h/dia, mas o nó se chama "Cron 10min (8-20h)". Nome mente sobre o comportamento.
  • ✅ CORRIGIDO 13/08 — B3 · limit=200 sem paginação: quando o form passar de 200 leads, os mais antigos somem da varredura silenciosamente.
RISCO
  • R1 · Só a idempotência da RPC capture_lead impede que isso vire 112 WhatsApps duplicados por ciclo.
  • ✅ CORRIGIDO 13/08 — R2 · errorWorkflow configurado ([Tech] Alerta de Erro).
DRIFT
  • ✅ CORRIGIDO 13/08 — D1 · o receptor passou a validar o token; segredo rotacionado.
DUVIDA
  • Q1 · Manter poll ou migrar para o webhook page-wide (instantâneo)?

melhorias recomendadas

  • M1 · Guardar a marca d'água (created_time do último lead processado) e filtrar a busca por ela.
  • M2 · Alternativamente, tabela de leadgen_id já processado.
  • M3 · Corrigir o nome do nó do cron.
  • M4 · Paginar ou ordenar por created_time desc.
  • M5 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

SOL - Captação - Ingestão de Leads Landing PageTysfJ4xg1kvfKlx2NÃO ANALISADO

NÃO ANALISADO — este workflow ainda não passou pela revisão nó a nó. O que se sabe vem só do n8n PROD: 30 nós, ativo.

SOL - Captação - Ingestão de Leads MetaQ8HFEmithXX9Do2brevisado em 13/08/2026decisão: pendente
papel — o que faz hojePorta de entrada de todo lead de aquisição: recebe da Meta (webhook) e do site (planilha Google), normaliza, grava no Supabase, garante cliente/projeto no SolarMarket e dispara a primeira abordagem no WhatsApp.
contrato — o que deveria fazerReceber todo lead válido de aquisição, de qualquer canal, registrá-lo de forma completa, idempotente e rastreável, garantir o cadastro no SolarMarket, abrir a conversa com a primeira abordagem, e entregá-lo ao próximo estágio em estado inequívoco — concluído por inteiro ou visivelmente falho.
ligaçõeschamado por: sol.captacao.meta-trigger-aposentado, [SOL] Meta Leadgen, [SOL] Meta Leads Poll, [SOL] Captura Meta Form Novo (poll 5min 24h)
chama: [SOL] getSMToken
segurançawebhooks: POST /sol-ads-inbound
auth: SEM AUTH · errorWorkflow: sim
retry: NENHUM · onError continue: 13 nós · 3 segredos inline
nome aprovadosol.captacao.entrada-lead
RENOMEAR — pendente de GO
posição na jornadaCAPTAÇÃO
entra de: Meta Lead Ads (via [SOL] Captura Meta Form Novo) · planilha Google do site
sai para: sol.inbound.whatsapp (quando o cliente responde) · sol.followup.janela-24h
triggercron */5 * * * * | webhook POST /sol-ads-inbound
integraçõesCOM GOOGLEAPIS SUPABASE
supabase lê: nada
escreve: lead (PATCH), conversa (POST), rpc capture_lead
estados recebe: —(cria o lead)
altera: QUALIFICACAO
saída: QUALIFICACAO
testeNAO TESTADO
E2E com lead controlado exige GO (efeito externo: cria SM + envia WhatsApp).

campos gravados

canal_origem · chat_id · contact_id · email · etapa_funil · gclid · identificador_sm · origem · sm_status · status · telefone_normalizado · ts_ultima_interacao · ultimo_canal

mensagens

este fluxo não produz comunicação a cliente

gaps

BUG
  • ✅ CORRIGIDO 13/08 — B1 · Feeder em replay permanente: 32.544 execuções/dia (112 replays + 1 cron a cada 5 min). Retenção de execuções caiu para 85 MINUTOS — a exec 808717 (lead perdido) já responde 404. Auditoria forense da SOL virou impossível.
  • B2 · Falha do SolarMarket é silenciosa: 7 dos 8 nós SM são continueRegularOutput. SM fora do ar => lead gravado com identificador_sm vazio, sm_status="Abertos" mentindo, WhatsApp enviado, execução marcada success. O errorWorkflow nunca dispara.
  • B3 · Zero retry em 34 nós. Lead perdido comprovado: Marciel Freitas (Franca/SP, faixa R$1.200), ECONNRESET no capture_lead em 12/08.
  • B4 · Telefone inválido: descarte silencioso nas duas lanes. Na planilha a linha nunca é marcada (o continue acontece antes de qualquer write-back) => relida a cada 5 min, indefinidamente.
  • B5 · PATCH lead enriquecido roda mesmo com is_new=false e sobrescreve canal_origem: 5 leads que chegaram pelo WhatsApp foram reetiquetados como google_site.
RISCO
  • ✅ CORRIGIDO 13/08 — R1 · Webhook POST /sol-ads-inbound sem autenticação (options:{}). O feeder JÁ envia x-webhook-token; nenhum nó lê. Qualquer POST anônimo cria lead, cria cliente/projeto no SM e dispara WhatsApp.
  • ✅ MITIGADO 13/08 — R2 · A enxurrada acabou; o gate da RPC deixou de ser a única proteção.
  • R3 · Primeira mensagem depende de 8 chamadas SM sequenciais (timeout 30s cada). Mediana real medida: 12s — mas o pior caso teórico é ~2,5 min.
DRIFT
  • D1 · etapa_funil="TRAFEGO PAGO" gravado também em lead da planilha/site: 23 dos 28 leads google_site. O PATCH mora na sub-lane do SM, alcançada por qualquer lane.
  • D2 · canal_origem gravado em minúsculo pelo PATCH (meta_ads/google_site), contra maiúsculo da RPC e do inbound (WHATSAPP).
  • D3 · Nome do workflow não descreve a função; o nó do feeder chama-se "Cron 10min (8-20h)" mas roda */5 24h.
LEGADO
  • L1 · GET channel (Meta token) é vestigial — a saída não é usada pelo nó seguinte.
  • L2 · Branch false de IF veio da planilha não tem conexão: beco sem saída para lead Meta repetido.
  • L3 · Duas URLs do Supabase hardcoded (PATCH âncora FUP, PATCH lead contact_id) em vez de ler do 00_CONFIG.
  • L4 · client_id_sm nunca escrito (0%); project_id_sm em 40%.
DUVIDA
  • Q1 · Falha do SM: seguir e alertar, parar e alertar, ou seguir com fila de reparo?
  • Q2 · Manter a mensagem depois do SM (CRM garantido) ou disparar em paralelo (resposta imediata)?
  • Q3 · Telefone inválido: só marcar a planilha, ou notificar alguém para recuperar o lead na mão?

melhorias recomendadas

  • M1 · Dar memória ao feeder (filtro created_time > última varredura ou registro de leadgen_id já enviado) e corrigir o cron para a janela real — mata 99,98% da carga e devolve o histórico de execuções.
  • M2 · Validar o x-webhook-token que já chega (IF + Respond 401), mesmo padrão de Router Tag e inbound.whatsapp.
  • M3 · Se identifier vier vazio: não gravar sm_status="Abertos", marcar falha e alertar. Mensagem continua saindo.
  • M4 · Persistir campanha, meta_leadgen_id e form_id (feeder passa a carimbar form_id).
  • M5 · retryOnFail/maxTries=3/wait 2s no Supabase capture_lead (RPC é idempotente).
  • M6 · Validar telefone antes da bifurcação, com estado terminal em cada lane.
  • M7 · Gravar template_msg_id e template_entregue a partir da resposta do Krolik.
  • M8 · PATCH enriquecido só quando is_new=true.
  • M9 · Remover etapa_funil dos 2 PATCH (aqui e no inbound).
  • M10 · Padronizar caixa de canal_origem + backfill.
  • M11 · Higiene: remover nó vestigial, fechar o beco, tirar URLs hardcoded, renomear.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

SOL - TESTE - Prepara E2E 14770 (one-shot)YIfTKTi28C1R4z7bNÃO ANALISADO

NÃO ANALISADO — este workflow ainda não passou pela revisão nó a nó. O que se sabe vem só do n8n PROD: 5 nós, inativo.

[SOL] Briefing Diário Rafael (08h BRT)MIJwx1qcLAJW6Lrtrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeÀs 08h manda no WhatsApp do Rafael o resumo do funil do dia.
contrato — o que deveria fazerDar leitura diária confiável do estado da operação.
segurançawebhooks: GET /sol-briefing-run
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 1 nós
nome aprovadosol.observabilidade.briefing-diario
RENOMEAR
posição na jornadaOBSERVABILIDADE
entra de: cron 08h BRT
sai para: WhatsApp Rafael
triggercron 0 8 * * * | webhook GET /sol-briefing-run
integraçõesCOM SUPABASE
supabase lê: lead (GET)
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook run-now sem auth.
  • R2 · Sem errorWorkflow: se quebrar, o briefing só some.
DRIFT
  • D1 · Único SOL sem a tag "sol" e sem cadeia:*.

melhorias recomendadas

  • M1 · Tag sol + cadeia.
  • M2 · errorWorkflow.
  • M3 · Autenticar run-now.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Desqualificar1NW8E0etgiPUc8knrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeEncerra o lead ruim: marca DESQUALIFICADO, manda despedida, remove tags do robô, finaliza o chat e move o projeto para Declínio/Perdido no SolarMarket.
contrato — o que deveria fazerSer o único ponto que declara FIM SOL por desqualificação, com o CRM refletindo a perda.
ligaçõeschamado por: sol.inbound.whatsapp, [SOL] Router Tag
chama: [SOL] getSMToken
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: NENHUM · onError continue: 11 nós · 7 segredos inline
nome aprovadosol.handover.desqualifica
RENOMEAR
posição na jornadaHANDOVER
entra de: sol.inbound.whatsapp · Router Tag
sai para: FIM SOL
triggersub-workflow (chamado por outro)
integraçõesCOM SUPABASE
supabase lê: lead (GET/PATCH)
escreve: lead (GET/PATCH)
estados recebe: QUALIFICACAO
altera: → DESQUALIFICADO
saída: DESQUALIFICADO
testeNAO TESTADO

campos gravados

desqualificado · sm_status · status

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · 11 nós continueRegularOutput: se o SM falhar, o lead fica DESQUALIFICADO no Supabase e Aberto no CRM.

melhorias recomendadas

  • M1 · Verificar e alertar quando o encerramento no SM falhar.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops Krolik Lookup (read-only)vtkHm3dMPdQu4bsBrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeConsulta read-only à API do Krolik (contatos, chats).
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: POST /sol-ops-krolik-7k3
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.krolik-lookup
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-krolik-7k3
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops Query (read-only)eEkCmi1xfiXlAqYzrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeConsulta read-only ao Supabase por webhook (GET only, tabela + querystring). É a base das auditorias e do futuro front.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: POST /sol-ops-query-83c1
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.query-supabase
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-query-83c1
integraçõesSUPABASE
supabase lê: nada
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Token fraco no corpo (5 caracteres). Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops SM GraphQL (read-only)wwnlcgDy8f3gvkTArevisado em 13/08/2026decisão: pendente
papel — o que faz hojeProxy read-only do GraphQL do SolarMarket.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [SOL] getSMToken
segurançawebhooks: POST /sol-ops-sm-gql-4t8
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.sm-graphql
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-sm-gql-4t8
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops SM Lookup (read-only)ElyzB7oOlfIyC39krevisado em 13/08/2026decisão: pendente
papel — o que faz hojeProxy read-only da API REST do SolarMarket, reusando o getSMToken.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [SOL] getSMToken
segurançawebhooks: POST /sol-ops-sm-9d2f
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.sm-lookup
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-sm-9d2f
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops Sheet Read (read-only)4a7NUQbfsbMQTBQNrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeLeitura read-only da planilha Google do site.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: POST /sol-ops-sheet-6f4a
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.sheet-read
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-sheet-6f4a
integraçõesGOOGLEAPIS
supabase lê: nada
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Qualificar LeadS2lRZ4ihpAiMMCHjrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeFecha o ciclo SOL do lead bom: garante cliente/projeto no SM, move de etapa, sorteia o closer na roleta, transfere no Krolik, avisa a equipe e marca QUALIFICADO + transferido_comercial + closer_id.
contrato — o que deveria fazerSer o único ponto que declara FIM SOL por qualificação, com handoff provado (transferido_comercial + closer_id) e notificação confirmada.
ligaçõeschamado por: sol.inbound.whatsapp, [SOL] Router Tag, sol.followup.janela-24h
chama: [SOL] getSMToken
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: 1 nós · onError continue: 18 nós · 10 segredos inline
nome aprovadosol.handover.qualifica
RENOMEAR
posição na jornadaHANDOVER
entra de: sol.inbound.whatsapp · Router Tag · FUP
sai para: FIM SOL (closer assume)
triggersub-workflow (chamado por outro)
integraçõesCOM FACEBOOK SUPABASE
supabase lê: lead (GET/PATCH), closer (GET)
escreve: lead (GET/PATCH)
estados recebe: QUALIFICACAO
altera: → QUALIFICADO
saída: QUALIFICADO
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · 18 nós continueRegularOutput: falha no SM ou no Krolik não impede o lead de virar QUALIFICADO.
  • R2 · Se a transferência no Krolik falhar, o lead consta entregue no Supabase mas o closer não recebeu o chat.
DRIFT
  • D1 · Escreve ts_transferido junto com transferido_comercial — semântica correta aqui, mas o FUP usa o mesmo campo com outro sentido.

melhorias recomendadas

  • M1 · Verificar sucesso da transferência Krolik antes de declarar handoff.
  • M2 · Separar ts_transferido (handoff) de marcador de saída da régua.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Router TagVdc0MQeGJl5yvnp2revisado em 13/08/2026decisão: pendente
papel — o que faz hojePonte manual: a equipe põe uma etiqueta no Krolik e este fluxo executa a ação (qualificar/desqualificar), removendo a etiqueta em seguida.
contrato — o que deveria fazerDar à equipe um controle manual seguro e auditável sobre o robô.
ligaçõeschamado por: sol.roteamento.fallback-tags
chama: [SOL] Qualificar Lead, [SOL] Desqualificar
segurançawebhooks: POST /sol-router-tag
auth: AUTENTICADO · errorWorkflow: sim
retry: NENHUM · onError continue: 8 nós · 10 segredos inline
nome aprovadosol.roteamento.router-tag
RENOMEAR
posição na jornadaHANDOVER
entra de: sol.roteamento.fallback-tags · chamada direta
sai para: Qualificar Lead · Desqualificar
triggerwebhook POST /sol-router-tag
integraçõesCOM SUPABASE
supabase lê: lead (GET/PATCH)
escreve: lead (GET/PATCH)
estados recebe: qualquer
altera: via sub-workflows
saída: QUALIFICADO/DESQUALIFICADO
testeNAO TESTADO
Webhook AUTENTICADO (IF token válido + Respond 401) — um dos 2 da casa.

campos gravados

origem

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · 8 nós continueRegularOutput mascaram falha na remoção da etiqueta (etiqueta órfã reprocessa).

melhorias recomendadas

  • M1 · Confirmar remoção da etiqueta antes de responder OK.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] SDR EngineEsLDYIxZvp7jmr9Drevisado em 13/08/2026decisão: pendente
papel — o que faz hojeCérebro conversacional: monta contexto do lead + histórico, chama a Anthropic, aplica travas determinísticas na resposta e grava a mensagem de saída.
contrato — o que deveria fazerProduzir a próxima ação do SDR de forma auditável, nunca inventando estado, e sempre respeitando os gates de status.
ligaçõeschamado por: sol.inbound.whatsapp
chama: ninguém
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: 1 nós · onError continue: 0 nós
nome aprovadosol.sdr.engine
RENOMEAR
posição na jornadaQUALIFICAÇÃO
entra de: sol.inbound.whatsapp
sai para: resposta ao cliente · sinal de qualificar/desqualificar
triggersub-workflow (chamado por outro)
integraçõesANTHROPIC SUPABASE
supabase lê: lead (GET/PATCH), conversa (GET/POST)
escreve: lead (GET/PATCH), conversa (GET/POST)
estados recebe: QUALIFICACAO
altera: campos de qualificação
saída: QUALIFICACAO
testeNAO TESTADO

campos gravados

telefone_normalizado

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Único nó com retry é a chamada à Anthropic; PATCH e INSERT não têm.
  • R2 · O score exibido em resumo pode divergir da coluna: a coluna é a fonte de verdade.
DUVIDA
  • Q1 · O prompt do SDR vive no nó; deveria versionar em repo?

melhorias recomendadas

  • M1 · Retry nos nós de gravação.
  • M2 · Versionar o prompt fora do nó.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.comercial.resposta-closerRkaGtxj71VYewn8Arevisado em 13/08/2026decisão: pendente
papel — o que faz hojeA cada 10 min verifica, nos chats do Krolik, se o closer respondeu o lead entregue, e grava o tempo de resposta.
contrato — o que deveria fazerMedir a qualidade do handoff — quanto tempo o comercial leva para assumir.
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: 4 nós · onError continue: 0 nós · 1 segredos inline
nome aprovadosol.comercial.resposta-closer
NOME OK
posição na jornadaOBSERVABILIDADE
entra de: cron 10min
sai para: métrica no Supabase
triggercron */10 * * * *
integraçõesCOM SUPABASE
supabase lê: closer (GET), lead (GET/PATCH)
escreve: lead (GET/PATCH)
estados recebe: QUALIFICADO
altera: ts_resposta_closer
saída: QUALIFICADO
testeNAO TESTADO
Tem retry em 4 nós.

campos gravados

nome

mensagens

este fluxo não produz comunicação a cliente

gaps

DUVIDA
  • Q1 · Existe SLA definido de resposta do closer?

melhorias recomendadas

  • M1 · Alertar quando o SLA estourar (hoje só mede, não avisa).

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.crm.garante-cliente-projetoXNjrr2RSn2TEzfoorevisado em 13/08/2026decisão: pendente
papel — o que faz hojeSub-workflow idempotente que acha-ou-cria cliente e projeto no SolarMarket, buscando telefone com e sem 55 para não duplicar.
contrato — o que deveria fazerGarantir exatamente 1 cliente e 1 projeto por lead, sem duplicata, com falha explícita.
ligaçõeschamado por: sol.inbound.whatsapp
chama: [SOL] getSMToken
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: NÃO
retry: 4 nós · onError continue: 0 nós
nome aprovadosol.crm.garante-cliente-projeto
NOME OK
posição na jornadaQUALIFICAÇÃO
entra de: sol.inbound.whatsapp
sai para: ids do SM
triggersub-workflow (chamado por outro)
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO
Tem retry em 4 nós — é o fluxo mais bem protegido da casa.

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Sem errorWorkflow configurado.

melhorias recomendadas

  • M1 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.crm.tokenzkgVYMEviJ3NvoZwrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeAutentica no SolarMarket (REST + GraphQL) e devolve os tokens. Chamado por 6 workflows.
contrato — o que deveria fazerSer o único ponto de autenticação SM, com cache e retry.
ligaçõeschamado por: [SOL] Desqualificar, [SOL] Ops SM Lookup (read-only), [SOL] Ads Capture, [SOL] Qualificar Lead, sol.crm.garante-cliente-projeto, [SOL] Ops SM GraphQL (read-only)
chama: ninguém
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: 2 nós · onError continue: 0 nós
nome aprovadosol.crm.token
NOME OK
posição na jornadaOPS
entra de: 6 workflows
sai para: tokens
triggersub-workflow (chamado por outro)
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO
Tem retry nos 2 nós de auth.

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Sem cache: cada lead abre uma sessão nova. Foi o que derrubou o SM na rajada de 17/07 (42 auths simultâneos).

melhorias recomendadas

  • M1 · Cache do token com TTL.
  • M2 · Jitter/backoff quando chamado em lote.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.followup.janela-24hvoSpd9sEtmMoREAzrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeRégua de follow-up: a cada 5 min busca leads elegíveis, aplica a cadência de toques (texto, áudio ElevenLabs, template Meta), e faz auto-desqualificação com whisper.
contrato — o que deveria fazerReengajar quem não respondeu, respeitando a janela de 24h e o FIM SOL, sem jamais tocar lead entregue ou desqualificado.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [SOL] Qualificar Lead
segurançawebhooks: GET /sol-fup-run-8c2e
auth: SEM AUTH · errorWorkflow: sim
retry: NENHUM · onError continue: 2 nós · 1 segredos inline
nome aprovadosol.followup.janela-24h
NOME OK
posição na jornadaQUALIFICAÇÃO
entra de: cron 5min (8-18 BRT, seg-sáb)
sai para: cliente · Qualificar Lead (handoff FUP)
triggercron */5 8-17 * * 1-6 | webhook GET /sol-fup-run-8c2e
integraçõesCOM ELEVENLABS FACEBOOK SUPABASE
supabase lê: lead (GET/PATCH)
escreve: lead (GET/PATCH), conversa (POST)
estados recebe: ABERTO/QUALIFICACAO
altera: fup_count, ts_ultimo_fup
saída: QUALIFICACAO
testeNAO TESTADO
Filtro de elegibilidade lido: status in (ABERTO,QUALIFICACAO) AND ts_qualificado is null AND ts_transferido is null AND ts_desqualificado is null — 4 guardas, FIM SOL respeitado.

campos gravados

origem · telefone_normalizado · ts_transferido

mensagens

este fluxo não produz comunicação a cliente

gaps

BUG
  • B1 · Usa ts_transferido como marcador de "saiu da régua" na auto-desqualificação. Resultado: 105 dos 174 leads com ts_transferido NÃO são handoff (transferido_comercial=false, closer_id vazio). O campo está corrompido por sobrecarga semântica.
RISCO
  • R1 · chave da API ElevenLabs como string literal no header do nó, sem credencial n8n. É a única chave de terceiro em texto plano na SOL.
  • R2 · Webhook GET /sol-fup-run-8c2e sem auth dispara a régua inteira.
DUVIDA
  • Q1 · Política de domingo/feriado já foi fechada?

melhorias recomendadas

  • M1 · Trocar ts_transferido por um campo próprio (ex.: ts_saida_regua) e limpar os 105.
  • M2 · Mover a chave da ElevenLabs para credencial n8n.
  • M3 · Autenticar o webhook run-now.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.followup.reprocessa-paradosgP5UBqGVqdSmSrAbrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeFerramenta de reprocesso: recebe um lead por webhook, reenvia o template e reseta a régua.
contrato — o que deveria fazerPermitir reprocesso manual controlado, com autorização e trilha.
segurançawebhooks: POST /sol-reprocesso-krolik-9f2c
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 2 nós · 1 segredos inline
nome aprovadosol.followup.reprocessa-parados
NOME OK
posição na jornadaQUALIFICAÇÃO
entra de: chamada manual
sai para: cliente (template)
triggerwebhook POST /sol-reprocesso-krolik-9f2c
integraçõesCOM SUPABASE
supabase lê: nada
escreve: lead (PATCH), conversa (POST)
estados recebe: qualquer
altera: status, ts_ultima_interacao
saída: QUALIFICACAO
testeNAO TESTADO

campos gravados

desqualificado · nome · origem · status · telefone_normalizado · ts_ultima_interacao

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook POST sem auth que ENVIA mensagem ao cliente e reescreve status. Efeito externo disparável por qualquer um com a URL.
  • R2 · Sem errorWorkflow.
DRIFT
  • D1 · Pode ressuscitar lead em FIM SOL — o guard valida payload, não estado terminal.

melhorias recomendadas

  • M1 · Autenticar o webhook.
  • M2 · Bloquear lead em QUALIFICADO/DESQUALIFICADO.
  • M3 · errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.inbound.whatsapp28WqoWNKIEanBI7Grevisado em 13/08/2026decisão: pendente
papel — o que faz hojeRecebe toda mensagem do cliente pelo Krolik: normaliza, deduplica, grava conversa, chama o SDR, faz OCR de conta, aplica botões de prazo, e aciona qualificação ou desqualificação. É o coração da jornada.
contrato — o que deveria fazerSer a única porta de entrada de mensagem do cliente, com autenticação, idempotência e roteamento determinístico para SDR/qualificação, sem jamais atropelar atendimento humano.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [SOL] SDR Engine, [SOL] Qualificar Lead, [SOL] SM Ensure (acha-ou-cria), [SOL] Desqualificar
segurançawebhooks: POST /sol-wa-inbound
auth: AUTENTICADO · errorWorkflow: sim
retry: NENHUM · onError continue: 14 nós · 3 segredos inline
nome aprovadosol.inbound.whatsapp
NOME OK
posição na jornadaQUALIFICAÇÃO
entra de: Krolik (webhook evento 7)
sai para: SDR Engine · Qualificar Lead · Desqualificar · SM Ensure
triggerwebhook POST /sol-wa-inbound
integraçõesCOM FACEBOOK OPENAI SUPABASE
supabase lê: conversa (GET/POST), lead (GET/PATCH)
escreve: conversa (GET/POST), lead (GET/PATCH), rpc capture_lead
estados recebe: QUALIFICACAO/ABERTO
altera: QUALIFICACAO → QUALIFICADO/DESQUALIFICADO
saída: vários
testeNAO TESTADO
Autenticação confirmada por leitura: valida x-webhook-token + organizationId.

campos gravados

cidade · etapa_funil · identificador_sm · nome · origem · sm_status · status · telefone_normalizado · ts_ultima_interacao · valor_conta

mensagens

este fluxo não produz comunicação a cliente

gaps

BUG
  • B1 · Zero retry em 50 nós.
  • B2 · Grava etapa_funil="SOL SDR" sobrescrevendo o valor da captação sem ler o anterior (last-write-wins).
RISCO
  • R1 · Dedupe tem janela de 8s e é fail-open: 2 requests verdadeiramente simultâneos (<100ms) escapam.
  • R2 · 14 nós continueRegularOutput mascaram falha de Krolik/OpenAI/SM.
DRIFT
  • D1 · Token validado como literal inline no nó IF, não via credencial.
  • D2 · conversa.direcao usa "in" aqui e "outbound"/"out" em outros fluxos — 3 vocabulários na mesma coluna.

melhorias recomendadas

  • M1 · Externalizar o token para credencial/config.
  • M2 · Padronizar conversa.direcao em 2 valores.
  • M3 · Remover a escrita de etapa_funil.
  • M4 · Retry nos nós de gravação.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.obs.registra-uso-iaDJAnXCzk4ptkxZ1rNÃO ANALISADO

NÃO ANALISADO — este workflow ainda não passou pela revisão nó a nó. O que se sabe vem só do n8n PROD: 5 nós, ativo.

sol.observabilidade.silencio-inboundKBLy8U1eSBjjCzWkrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeDe hora em hora, alarma se ninguém falou com a SOL há tempo demais, e se há handoff travado.
contrato — o que deveria fazerSer o vigia do funil — detectar silêncio anormal e entrega parada.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [Tech] Avisos Telegram
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: NENHUM · onError continue: 1 nós
nome aprovadosol.observabilidade.silencio-inbound
NOME OK
posição na jornadaOBSERVABILIDADE
entra de: cron horário
sai para: [Tech] Avisos Telegram
triggercron 0 * * * *
integraçõesSUPABASE
supabase lê: conversa (GET), lead (GET)
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Não vigia o replay: 32 mil execuções/dia passaram despercebidas porque ele só olha silêncio, nunca excesso.

melhorias recomendadas

  • M1 · Adicionar alarme de VOLUME anormal de execução, não só de silêncio.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.ops.altera-status-leadls6fMFxOKVNVJJF9revisado em 13/08/2026decisão: pendente
papel — o que faz hojeESCREVE: altera status/closer_id/identificador_sm do lead por webhook, com allowlist de campos.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: POST /sol-ops-patch-4e8b
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.altera-status-lead
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-patch-4e8b
integraçõesSUPABASE
supabase lê: nada
escreve: nada
estados recebe: —
altera: status, closer_id, identificador_sm
saída:
testeNAO TESTADO

campos gravados

closer_id · status

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · RETIFICADO 13/08 — a auditoria classificou como "webhook público sem autenticação". ERRADO: o nó webhook não tem auth, mas o nó Code valida um token no corpo (`if (String(b.t) !== ...) throw unauthorized`), tem allowlist de status, valida ISO nos timestamps e limita o lote a 40. Não é aberto. O problema real é menor: segredo de 5 caracteres no corpo, sem rate limit, e resposta 500 em vez de 401. Severidade rebaixada de CRÍTICO para MÉDIO.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.ops.le-leadPKcR12bXg2DHuZZprevisado em 13/08/2026decisão: pendente
papel — o que faz hojeLeitura read-only de lead por webhook GET.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: GET /sol-sb-ro-k7
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 1 nós
nome aprovadosol.ops.le-lead
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook GET /sol-sb-ro-k7
integraçõesSUPABASE
supabase lê: lead (GET)
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.ops.meta-form-readonlyRYCHPYTrFE0NSKd9revisado em 13/08/2026decisão: pendente
papel — o que faz hojeLeitura read-only dos leads do formulário Meta pela Graph API. Foi esta ferramenta que provou o form real na auditoria.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: GET /sol-form-ro-k7
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 1 nós
nome aprovadosol.ops.le-form-meta
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook GET /sol-form-ro-k7
integraçõesFACEBOOK
supabase lê: nada
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth expõe dados pessoais de 114 leads (nome, telefone, e-mail, cidade) a qualquer um com a URL.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.roteamento.fallback-tagsPxsIxCyRuxDBU00krevisado em 13/08/2026decisão: pendente
papel — o que faz hojeRede de segurança: a cada hora varre os contatos do Krolik procurando etiquetas manuais que o webhook do Router perdeu, e reenvia.
contrato — o que deveria fazerGarantir que nenhuma etiqueta manual fique órfã.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: webhook /sol-router-tag
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: NÃO
retry: NENHUM · onError continue: 1 nós · 3 segredos inline
nome aprovadosol.roteamento.fallback-tags
NOME OK
posição na jornadaHANDOVER
entra de: cron 1h
sai para: [SOL] Router Tag
triggercron hours=1
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera:
saída:
testeNAO TESTADO

campos gravados

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Sem errorWorkflow.

melhorias recomendadas

  • M1 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

Funil real — medido no Supabase

Período 2026-07-01 a 2026-08-18. Toda linha vem de contagem sobre a base, não de estimativa.

etapaquantidadeobservação
Leads no Supabase (todos os canais)277
Leads do Fluxo 01 (captacao)206173 Meta + 33 site
Leads do inbound direto (WhatsApp)71
Receberam 1o contato gravado19695.1% dos de captacao
Responderam6732.5%
QUALIFICADO31.1% do total
DESQUALIFICADO3412.3%
Entregues ao closer (transferido_comercial + closer_id)84handoff PROVADO
Ainda com a SOL (QUALIFICACAO)135
Em regua de FUP (fup_count>0)159
Sem SolarMarket (identificador_sm nulo)12todos do canal WhatsApp; 0 na captacao
Sem nenhuma conversa5
Perdidos por erro (comprovado)1Marciel Freitas — ECONNRESET 12/08. exec 808717 ja expurgada
Reprocessados/replay por dia32.256reinjecoes do feeder contra o Ads Capture

Tempos

A mediana é a leitura honesta: a média é distorcida pelo lote de reparo manual de 17/07.

transiçãonmedianamédiaP90
entrada → 1º contato19612 s11.4 min24 s
1º contato → resposta608.8 min11.4 h52.3 h
resposta → qualificação3960 s28.2 min3.4 min
qualificação → handoffSEM AMOSTRA

Meta — form e page reais, provados na Graph API

FORM ATUAL1355008362677886
112 leads reais de 114 no form
PAGE ATUAL183501845635669
DESDE17/07/2026
1º: 2026-07-17 · último: 2026-08-13
FORM ANTERIOR4509544755984242
backlog de 42 leads, injetado em 17/07 pelo poll hoje morto
campanha atualGeração de Leads Olímpia (Formulário com Lógica Condicional)
120248170693270511
anúncios: 01 - Vizinhos (111) · 01 - Pizza (6) · 01 - Antes e Depois (3)
regra canônicaFORMULARIO = ancora da captacao. CAMPANHA = contexto variavel do lead. O poll varre /{form_id}/leads e NUNCA depende do campaign_id: trocar, duplicar ou renomear campanha nao pode parar a captacao. campaign_id e campaign_name sao persistidos POR LEAD, para que se enxergue Form -> Campanha A -> X leads -> Y qualificados sem perder historico.

CONFLITO RESOLVIDO 17/08: houve divergencia sobre qual seria o form atual (1355008362677886 x 4509544755984242). A propria Meta decide, e ela carimba form_id e campaign_id em cada lead. Na ultima leitura boa (exec 872671, 16/08 00:15 UTC): 122/122 leads com form_id=1355008362677886 e 120/122 com campaign_id=120248170693270511 (os 2 sem campanha sao leads de teste da propria Meta). Ou seja, a campanha 120248170693270511 entrega NESTE form. O 4509544755984242 e o form ANTERIOR, de onde vieram os 42 leads do backlog de julho. Ressalva honesta: essa prova vale ate 16/08 00:15; depois disso a credencial OAuth caiu e nao ha como ver a Graph — se o formulario do anuncio tiver sido trocado depois, so saberemos ao reconectar. PROVADO por leitura da Graph API em 13/08/2026. O nome "Formulário com Lógica Condicional" é da CAMPANHA, não do formulário — foi essa a armadilha que levou à leitura errada anterior. Os 42 leads meta_ads que não estão neste form são o backlog do form anterior, injetado em 17/07 pelo poll hoje morto.

Correções aplicadas — 13/08/2026

Executadas com GO explícito, protocolo desativa → edita → valida → ativa, com golden provado antes de fechar. Todo o resto da auditoria segue sem correção.

APLICADO P0-1 · Replay do feeder morto

O [SOL] Captura Meta Form Novo ganhou CHECKPOINT POR TELEFONE: le os telefones ja gravados na tabela lead e so entrega ao Ads Capture quem ainda nao existe. Fail-closed — se a leitura do Supabase falhar, aborta em vez de reinjetar a base. Auto-curativo: se o n8n ficar parado horas, o lead continua pendente e entra na proxima varredura, entao nao existe janela de tempo que crie buraco. Backfill controlado via 00_CONFIG.modo_backfill. Tambem ganhou errorWorkflow, retry e limite de varredura 500 com falha alta se o form crescer alem disso.

prova: Execucao 861282: checkpoint leu 236 telefones, Monta payloads devolveu 0 itens, POST sol-ads-inbound NAO executou. Dois ciclos consecutivos (23:05 e 23:10) com zero POSTs. Volume do Ads Capture caiu de 113 execucoes a cada 5 min para 1 (so o cron da planilha). Aritmetica fecha: 114 leads no form = 112 ja na base + 2 de teste + 0 entregues.

APLICADO P0-2 · Webhook de captacao fechado

O /sol-ads-inbound passou a validar o x-webhook-token que os chamadores ja enviavam. A verificacao ficou depois do 00_CONFIG, comparando contra o campo inbound_token — sem segredo escrito em condicao de no. Webhook em responseMode=responseNode com Respond 200 e Respond 401. A lane do cron da planilha nao foi tocada. O segredo interno (n8n->n8n) foi rotacionado nos 5 pontos: receptor + 4 chamadores. Nada da Meta foi tocado — Graph token, Page e Form intactos.

prova: POST sem token = 401. POST com o token antigo = 401. POST com o token da primeira rotacao = 401. POST com o token atual = 200 e o fluxo segue. Nenhum lead criado pelos testes; o lead usado no golden (597661) ficou byte a byte igual.

APLICADO P0-3 · Rastreabilidade da CAPTACAO gravada

Migration 0005 (100% aditiva, 7 colunas + 5 indices) aplicada em 17/08. As duas lanes do tronco passaram a gravar tres dimensoes SEPARADAS: origem_entrada (macro), pagina_origem (coluna F da planilha) e canal_aquisicao (coluna G). Antes tudo virava canal_origem=GOOGLE_SITE e 43% dos leads de site ficavam com canal errado. Lane Meta persiste meta_page_id, meta_form_id, meta_leadgen_id e meta_campaign_name com valores reais do payload; o feeder busca o page_id na Graph (/{form_id}?fields=page) em vez de hardcodar constante. canal_origem NAO foi removido — segue por compatibilidade.

prova: Lane Meta (lead 597661): origem_entrada=META_LEAD_ADS, canal_aquisicao=META, page/form/leadgen/campanha reais, pagina_origem=null. Lane planilha (lead 612376, Fernando Ferreira): origem_entrada=LANDING_PAGE, pagina_origem=OLIMPIA, canal_aquisicao=FACEBOOK — corrigiu um caso REAL que estava gravado como google_site. Planilha voltou a estado terminal (JA CADASTRADO), sem loop. Nenhum lead novo criado, nenhum campo existente alterado.

APLICADO P0-4 · Captacao Meta parada deixa de ser silenciosa

O no da Graph tem onError=continueRegularOutput: erro de credencial virava um item {error} e o fluxo seguia marcando SUCCESS com zero leads. Foi assim que a captacao ficou dois dias parada sem ninguem saber. Agora o Monta payloads detecta a resposta de erro e LANCA excecao, disparando o errorWorkflow.

prova: Execucao 880823 passou a reportar status=error em vez de success falso.

Anomalias — 13

Cada uma foi comprovada por leitura direta do PROD nesta auditoria. Nenhuma foi corrigida.

CRITICO CREDENCIAL META QUEBRADA — CAPTACAO PAGA PARADA

A credencial OAuth "Facebook Lead Ads EVOLVE" (aQioFPafaFKd3BNL) responde "refreshToken is required". O ultimo lead da Meta entrou em 15/08/2026 20:05; desde entao NENHUM lead de anuncio foi capturado. Ficou invisivel por ~2 dias porque o onError do no da Graph transformava a falha em success com zero leads. Os leads NAO se perderam: continuam na Meta, e o checkpoint por telefone reentrega todos assim que a credencial for reconectada. Acao necessaria: refazer o OAuth da credencial na UI do n8n (exige navegador e login Meta).

CORRIGIDO REPLAY EM MASSA — CORRIGIDO 13/08

O feeder [SOL] Captura Meta Form Novo busca os 112 leads do form a cada 5 min sem filtro de data nem cursor, e reinjeta todos. 112 replays + 1 cron = 113 execucoes a cada 5 min = 32.544/dia. Retencao de execucoes do n8n caiu para 85 MINUTOS; a exec 808717 do lead perdido ja responde HTTP 404. A SOL perdeu a capacidade de auditar qualquer incidente.

CORRIGIDO WEBHOOK DE CAPTACAO ABERTO — CORRIGIDO 13/08

POST /sol-ads-inbound sem autenticacao. O feeder JA envia x-webhook-token e nenhum no le. Qualquer POST anonimo cria lead, cria cliente/projeto no SolarMarket e dispara WhatsApp real.

MEDIO FERRAMENTA OPS QUE ESCREVE — SEVERIDADE RETIFICADA

sol.ops.altera-status-lead: a auditoria disse "sem autenticacao". ERRADO — o no Code valida um token no corpo, tem allowlist de status e limita lote a 40. O problema real e menor: segredo de 5 caracteres, sem rate limit, responde 500 em vez de 401. Rebaixado de CRITICO para MEDIO.

CRITICO FALHA DE SM MASCARADA

No Ads Capture, 7 dos 8 nos do SolarMarket sao continueRegularOutput. SM fora do ar produz lead com identificador_sm vazio e sm_status Abertos, WhatsApp enviado, execucao marcada success e errorWorkflow inalcancavel.

ALTO DADO PESSOAL EXPOSTO

sol.ops.le-form-meta responde, sem auth, nome/telefone/e-mail/cidade dos 114 leads do formulario.

ALTO SEGREDO EM TEXTO PLANO

chave da API ElevenLabs como literal no header do no ElevenLabs TTS (sol.followup.janela-24h), sem credencial n8n.

ALTO CAMPO SOBRECARREGADO

ts_transferido tem 2 escritores com semanticas diferentes: Qualificar Lead (handoff real) e FUP (marcador de saida da regua). 122 dos 206 registros nao sao handoff.

MEDIO CAMPO WRITE-ONLY

etapa_funil: 2 escritores (TRAFEGO PAGO no Ads Capture, SOL SDR no inbound), 0 leitores no n8n inteiro. 23 leads de site marcados como trafego pago.

ALTO AUSENCIA DE RETRY

Ads Capture: 0 de 34 nos com retry. Inbound: 0 de 50. Um ECONNRESET transitorio perde o lead inteiro — ja aconteceu.

MEDIO ORIGEM SOBRESCRITA

PATCH lead enriquecido roda mesmo com is_new=false: 5 leads que chegaram pelo WhatsApp foram reetiquetados como google_site.

MEDIO SEM ERRORWORKFLOW

13 dos 26 workflows nao tem errorWorkflow configurado.

ALTO WEBHOOKS EXPOSTOS

17 webhooks publicados na SOL; apenas 2 realmente autenticados ([SOL] Router Tag e sol.inbound.whatsapp).

Não mensurável hoje

O que a operação ainda não consegue responder, e o campo que falta para conseguir.

Saúde do backend — o E2E deixou telemetria?

A operação funcionar não basta: ela precisa deixar rastro suficiente para administrar o produto. Auditoria do lead 612449 (execuções 890615 e 890617), campo a campo. Ausência de dado aparece como NÃO MENSURÁVEL, nunca como número bonito.

Cobertura de campos — lead

preenchidos41 de 87
gaps reais6 — campo que deveria estar preenchido e não está

❌ Gaps reais (writer ausente)

✅ NULL legítimo (não é falha)

SLA

SLAduraçãoinício → fim fonteconfiança
CAPTAÇÃO5slead.created_at → conversa[capture/out].tsbackendALTA
ENGAJAMENTO3.19h1ª abordagem → conversa[in].tsbackendALTA
SDR7sresposta do cliente → conversa[sdr/out].tsbackendALTA
QUALIFICAÇÃO13sresposta (proxy) → lead.ts_qualificadobackend, com proxyMÉDIA — não existe timestamp de entrada em SOL SDR
HANDOVERINVERTIDOlead.ts_qualificado → lead.ts_handoffbackendBAIXA — ts_handoff 02:31:25.323 é ANTES de ts_qualificado 02:31:30.689

Custo de IA

Observado na execução (evidência efêmera, não persistida): Anthropic · claude-sonnet-4-6 · input 315 · cache-creation 3894 · cache-read 0 · output 349.
Gap: Para responder "quanto custou este lead" seria preciso persistir usage por conversa + tabela de preço por modelo. NÃO criado neste turno.

outro custoestadoobservação
Krolik / template WhatsAppNÃO MENSURÁVELnenhum campo de custo; o fornecedor cobra por janela/template fora do n8n
SolarMarketNÃO APLICÁVELlicença, não custo por lead
ElevenLabs (áudio do FUP)NÃO MENSURÁVELsem persistência de caracteres/custo
OpenAI OCRNÃO MENSURÁVELnão houve OCR neste lead; e não há writer de usage

Dados que existem só no visual

Supabase — contrato de dados SOL

A · Tabelas

tabelafunçãolinhascolunas PKúnicaescrevemleem
leadRegistro operacional do lead — a verdade da jornada27787idtelefone_normalizado (UNIQUE no banco)entrada-lead, inbound.whatsapp, Qualificar, Desqualificar, FUP, Router, resposta-closer, ops.altera-statusSDR Engine, FUP, Qualificar, Desqualificar, silencio-inbound, Briefing, ops
conversaHistorico de mensagens, entrada e saida152514identrada-lead, inbound.whatsapp, SDR Engine, FUP, reprocessaSDR Engine, silencio-inbound
closerCadastro dos closers para a roleta27idsm_id, krolik_idops.altera-status (campo ativo)Qualificar (roleta), resposta-closer
configConfiguracao operacional da franquia: modelos de IA, faixas de score, horarios de FUP, tags do Krolik, stages do SolarMarket, vozes135franquia_idNENHUMNENHUM — a configuracao efetiva vive hardcoded nos nos 00_CONFIG de cada workflow

B · Campos de lead por responsabilidade

IDENTIDADE · 13 campos

campotipopreenchidoquem escrevequem lêestado
idbigint277/277
100%
[SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.comercial.resposta-closer, sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), [SOL] Router Tag, [SOL] SDR Engine, sol.captacao.entrada-lead, sol.comercial.resposta-closer, sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsapp, sol.observabilidade.silencio-inbound, sol.ops.altera-status-leadCANÔNICO
telefone_normalizadotext277/277
100%
[SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Reparo Rajada 17/07 (one-shot), [SOL] Router Tag, sol.captacao.entrada-lead, sol.captacao.meta-poll, sol.followup.janela-24h, sol.inbound.whatsappCANÔNICO
franquia_idtext277/277
100%
CANÔNICO
nometext277/277
100%
[SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), [SOL] Router Tag, sol.captacao.entrada-lead, sol.comercial.resposta-closer, sol.crm.garante-cliente-projeto, sol.followup.janela-24hCANÔNICO
created_attimestamp with time zone277/277
100%
[SOL] Briefing Diário Rafael (08h BRT), sol.ops.le-leadCANÔNICO
updated_attimestamp with time zone277/277
100%
CANÔNICO
cidadetext235/277
85%
sol.captacao.entrada-lead[SOL] Desqualificar, [SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-leadPARCIAL
emailtext206/277
74%
sol.captacao.entrada-lead[SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-leadPARCIAL
estadotext31/277
11%
SEM USO
ceptext31/277
11%
SEM USO
bairrotext25/277
9%
SEM USO
cpf_cnpjtext12/277
4%
SEM USO
tipo_pessoatext4/277
1%
SEM USO

CAPTAÇÃO · 15 campos

campotipopreenchidoquem escrevequem lêestado
canal_origemtext277/277
100%
sol.captacao.entrada-lead[SOL] Briefing Diário Rafael (08h BRT)CANÔNICO
ultimo_canaltext277/277
100%
sol.captacao.entrada-leadSUSPEITO
origem_entradatext274/277
99%
sol.captacao.entrada-lead, sol.inbound.whatsappsol.inbound.whatsappPARCIAL
etapa_funiltext254/277
92%
[SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.inbound.whatsappsol.inbound.whatsappPARCIAL
canal_aquisicaotext204/277
74%
sol.captacao.entrada-leadsol.inbound.whatsappPARCIAL
pagina_origemtext33/277
12%
sol.captacao.entrada-leadSUSPEITO
meta_page_idtext12/277
4%
sol.captacao.entrada-leadSUSPEITO
meta_form_idtext12/277
4%
sol.captacao.entrada-leadSUSPEITO
meta_leadgen_idtext12/277
4%
sol.captacao.entrada-leadSUSPEITO
meta_campaign_nametext12/277
4%
sol.captacao.entrada-leadSUSPEITO
meta_campaign_idtext12/277
4%
sol.captacao.entrada-leadSUSPEITO
utm_sourcetext0/277
0%
SEM USO
utm_campaigntext0/277
0%
SEM USO
fbclidtext1/277
0%
sol.captacao.entrada-leadSUSPEITO
gclidtext0/277
0%
sol.captacao.entrada-leadSUSPEITO

QUALIFICAÇÃO · 30 campos

campotipopreenchidoquem escrevequem lêestado
scoreinteger277/277
100%
[SOL] DesqualificarCANÔNICO
temperaturatext277/277
100%
[SOL] DesqualificarCANÔNICO
statustext277/277
100%
[SOL] Desqualificar, [SOL] Qualificar Lead, sol.captacao.entrada-lead, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Reparo Rajada 17/07 (one-shot), [SOL] Router Tag, sol.followup.janela-24hCANÔNICO
total_mensagens_iainteger277/277
100%
SEM USO
tem_geracaoboolean277/277
100%
SEM USO
aguardando_contaboolean277/277
100%
sol.followup.janela-24hCANÔNICO
total_audiosinteger277/277
100%
SEM USO
valor_contanumeric235/277
85%
sol.captacao.entrada-lead[SOL] Briefing Diário Rafael (08h BRT), [SOL] DesqualificarPARCIAL
resumo_qualificacaotext122/277
44%
[SOL] DesqualificarSUSPEITO
ts_qualificadotimestamp with time zone103/277
37%
[SOL] Qualificar Lead[SOL] Briefing Diário Rafael (08h BRT), sol.comercial.resposta-closer, sol.followup.janela-24h, sol.observabilidade.silencio-inboundPARCIAL
preferencia_contatotext85/277
31%
SEM USO
prazo_decisaotext55/277
20%
sol.inbound.whatsappsol.inbound.whatsappPARCIAL
tipo_imoveltext34/277
12%
SEM USO
ocr_statustext34/277
12%
SEM USO
ocr_confiancanumeric34/277
12%
SEM USO
instalacao_uctext32/277
12%
SEM USO
distribuidoratext32/277
12%
SEM USO
ts_desqualificadotimestamp with time zone32/277
12%
[SOL] Desqualificar, sol.followup.reprocessa-paradossol.followup.janela-24h, sol.observabilidade.silencio-inboundPARCIAL
consumo_kwh_mesnumeric29/277
10%
SEM USO
consumo_historicojsonb24/277
9%
SEM USO
tendencia_consumotext24/277
9%
SEM USO
classificacao_contatext23/277
8%
SEM USO
tipo_fornecimentotext23/277
8%
SEM USO
consumo_kwh_minnumeric0/277
0%
SEM USO
consumo_kwh_maxnumeric0/277
0%
SEM USO
forma_pagamentotext0/277
0%
SEM USO
tipo_telhadotext0/277
0%
SEM USO
acrescimo_cargatext0/277
0%
SEM USO
consumo_medio_3mnumeric0/277
0%
SEM USO
consumo_medio_12mnumeric1/277
0%
SEM USO

HANDOVER · 9 campos

campotipopreenchidoquem escrevequem lêestado
transferido_comercialboolean277/277
100%
[SOL] Qualificar LeadSUSPEITO
ts_transferidotimestamp with time zone206/277
74%
[SOL] Qualificar Lead, sol.followup.janela-24h[SOL] Briefing Diário Rafael (08h BRT), sol.comercial.resposta-closer, sol.followup.janela-24hPARCIAL
handoff_tipotext90/277
32%
[SOL] Router Tag, sol.followup.janela-24h, sol.inbound.whatsappsol.observabilidade.silencio-inboundPARCIAL
handoff_origemtext90/277
32%
[SOL] Router Tag, sol.followup.janela-24h, sol.inbound.whatsappsol.observabilidade.silencio-inboundPARCIAL
ts_handofftimestamp with time zone87/277
31%
[SOL] Router Tag, sol.followup.janela-24h, sol.inbound.whatsappsol.observabilidade.silencio-inboundPARCIAL
closer_idbigint84/277
30%
[SOL] Qualificar LeadSUSPEITO
ts_resposta_closertimestamp with time zone65/277
23%
sol.comercial.resposta-closersol.comercial.resposta-closerPARCIAL
closer_respondeu_krolik_idtext65/277
23%
sol.comercial.resposta-closerSUSPEITO
tempo_resposta_closer_seginteger65/277
23%
sol.comercial.resposta-closerSUSPEITO

INTEGRAÇÕES · 9 campos

campotipopreenchidoquem escrevequem lêestado
identificador_smtext265/277
96%
[SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Reparo Rajada 17/07 (one-shot), sol.inbound.whatsappPARCIAL
sm_statustext264/277
95%
[SOL] Desqualificar, [SOL] Qualificar Lead, sol.captacao.entrada-lead, sol.inbound.whatsappSUSPEITO
contact_idtext218/277
79%
sol.captacao.entrada-leadSUSPEITO
chat_idtext202/277
73%
sol.captacao.entrada-leadsol.comercial.resposta-closer, sol.followup.janela-24hPARCIAL
project_id_smtext103/277
37%
[SOL] Qualificar Lead[SOL] DesqualificarPARCIAL
template_entregueboolean3/277
1%
sol.captacao.entrada-leadSUSPEITO
client_id_smtext0/277
0%
SEM USO
whatsapp_validoboolean0/277
0%
SEM USO
template_msg_idtext0/277
0%
SEM USO

OPERAÇÃO / SLA · 11 campos

campotipopreenchidoquem escrevequem lêestado
fup_countinteger277/277
100%
sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), sol.followup.janela-24hCANÔNICO
reativado_fupboolean277/277
100%
sol.followup.janela-24h, sol.followup.reprocessa-paradossol.followup.janela-24hCANÔNICO
respondeuboolean277/277
100%
sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), sol.followup.janela-24hCANÔNICO
ts_ultima_interacaotimestamp with time zone263/277
95%
sol.captacao.entrada-lead, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), sol.followup.janela-24hPARCIAL
ts_ultimo_fuptimestamp with time zone170/277
61%
sol.followup.janela-24h, sol.followup.reprocessa-parados[SOL] Briefing Diário Rafael (08h BRT), sol.followup.janela-24hPARCIAL
ts_reativacaotimestamp with time zone158/277
57%
sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsappsol.followup.janela-24hPARCIAL
acao_manualtext8/277
3%
[SOL] Router TagSUSPEITO
ts_acao_manualtimestamp with time zone8/277
3%
[SOL] Router TagSUSPEITO
ts_primeira_respostatimestamp with time zone0/277
0%
SEM USO
tempo_resposta_seginteger0/277
0%
SEM USO
ts_template_reprocessotimestamp with time zone0/277
0%
SEM USO

C · Os três canais da CAPTAÇÃO — leitura e ingestão

Mapeamento do que já existe. Onde leitura e ingestão vivem no mesmo workflow, está mostrado como está — nada foi separado por estética.

canalpapelworkflownó / branch entradasaída
METALEITURAsol.captacao.meta-pollCron 5min · 24h → GET page do form → GET leads form novo → GET telefones existentes (checkpoint) → Monta payloadsGraph API, form 1355008362677886POST /sol-ads-inbound
METAINGESTAOsol.captacao.entrada-leadWebhook Meta Lead → IF token válido → Parse Meta lead → tronco comumPOST /sol-ads-inboundlead + conversa + SM + 1a abordagem
LANDING PAGELEITURAsol.captacao.entrada-leadCron Google 5min → GET planilha Google → Novos leads (planilha) → É processar?planilha Google (gate coluna F)mesmo workflow
LANDING PAGEINGESTAOsol.captacao.entrada-leadNormaliza + monta → tronco comumsaida do no anteriorlead + conversa + SM + 1a abordagem
WHATSAPP DIRETOLEITURAsol.inbound.whatsappWebhook · sol-wa-inbound → Normaliza telefone → IF tel_status → IF token válidoevento 7 do Krolikmesmo workflow
WHATSAPP DIRETOINGESTAOsol.inbound.whatsappSupabase capture_lead → IF lead novo (entry) [TRUE] → PATCH status QUALIFICACAOsaida do no anteriorlead (so quando o telefone nao existia)

D · Contrato de saída — cobertura por canal

campoMETALANDINGWHATSAPP DIRETO
telefone_normalizado173/17333/3371/71
origem_entrada173/17333/3368/71
canal_aquisicao173/17331/330/71
pagina_origem0/17333/330/71
meta_form_id12/1730/330/71
meta_leadgen_id12/1730/330/71
identificador_sm173/17333/3359/71
chat_id111/17328/3363/71
contact_id127/17328/3363/71
template_entregue2/1731/330/71
status173/17333/3371/71
ts_ultima_interacao163/17331/3369/71

E · Funil derivado dos dados

HOJE0 entradas

atendidos 0 · sem atendimento 0 · QUALIFICADO 0 · DESQUALIFICADO 0 · ABERTO 0 · handover concluído 0 · handover pendente 0 · sem SolarMarket 0

ÚLTIMOS 7 DIAS49 entradas
META LEAD ADS 22 · WHATSAPP DIRETO 20 · LANDING PAGE 7

atendidos 49 · sem atendimento 0 · QUALIFICADO 19 · DESQUALIFICADO 3 · ABERTO 27 · handover concluído 19 · handover pendente 0 · sem SolarMarket 0

F · Não mensurável hoje

Supabase SOL — snapshot da auditoria

tabelalinhascolunaspkrlsobservação
lead27787idligado. acesso só pela chave de serviço206 do Fluxo 01 · 71 do inbound · 0 telefones duplicados
conversa1.52514idligado. acesso só pela chave de serviçodirecao tem 3 vocabularios: in / out / outbound
closer27idligado. acesso só pela chave de serviçoVitoria Coelho e Danieli Nicasso
config00INACESSIVEL pela ferramenta ops — tabela nao existe ou sem permissao

o que a auditoria provou

Prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md.

Agentes · 14

⚠️ Este bloco não vem do n8n — vem do censo de 08/08/2026 e é mantido à mão.

agentepapelmodelovia
sol-briefingestagiariosem-modeloCode node
sol-desqualificadorworkersem-modelosub-workflow
sol-detector-resposta-closerestagiariosem-modeloCode node
sol-ocr-contaestagiariogpt-4ohttpRequest api.openai.com
sol-parse-metaestagiariosem-modeloCode node
sol-qualificadorworkersem-modelosub-workflow
sol-regua-fupworkersem-modeloCode node
sol-roleta-closerestagiariosem-modeloCode node
sol-router-tagestagiariosem-modelowebhook Krolik evento 22/31
sol-score-e-travasworkersem-modeloCode node
sol-sdr-conversaworkerclaude-sonnet-4-6httpRequest api.anthropic.com
sol-sm-ensureestagiariosem-modelosub-workflow
sol-voz-fupestagiarioeleven_turbo_v2_5httpRequest api.elevenlabs.io
sol-watchdogestagiariosem-modeloCode node
de onde vem cada número
workflows, ids, nós, eixos, contadores — API n8n PROD, leitura de 19/08/2026 11:47 BRT
fichas, jornada, gaps, mensagens — dados-revisao.json (extrato da revisão fluxo a fluxo)
funil, tempos, supabase — leitura direta do Supabase hsnglsjmiefgxghljgsz em 13/08/2026
meta (form/page) — Graph API v21.0, leitura de 13/08/2026
agentes — censo SOL de 08/08/2026 — mantido à mão

⚠️ SNAPSHOT, não runtime — e assim fica por decisão
O browser não lê o n8n: a chave da API não pode ir para o front. Esta página só muda quando alguém roda ./refresh-sol.sh e commita. É deliberado: ligar visual vivo exige o contrato n8n → Workplace → frontend, que é transversal a toda a plataforma — e não se cria arquitetura especial só para a SOL.

PENDÊNCIA TRANSVERSAL FUTURA — “VISUAIS VIVOS: contrato único n8n → Workplace → frontend para 100% da plataforma” (SOL · Reserve/Rental · demais empresas e pilares).

Campo sem fonte aparece como NÃO ANALISADO — nada é inferido.