Doka Bath Works & Immersi, time de Marketing

Funil Doka

Manual completo do painel de funil de marketing e vendas da Doka Bath Works e da Immersi: o que ele é, como usar, como cada número é calculado, o que pode dar errado e como manter tudo funcionando — escrito para ser entendido por quem nunca programou.

Sistema
funildoka.vercel.app
Responsável hoje
Thiago — Marketing
Versão do documento
1.0 — 10 de setembro de 2026
Estado do sistema
Em produção, uso diário

1O que é o Funil Doka

Comece por aqui se você nunca ouviu falar do sistema. Esta seção explica o que ele faz, para quem serve e o que deliberadamente não faz.

1.1O sistema em uma frase

O Funil Doka é um site interno que junta, num só lugar, números que hoje vivem espalhados em cinco plataformas diferentes — Google Search Console, Google Analytics, RD Station Marketing, RD Station CRM e as redes sociais — e os organiza em seis etapas, da primeira vez que alguém vê a marca até o momento em que uma venda é marcada como fechada.

Antes dele, responder “quantas pessoas viraram oportunidade no mês passado?” exigia abrir quatro sistemas, exportar planilhas e cruzar tudo à mão. O sistema faz esse trabalho automaticamente, sempre que alguém abre a página.

A ideia central

Cada etapa do funil é um número, e cada número tem uma fonte só. Sempre que houver dúvida sobre um valor na tela, a pergunta certa é: “de qual plataforma esse número vem?”. A seção 4.2 responde isso para cada uma das seis etapas.

1.2As seis etapas

O funil é lido de cima para baixo. Cada etapa é mais estreita que a anterior, porque só uma parte das pessoas avança. Entre uma etapa e a próxima o sistema mostra a taxa de conversão — o percentual que passou adiante.

#EtapaEm palavras simplesDe onde vem
01ImpressõesQuantas vezes o conteúdo da marca apareceu para alguém — no Google e nas redes sociais. Aparecer não é clicar.Google Search Console + lançamento manual
02VisitantesPessoas diferentes que entraram no site no período.Google Analytics 4
03LeadsQuem preencheu algum formulário. Demonstrou interesse, mas não necessariamente intenção de comprar.RD Station Marketing + webhook
04MQLOportunidades: quem “levantou a mão” com intenção clara — Onde Comprar, Oportunidade do Mês, WhatsApp.RD Station CRM
05SQLOportunidades que o time comercial classificou com 4 ou 5 estrelas.RD Station CRM
06Vendas digitaisNegociações marcadas como “Vendido” no CRM.RD Station CRM
Cuidado ao apresentar

“Vendas digitais” é a quantidade de negócios sinalizados como fechados no CRM. Não é faturamento, não é receita e não é o número que o financeiro usa. Quem apresentar esse painel para a diretoria precisa dizer isso em voz alta.

1.3O que o sistema não é

  • Não é um CRM. Ele lê o RD Station CRM, mas nunca escreve nada lá. Nenhuma ação feita no painel altera uma negociação.
  • Não é uma ferramenta de faturamento. Nenhum valor em reais entra no sistema.
  • Não substitui o Google Analytics nem o RD. Para análises profundas de comportamento, continue usando as ferramentas originais. O Funil existe para ter a visão geral rápida e comparável.
  • Não guarda dados pessoais de clientes. O que fica gravado são contagens e, no caso dos eventos de webhook, o e-mail de contato usado apenas para identificar o evento.
  • Não é público. O endereço é acessível por quem tiver o link, mas não é divulgado. Não há tela de login.
Consequência prática

Como não existe login, qualquer pessoa com o link consegue ver os números e usar a página de lançamento manual. Trate o endereço como informação interna e não o publique em materiais, apresentações compartilhadas ou redes.

1.4Quem usa, e para quê

PerfilO que faz no sistemaCom que frequência
MarketingAcompanha as seis etapas, compara períodos, identifica o gargalo do mês, lança as impressões de redes sociaisSemanal
Gestão / diretoriaRecebe o resumo por e-mail toda segunda-feira; abre o painel quando quer detalheSemanal, passivo
Comercial / CRMConfere se MQL, SQL e Vendas batem com o que veem no RDEventual
Quem mantém o sistemaRoda diagnósticos, renova credenciais, publica alteraçõesMensal ou quando algo quebra

1.5Como ler esta documentação

O documento é dividido por tipo de necessidade, não por ordem cronológica. Vá direto para a parte que corresponde à sua pergunta:

“Quero aprender a usar”

Seções 2 e 4. A 2 ensina a mexer na tela; a 4 explica o significado de cada número.

“Preciso fazer uma tarefa agora”

Seção 5. São doze roteiros passo a passo, do lançamento semanal à troca de senha de integração.

“Algo quebrou”

Seção 7. Comece pela tabela rápida em 7.2; ela aponta para a ficha detalhada do erro.

“Preciso consultar um dado técnico”

Seção 6. Nomes de arquivo, rotas, variáveis, tabelas do banco, listas fixas.

“Vou assumir o projeto”

Seções 3, 6 e 8, nessa ordem. A 8 tem o checklist de transferência.

“Não entendi uma palavra”

Seção 9, o glossário. Todo termo técnico do documento está lá em português simples.

Use o campo de busca no topo do índice para filtrar as seções por palavra. O documento é uma página só — a busca do navegador (Ctrl+F ou Cmd+F) também encontra qualquer texto daqui.

2Primeiros passos

Um passeio guiado pela interface. Ao final desta seção você consegue abrir o painel, filtrar um período e explicar qualquer número que estiver na tela.

2.1Endereços do sistema

PáginaEndereçoPara que serve
Painel principalfunildoka.vercel.appO funil completo, com filtros e detalhamentos
Lançamento manualfunildoka.vercel.app/manualInserir impressões de redes sociais e dados antigos de RD
Assinantes do e-mailfunildoka.vercel.app/emailsCadastrar e remover quem recebe o resumo semanal
Mapa de dadosfunildoka.vercel.app/mapa-dados-funil.htmlPágina de referência técnica das origens de dado
Diagnósticofunildoka.vercel.app/api/debugTeste automático das integrações (ver 5.6)
Código-fontegithub.com/dokabathworks-commits/funildokaOnde o programa vive

O sistema roda na Vercel, um serviço que hospeda o site. Toda alteração enviada ao GitHub é publicada automaticamente pela Vercel em poucos minutos. Não existe um servidor físico nem uma máquina ligada no escritório.

2.2A tela principal, item por item

De cima para baixo, o painel tem sete blocos:

  1. Cabeçalho
    Nome do sistema, data e hora da última atualização dos dados, botão de tema claro/escuro e os links para as outras páginas.
  2. Filtros
    Período, marca e canal. Detalhados em 2.3.
  3. Barra de status
    Aparece no topo quando alguma integração falha. Some sozinha quando está tudo certo.
  4. Seis cartões de etapa
    Um por etapa do funil, com o número total, o recorte por marca e a taxa de conversão vinda da etapa anterior. Cada cartão tem um botão ? que abre a explicação da etapa em linguagem simples. Clicar no cartão abre o detalhamento.
  5. Funil vertical
    A representação visual em barras, da mais larga (Impressões) à mais estreita (Vendas). A largura é calculada em escala logarítmica — sem isso, as barras de MQL, SQL e Vendas ficariam invisíveis ao lado das impressões.
  6. MQL por Fonte e Perfil de Clientes
    Dois painéis de análise. Detalhados em 2.5.
  7. Status das integrações
    No rodapé: um indicador por plataforma, verde quando os dados chegaram e vermelho quando houve falha.
Dica

Os botões ? ao lado de cada etapa contêm exatamente os textos aprovados pela gestão para explicar cada número. Se alguém perguntar “o que é MQL?” numa reunião, abrir o botão é mais rápido e mais seguro do que improvisar uma definição.

2.3Os filtros

FiltroOpçõesO que muda
Período7, 30, 90 ou 180 dias; ou um intervalo personalizadoRecalcula tudo. O período sempre termina hoje, exceto no intervalo personalizado.
MarcaTodas · Doka · ImmersiEscolhe quais propriedades do Google e quais eventos da RD entram na conta.
CanalTodos · Orgânico · PagoAfeta somente a etapa Visitantes. Pago = visitas cujo meio de sessão é cpc; orgânico = todo o resto.
Limite importante

Períodos que começam há mais de 45 dias não trazem dados de Leads vindos direto da API do RD Marketing — é um limite do plano contratado, não um defeito. O sistema recorre ao cache e aos eventos de webhook nesse caso. Entenda o efeito em 4.3.

2.4Detalhamento de uma etapa

Clicar em qualquer cartão de etapa abre uma janela com a composição daquele número:

EtapaO que o detalhamento mostra
ImpressõesAs 15 páginas mais vistas no Google, por marca, com cliques e taxa de cliques; e o total lançado manualmente por rede social
VisitantesOrigem e mídia de primeiro contato de cada visitante, ordenada por volume
LeadsCada formulário/evento de conversão e quantas conversões trouxe, separado por marca
MQL, SQL, VendasDistribuição por área de atuação — Consumidor Final, Arquiteto, E-commerce, Immersi, Construtora, Hotéis

Dentro da janela há botões para alternar entre Doka e Immersi quando a etapa tem essa separação.

2.5MQL por Fonte e Perfil de Clientes

MQL por Fonte

Cinco cartões, um para cada nota de 1 a 5 estrelas dada pelo time comercial no CRM. Cada cartão lista as fontes de origem que mais trouxeram oportunidades com aquela nota. Serve para responder: “o Instagram traz volume, mas traz oportunidade boa?”.

A fonte vem do campo nativo deal_source do RD CRM — o mesmo que aparece na tela de negociação lá dentro. Se todos os cartões mostrarem “Não identificada”, veja a ficha de erro E-11.

Perfil de Clientes

Cinco recortes das oportunidades criadas no período, extraídos de campos personalizados do CRM: produto de interesse, como conheceu a Doka, representante, marca de interesse e cidade. O cartão mostra os cinco primeiros; clicar abre a lista completa com percentuais.

Por que isso não custa nada

Esses dois painéis não fazem consultas extras ao CRM. Eles reaproveitam a mesma resposta que já foi buscada para calcular MQL, SQL e Vendas. Qualquer alteração futura deve preservar esse princípio: uma chamada ao CRM por carregamento de página.

2.6Barra de status das integrações

O sistema nunca deixa a página em branco por causa de uma integração com problema. Se o Search Console falhar, as outras cinco etapas continuam aparecendo normalmente e apenas Impressões mostra o aviso de erro.

SinalSignificadoO que fazer
Verde em todasAs quatro APIs responderamNada
Uma vermelhaAquela plataforma não respondeu ou recusou a credencialAbrir /api/debug e ir para a seção 7
Um número aparece como O dado não veio; não é zeroMesmo procedimento acima
Zero de verdadeA API respondeu e o valor é zero mesmoConferir o período: pode ser um intervalo sem atividade
Nunca confunda

significa “não sei”. 0 significa “sei, e é zero”. Um relatório que trata traço como zero está errado.

2.7As outras páginas

/manual — lançamento manual

Tem três abas: impressões de redes sociais, dados históricos do RD Marketing e dados históricos do RD CRM. Acima delas há um mapa de calor com as últimas 52 semanas, mostrando quais já têm dado lançado e quais estão vazias. Cada semana começa numa quinta-feira (veja 4.7).

/emails — assinantes do resumo

Lista de e-mails que recebem o resumo de segunda-feira, com campo para cadastrar, botão para remover e um botão para disparar o envio na hora.

/mapa-dados-funil.html — mapa de dados

Página estática de referência, feita antes desta documentação, que detalha campo a campo o que cada API devolve. Continua útil como consulta rápida e traz atalhos para as rotas de diagnóstico.

3Mapa lógico do sistema

Todas as peças, o que cada uma faz e como elas se ligam. Esta é a seção para entender o sistema como um todo antes de mexer em qualquer parte dele.

3.1Diagrama geral

1 · De onde vem o dado 2 · Quem traduz 3 · Quem junta 4 · Quem mostra Google Search Consoleimpressões na busca Google Analytics 4visitantes do site RD Station Marketingconversões de formulário RD Station CRMnegociações, notas, vendas Webhook da RDWhatsApp e institucional Lançamento manualimpressões de redes sociais lib/search-console.js lib/ga4.js lib/rd-mkt.js lib/rd-crm.js lib/webhook-store.js lib/manual-impressions-db.js app/api/ funnel/route.js Chama tudo, soma, classifica por marca e calcula as taxas de conversão. Se uma fonte falha, as outras continuam. Devolve um único pacote de números. Painel principalapp/page.js Página /manuallançamento de dados E-mail semanalsegunda, 8h Mapa de dadospágina de referência Onde o dado fica guardado Postgres — Neon Fonte de verdade das impressões manuais. Tabelas: manual_impressions, Google Sheets Cache do RD, eventos de webhook, lista de e-mails, registro de auditoria. Nada mais é guardado Google e RD são consultados ao vivo a cada carregamento. Não há banco de leads.

Fluxo completo do dado. A caixa tracejada do webhook indica que o recebimento já está construído, mas o webhook ainda não foi registrado na RD — veja 5.7.

3.2As plataformas conectadas

PlataformaO que entregaComo o sistema entraSe cair
Google Search ConsoleImpressões, cliques e páginas mais vistas na busca, por diaConta de serviço do Google com permissão de leitura em cada domínioImpressões ficam só com o valor manual
Google Analytics 4Visitantes únicos, origem/mídia de primeiro contato, divisão pago × orgânicoA mesma conta de serviço, com acesso às duas propriedadesVisitantes mostra
RD Station MarketingConversões de landing pages, formulários e pop-upsAutenticação por token renovável (client id, secret e refresh token)Leads cai para o que houver em cache e webhook
RD Station CRMNegociações, notas de 1 a 5, fonte de origem, campos personalizados, status vendido/perdidoToken fixo, passado na própria URLMQL, SQL, Vendas e Perfil de Clientes ficam todos em
Webhook da RDAvisos em tempo real de conversões que não aparecem no relatório de conversõesA RD chama o endereço do sistema quando o evento aconteceLeads perde a parcela de WhatsApp e institucional
Postgres (Neon)Guarda as impressões de redes sociais lançadas à mãoIntegração Neon dentro da VercelA página /manual falha ao salvar e as impressões manuais somem do total
Google SheetsCache do RD, eventos de webhook, lista de e-mails, auditoria dos lançamentosA mesma conta de serviço, com permissão de edição na planilhaCache e webhook param; o painel continua funcionando com dados ao vivo
GmailEnvio do resumo semanalSenha de aplicativo de uma conta Google WorkspaceO e-mail de segunda não sai; o painel não é afetado
VercelHospeda o site e executa a tarefa agendada de segunda-feiraConta conectada ao repositório do GitHubO sistema inteiro sai do ar
GitHubGuarda o código-fonte e o histórico de alteraçõesRepositório da organizaçãoO site continua no ar; só não é possível publicar mudanças

3.3O caminho de um número até a tela

Sequência exata do que acontece quando alguém abre o painel:

  1. O navegador pede os dados
    A página chama /api/funnel passando período, marca e canal.
  2. Seis consultas partem ao mesmo tempo
    Search Console (Doka e Immersi), Analytics (Doka e Immersi), RD Marketing, impressões manuais no Postgres e eventos de webhook no Sheets. São disparadas em paralelo, e o sistema espera todas — mas não desiste se alguma falhar.
  3. O CRM é consultado à parte, uma única vez
    Essa chamada devolve, de uma vez só, MQL, SQL, Vendas e Perfil de Clientes. É a operação mais lenta do sistema, porque pagina de 200 em 200 negociações.
  4. Cada resultado é conferido
    O que deu certo entra com o valor real. O que falhou entra como null — que a tela mostra como — e carrega junto a mensagem de erro.
  5. Os leads de webhook são classificados por marca
    Cada evento recebido é lido pelo nome: se contém “immersi”, é Immersi; se contém “doka”, é Doka; se não contém nenhum dos dois, entra só no total geral.
  6. As somas são feitas
    Impressões = Search Console Doka + Search Console Immersi + total manual das redes. Leads = conversões da RD + eventos de webhook. As demais etapas vêm direto do CRM.
  7. As taxas de conversão são calculadas
    Sempre etapa seguinte dividida por etapa anterior, com uma casa decimal. Se o denominador é zero, a taxa é zero.
  8. Um efeito colateral é registrado
    Os dias em que o Search Console trouxe dado real são marcados no Postgres, para a regra “API sempre vence” descrita em 4.5. Se essa marcação falhar, ninguém percebe e nada quebra — é intencional.
  9. A resposta volta pronta
    Um único pacote com os seis totais, todos os detalhamentos, as cinco taxas de conversão e o horário exato da consulta.

3.4As quatro categorias de leads

Esta é provavelmente a parte menos óbvia do sistema, e a que mais gera dúvida. Nem toda conversão da RD Station chega pelo mesmo caminho. Elas foram separadas em quatro categorias durante a construção:

CategoriaO que éComo entra no sistemaSituação
AConversões com landing page, formulário ou pop-up nativo da RD por trásConsulta ao relatório de conversões da RDFuncionando
BAs mesmas conversões, mas de períodos além de 45 dias atrásCache no Google Sheets ou lançamento manualFuncionando
CCliques de WhatsApp e formulários do site institucional que não têm um material da RD por trásWebhook — a RD avisa o sistema quando o evento aconteceReceptor pronto; webhook ainda não registrado na RD
DLeads importados à mão em eventos e feiras, identificados por etiquetaParte deles foi reconstruída historicamente e colada na planilhaHistórico reconstruído; não há coleta automática
Por que a categoria C existe

O relatório de conversões da RD só aceita três tipos de material: landing page, formulário e pop-up. Um clique no botão de WhatsApp não é nenhum dos três — então nunca aparece ali, por mais que se ajuste a consulta. Isso foi confirmado na documentação oficial da RD e não é contornável. O webhook é a única saída.

Já foram identificados e reconstruídos 8.288 eventos de categoria C e 281 de categoria D, cobrindo de janeiro de 2025 a agosto de 2026. Eles estão na aba Webhook_RD_MKT da planilha e já entram no total de Leads quando o período consultado os abrange.

3.5Onde cada dado fica guardado

DadoFica emPor quanto tempoSome se…
Impressões, visitantes, conversões, negociaçõesEm lugar nenhum — são consultados ao vivoNão são guardados
Impressões de redes sociais lançadas à mãoPostgres, tabela manual_impressionsPermanenteO banco Neon for apagado
Histórico de quem lançou o quê e quandoGoogle Sheets, aba HistóricoPermanenteA planilha for apagada
Resultados da RD já consultadosGoogle Sheets, abas Cache_RD_MKT e Cache_RD_CRM24 h para períodos recentes; permanente para períodos com mais de 45 diasA planilha for apagada
Eventos de WhatsApp e institucionaisGoogle Sheets, aba Webhook_RD_MKTPermanenteA planilha for apagada
Quem recebe o e-mail semanalGoogle Sheets, aba Emails_NotificacaoPermanenteA planilha for apagada
Senhas e tokensVariáveis de ambiente na VercelAté serem trocadosAlguém apagar a variável
Ponto único de falha

Uma só planilha do Google guarda cache, webhook, e-mails e auditoria. Apagá-la, renomear as abas ou remover a permissão da conta de serviço quebra várias funções de uma vez. Ela nunca deve ser “organizada” por quem não conhece o sistema. Consulte 6.6 antes de tocar em qualquer aba.

4Conceitos e regras de contagem

A parte que evita discussões em reunião. Aqui está a definição oficial de cada etapa, a regra exata que produz cada número e os motivos pelos quais o painel pode divergir de outros relatórios.

4.1Definição de cada etapa

Os textos abaixo são os mesmos que aparecem nos botões ? do painel. Foram revisados e aprovados pela gestão — use-os literalmente ao apresentar os números.

Impressões

Quantas vezes os conteúdos da Doka e da Immersi apareceram para pessoas na internet — no Google, via Search Console, e nas redes sociais, com dados inseridos manualmente. Uma impressão não significa clique, apenas que o conteúdo foi exibido. Quanto maior o número, maior o alcance da marca.

Visitantes

Número de usuários únicos que acessaram o site da Doka ou da Immersi no período, obtido via Google Analytics 4. A taxa de conversão mostra quantos por cento das impressões viraram visitas reais.

Leads

Pessoas que preencheram algum formulário no site — catálogo, arquivo técnico, manual ou outro conteúdo. Demonstraram interesse, mas não necessariamente intenção de compra.

MQL

Sigla de Marketing Qualified Lead, ou lead qualificado pelo marketing. Na Doka são as Oportunidades: pessoas que ativamente levantaram a mão demonstrando intenção clara de compra, preenchendo formulários como “Onde Comprar”, a landing page da Oportunidade do Mês ou o WhatsApp. São os leads com maior potencial de virar cliente.

SQL

Sigla de Sales Qualified Lead, ou lead qualificado pelo time de vendas. Na Doka são as negociações classificadas no CRM com nota 4 ou 5 estrelas. Inclui negociações abertas e fechadas.

Vendas digitais

Oportunidades marcadas como “Vendido” no RD Station CRM pela equipe comercial. Atenção: este número não representa faturamento real — é a quantidade de negócios sinalizados como fechados no sistema, incluindo todos os funis anteriores.

4.2Como cada número é calculado

EtapaFórmula exataFiltro de data usado
Impressões Search Console Doka + Search Console Immersi + soma das impressões manuais de todas as redes sociais Intervalo escolhido, dia a dia
Visitantes Usuários totais da propriedade Doka + usuários totais da propriedade Immersi Intervalo escolhido
Leads Soma das conversões de landing pages, formulários e pop-ups da RD + contagem de eventos recebidos por webhook Data da conversão. Para o webhook, a data real do evento, não a data em que chegou
MQL Contagem de todas as negociações criadas no período no CRM created_at — data de criação da negociação
SQL Das negociações acima, as que têm nota 4 ou 5 created_at, o mesmo conjunto do MQL
Vendas digitais Negociações fechadas com ganho no período — uma consulta separada ao CRM closed_at — data de fechamento, independentemente de quando foi criada
Por que Vendas usa outra data

Uma negociação criada em março e fechada em agosto é uma venda de agosto. Se o sistema usasse a data de criação para tudo, essa venda nunca apareceria ao filtrar agosto. Por isso, e só por isso, Vendas roda numa segunda consulta ao CRM com o filtro de data de fechamento.

Consequência direta: a soma de MQL, SQL e Vendas não descreve um mesmo grupo de pessoas. MQL e SQL são o funil que entrou no período; Vendas é o que saiu nele.

As cinco taxas de conversão

Cada taxa é a etapa seguinte dividida pela etapa anterior, em percentual com uma casa decimal: impressões → visitantes, visitantes → leads, leads → MQL, MQL → SQL, SQL → vendas. Quando a etapa anterior é zero, a taxa é exibida como zero, não como erro.

A taxa mais baixa da coluna indica o maior gargalo do funil — o ponto onde uma ação de marketing tem o maior efeito potencial.

4.3A janela de 45 dias da RD Marketing

O plano contratado da RD Station Marketing só devolve conversões de datas até 45 dias atrás contando de hoje. Esse detalhe é mais traiçoeiro do que parece:

O erro clássico

O limite não é sobre a duração do período pedido. É sobre quão antiga é a data inicial. Um período de cinco dias que comece há três meses é recusado exatamente como um período de noventa dias — mesmo tendo apenas cinco dias de extensão.

O que o sistema faz diante disso:

  1. Calcula quantos dias separam hoje da data inicial pedida.
  2. Se for mais de 44, empurra a data inicial para 44 dias atrás e avisa na resposta que o período foi ajustado.
  3. Se mesmo essa data ajustada já for posterior ao fim do período pedido — ou seja, o período inteiro está velho demais —, nem chega a chamar a API. Devolve zero e uma nota explicando, e o número passa a depender só do cache, do webhook e dos lançamentos manuais.

Isso evita disparar uma consulta que já se sabe que vai falhar, e é o motivo pelo qual períodos antigos mostram um total de Leads menor do que o real quando não há cache preenchido.

4.4O cache

Cache é uma cópia guardada de uma resposta já obtida, para não precisar perguntar de novo. No Funil Doka o cache mora em duas abas do Google Sheets e segue duas regras:

Tipo de períodoValidade do cacheMotivo
Recente (começa há menos de 45 dias)24 horasO dado ainda pode mudar; vale reconsultar diariamente
Antigo (começa há mais de 45 dias)PermanenteO dado não muda mais e a API nem responde mais sobre ele

Sempre que a RD Marketing é consultada com sucesso, o resultado é gravado no cache automaticamente. Cada período tem uma linha; gravar de novo o mesmo período substitui a linha anterior.

Quando o cache atrapalha

Se um número parecer congelado num valor antigo, o cache é o primeiro suspeito. A solução é apagar a linha daquele período na aba correspondente da planilha — veja a ficha E-08.

4.5A regra “API sempre vence”

Existe um risco embutido no lançamento manual: se um dia uma plataforma social passar a ser lida automaticamente por API, o mesmo dia poderia ser contado duas vezes — uma pela API e outra pelo valor digitado à mão.

Para impedir isso, toda vez que uma consulta de API traz dado real de um dia específico, o sistema anota esse dia numa tabela de cobertura. Na hora de somar as impressões manuais, se qualquer dia do período de um lançamento já estiver anotado como coberto por API, aquele lançamento inteiro é descartado da soma e devolvido à parte, marcado como conflito para revisão humana.

A regra é deliberadamente conservadora: não faz rateio proporcional, não tenta adivinhar quanto do valor pertence a qual dia. Prefere descartar e sinalizar.

Hoje essa regra não tem efeito prático

As únicas fontes que marcam cobertura hoje são o Search Console da Doka e o da Immersi, e nenhuma plataforma social é lida por API. Os dois conjuntos nunca se cruzam. A regra existe como preparação para o dia em que Instagram, TikTok ou YouTube virarem rastreáveis automaticamente.

4.6Como marca e canal filtram

Marca

Cada etapa separa Doka de Immersi de um jeito diferente, porque as fontes são diferentes:

EtapaComo Doka e Immersi são separados
Impressões e VisitantesCada marca tem sua própria propriedade no Google. A separação é natural.
Impressões manuaisPelo nome da plataforma: chaves terminadas em _immersi são Immersi; o resto é Doka.
LeadsPelo nome do evento de conversão: contém “immersi” → Immersi; contém “doka” → Doka; nenhum dos dois → conta só no total.
MQL, SQL e VendasNão há filtro de marca. Esses números são sempre do CRM inteiro; a separação existente é por área de atuação.
A categoria “ambas”

Eventos genéricos como fale-conosco não citam nenhuma marca no nome. Eles entram no total de Leads, mas não aparecem nem no recorte Doka nem no Immersi. Por isso, ao filtrar por marca, a soma das duas marcas pode ser menor que o total. Não é erro de cálculo.

Canal

O filtro de canal atua só sobre Visitantes. “Pago” são as visitas cuja mídia de sessão é cpc — o que cobre Google Ads, Meta Ads e demais campanhas pagas. “Orgânico” é literalmente todo o resto: busca orgânica, tráfego direto, social não pago, referência e e-mail.

4.7A semana começa na quinta

Na página de lançamento manual, cada semana vai de quinta-feira a quarta-feira. Essa escolha veio da rotina de fechamento do time, não de uma limitação técnica.

Consequências práticas:

  • Ao lançar impressões, a data que identifica a semana é sempre a quinta-feira de início.
  • O sistema calcula sozinho o fim do período: quinta + 6 dias.
  • O mapa de calor das 52 semanas usa essa mesma contagem.
  • Quem exportar dados das redes sociais precisa alinhar o recorte da exportação a esse intervalo, ou os números não vão corresponder à semana lançada.

4.8Por que os números divergem de outros relatórios

Divergência entre o painel e a ferramenta original quase sempre tem uma destas oito causas. Antes de abrir um chamado, confira a lista:

SintomaCausa provável
Leads menor que no RD StationPeríodo além dos 45 dias, ou conversões de categoria C que ainda não são coletadas automaticamente
Vendas diferente do relatório do CRMO painel conta por data de fechamento; o relatório comparado provavelmente conta por data de criação
MQL maior do que o esperadoMQL conta todas as negociações criadas, não só as com nota alta
Visitantes diferente do GA4O painel usa usuários totais e origem de primeiro contato; o relatório padrão do GA4 costuma usar sessões e o agrupamento de canal
Doka + Immersi não fecha com o totalEventos sem marca no nome — a categoria “ambas” de 4.6
Impressões abaixo do esperadoAlguma rede social não foi lançada naquela semana. Confira o mapa de calor em /manual
Número parado, sem mudar há diasCache preso — veja E-08
Search Console abaixo do painel do GoogleO Google leva até três dias para consolidar dados recentes; os últimos dias de qualquer período são provisórios

5Como fazer

Doze roteiros para as tarefas reais do dia a dia. Cada um é independente: vá direto ao que precisa fazer. Os cinco primeiros não exigem nenhum conhecimento técnico.

5.1Lançar impressões de redes sociais

Quando: toda quinta-feira, referente à semana que acabou de fechar. Quem: qualquer pessoa do marketing. Leva: cerca de dez minutos, a maior parte deles exportando os números de cada rede.

  1. Reúna os números nas redes
    Abra o painel de cada rede e anote as impressões (ou alcance, conforme o indicador acordado) do período de quinta a quarta. As oito entradas possíveis são: Instagram Doka, Instagram Immersi, Facebook Doka, Facebook Immersi, Pinterest Doka, YouTube Doka, TikTok Doka e LinkedIn Doka.
  2. Abra funildoka.vercel.app/manual
    A aba de impressões já vem selecionada.
  3. Escolha a semana no mapa de calor
    As 52 semanas aparecem em blocos. Semanas sem dado ficam claras. Clique na quinta-feira correspondente.
  4. Preencha só o que você tem
    Campos deixados em branco são ignorados — não viram zero e não apagam nada. Se você só tem o Instagram nesta semana, preencha só ele.
  5. Informe quem está lançando
    Selecione seu nome na lista. Isso vai para o registro de auditoria e permite descobrir depois quem lançou um valor estranho.
  6. Salve e confira
    O bloco da semana no mapa de calor muda de cor. Abra o painel principal com o período de 7 dias e confirme que o total de Impressões subiu.
Se você lançar de novo a mesma semana

O valor anterior é substituído, não somado. Isso é intencional: permite corrigir um erro de digitação simplesmente lançando de novo. O valor antigo continua registrado na planilha de auditoria, então o histórico não se perde.

5.2Importar várias semanas por CSV

Quando: ao preencher meses de histórico de uma vez, ou ao migrar de uma planilha antiga.

A primeira linha do arquivo tem os nomes das colunas. A coluna semana é obrigatória e deve conter a quinta-feira no formato ano-mês-dia. As demais são opcionais.

# colunas aceitas — use só as que precisar
semana,instagram_doka,instagram_immersi,facebook_doka,facebook_immersi,
pinterest_doka,youtube_doka,tiktok_doka,linkedin_doka,leads,mqls,sqls,vendas

# exemplo real
semana,instagram_doka,facebook_doka,youtube_doka
2026-08-06,142300,38900,12400
2026-08-13,151200,41100,13850
  1. Monte a planilha
    No Excel ou no Google Sheets, com os cabeçalhos exatamente como acima. Salve como CSV separado por vírgula.
  2. Envie em /manual
    Use o campo de importação por CSV, na parte de cima da página.
  3. Leia o resultado
    O sistema devolve linha a linha: salvo ou ignorado, com o motivo. Datas fora do formato ano-mês-dia são recusadas.
  4. Confira no mapa de calor
    As semanas importadas devem ter mudado de cor.
Antes de importar

A importação sobrescreve valores já existentes para a mesma plataforma e semana. Se houver dado bom lá dentro, exporte ou anote antes. E confirme que as datas de semana são quintas-feiras — uma data de segunda-feira cria uma semana paralela que não vai aparecer no mapa de calor.

5.3Corrigir ou apagar um lançamento

Corrigir um valor

Basta lançar a mesma semana de novo com o valor certo, seguindo 5.1. O novo valor substitui o antigo.

Apagar uma semana inteira

  1. Selecione a semana
    No mapa de calor de /manual.
  2. Use o botão de apagar da semana
    Ele remove todas as plataformas daquela semana de uma vez, não uma plataforma isolada.
  3. Confirme
    O bloco volta a aparecer como vazio.
O que continua existindo depois de apagar

Apagar remove o valor do banco de dados, que é o que o painel soma. O registro de auditoria na planilha não é apagado — de propósito. Saber que um valor existiu e foi removido, e por quem, costuma ser mais útil do que um histórico limpo.

5.4Preencher dados antigos de RD

Quando: ao querer ver corretamente um período com mais de 45 dias, que a API da RD já não responde.

A página /manual tem duas abas para isso: uma para RD Marketing (leads e MQLs da semana) e outra para RD CRM (SQLs e vendas, com abertura por funil: Consumidor Final, Arquiteto, E-commerce, Immersi, Construtora e Hotéis).

  1. Levante os números na origem
    Exporte da própria RD Station os totais da semana em questão, enquanto ela ainda estiver acessível por lá.
  2. Escolha a semana e a aba correspondente
    Lembre: a semana começa na quinta.
  3. Preencha e salve
    Esses valores vão para o cache permanente, e o painel passa a usá-los quando aquele período for consultado.
O melhor momento é agora

Dados da RD só podem ser recuperados enquanto ainda estiverem dentro do alcance da ferramenta. Quanto mais o time deixar semanas passarem sem lançar, mais buracos permanentes o histórico terá.

5.5Gerenciar o e-mail semanal

Toda segunda-feira por volta das 8h de Brasília, o sistema envia um resumo dos últimos 7 dias em formato de funil vertical, com as seis etapas, os três principais itens de cada uma e a taxa de conversão entre elas.

Cadastrar alguém

  1. Abra funildoka.vercel.app/emails
  2. Digite o endereço e confirme
    Endereços repetidos são recusados com aviso.

Remover alguém

Na mesma página, use o botão de remover ao lado do endereço. O efeito é imediato.

Enviar o resumo agora

O botão de envio imediato dispara o mesmo e-mail para toda a lista, com os dados do momento. Útil antes de uma reunião — e para testar se o envio ainda funciona.

Detalhes de envio

Cada pessoa recebe uma mensagem individual: ninguém vê o endereço dos outros. Se um envio falhar, os demais continuam, e o resultado informa quantos foram e quais falharam. Se a lista estiver vazia, o sistema simplesmente não envia nada e registra isso.

5.6Rodar um diagnóstico completo

Faça isso primeiro sempre que algo parecer errado. É o passo inicial de praticamente toda ficha de erro da seção 7.

  1. Abra funildoka.vercel.app/api/debug
    A página mostra texto puro, sem formatação. Isso é esperado.
  2. Leia o resumo no final
    Há um bloco _summary com quantos testes passaram de um total de sete.
  3. Localize o que falhou
    Cada integração aparece com "ok": true ou "ok": false. Quando falha, vem junto a mensagem de erro original da plataforma.
  4. Confira as variáveis de ambiente
    No início da resposta há a lista de configurações. Qualquer uma marcada como faltando é a causa mais provável.
  5. Vá para a ficha correspondente
    A seção 7.2 liga cada falha a um procedimento.

Existem ainda seis rotas de diagnóstico específicas, uma por integração, descritas em 6.10. Elas mostram todos os campos disponíveis em cada plataforma — úteis para investigar um problema pontual ou avaliar se um dado novo pode ser incorporado.

Todas as rotas de diagnóstico são apenas leitura

Nenhuma delas altera, cria ou apaga qualquer coisa. Pode abrir à vontade, quantas vezes quiser, sem risco.

5.7Registrar o webhook da RD

Situação atual: o receptor de eventos está pronto, testado e no ar. O que falta é avisar a RD Station para começar a enviar os eventos. É uma ação deliberadamente manual — não é automatizada — e precisa ser feita por alguém confortável com chamadas de API.

  1. Confira o que já existe
    Abra /api/debug-rd-webhooks. A página lista os webhooks já registrados na conta e mostra, sem enviar nada, o conteúdo exato da requisição que criaria o novo. Só de ler essa página já se sabe se o registro é necessário.
  2. Confirme que o endereço responde
    A RD só aceita registrar um webhook depois de verificar que o endereço devolve uma resposta de sucesso. O endereço é funildoka.vercel.app/api/webhooks/rd-mkt.
  3. Envie o registro
    É um envio para https://api.rd.services/integrations/webhooks, autenticado com o mesmo token do RD Marketing já usado pelo sistema — não é preciso pedir permissão nova. O conteúdo declara o tipo de evento como conversão de contato, informa o endereço de destino e traz a lista de identificadores de evento da categoria C.
  4. Confirme
    Abra /api/debug-rd-webhooks de novo: o novo webhook deve aparecer na lista.
  5. Verifique a chegada dos eventos
    Depois de algumas horas, abra a aba Webhook_RD_MKT da planilha. Linhas novas devem estar aparecendo.

Os identificadores da categoria C já confirmados como ausentes do relatório de conversões — e que portanto precisam do webhook — são: onde-comprar-doka, receber-novidades-doka, profissionais-arquitetura, seja-revenda-doka, fale-conosco, onde-comprar-doka-hoteis, onde-comprar-doka-construtoras, whastapp-oportunidade-mes-doka, whastapp-oportunidade-mes-immersi, whatsapp-immersi e botao-whatsapp-site-6c8e4561d65a832ed531.

Duas armadilhas conhecidas

A RD recusa registrar dois webhooks com o mesmo endereço e o mesmo tipo de evento — se der erro de duplicidade, o webhook já existe. E a RD suspende um webhook que falha repetidamente. Por isso o receptor sempre responde sucesso, mesmo quando não consegue gravar na planilha: perder um registro é menos grave do que perder o webhook inteiro.

5.8Trocar uma credencial

Credenciais são as senhas que o sistema usa para conversar com cada plataforma. Elas nunca ficam no código nem neste documento: vivem apenas como variáveis de ambiente na Vercel, em Configurações → Variáveis de Ambiente.

Regra que não se quebra

Nunca cole um token, uma senha ou uma chave em documento, e-mail, mensagem de chat, ticket de suporte ou apresentação. Se um valor vazar, ele deve ser revogado na plataforma de origem e gerado de novo — não basta apagar a mensagem.

CredencialOnde gerar de novoQuando trocar
Chave da conta de serviço do GoogleGoogle Cloud, no projeto coleta-ga4, em contas de serviço → chavesSe vazar; ou por política, anualmente
Credenciais do RD MarketingÁrea de aplicativos do RD StationSe o token parar de renovar
Token do RD CRMConfigurações de integração do CRMRaramente — o token é fixo e não expira
Senha de aplicativo do GmailConta Google → Segurança → Senhas de appSe o envio de e-mail começar a falhar
Conexão do banco PostgresPainel do Neon, dentro da integração na VercelSó se o banco for recriado
Segredo das rotas protegidasQualquer texto aleatório definido por vocêQuando alguém que o conhecia sai do time
  1. Gere o valor novo na plataforma de origem
    Sem apagar o antigo ainda, se a plataforma permitir manter os dois.
  2. Atualize a variável na Vercel
    Substitua o valor mantendo exatamente o mesmo nome de variável. Um nome errado é indistinguível de uma variável ausente.
  3. Publique de novo
    Esta etapa é obrigatória e a mais esquecida. Alterar o valor na tela da Vercel não atualiza o sistema que já está rodando. É preciso disparar uma nova publicação.
  4. Confirme com o diagnóstico
    Abra /api/debug e verifique se a integração voltou a passar.
  5. Só então revogue o valor antigo
    Na plataforma de origem.
Segredos usados em endereço de navegador

Alguns segredos são passados dentro da URL. Caracteres como +, @, !, *, ~ e : se transformam ao serem digitados no navegador — o sinal de mais, em particular, vira espaço. Gere esses segredos usando apenas letras e números.

5.9Publicar uma alteração de código

O sistema publica sozinho: toda alteração enviada ao repositório no GitHub dispara uma nova publicação na Vercel, que leva de um a três minutos.

  1. Altere o arquivo
    Pelo próprio site do GitHub, para mudanças pequenas, ou por um editor de código.
  2. Descreva a mudança ao salvar
    Uma frase que explique o que mudou e por quê. Quem investigar um problema daqui a um ano vai ler exatamente isso.
  3. Acompanhe a publicação
    No painel da Vercel. Se a publicação falhar, o site anterior continua no ar — o sistema não fica quebrado por causa de um erro de digitação.
  4. Teste
    Abra o painel, confira os seis números e rode /api/debug.
Como voltar atrás

No painel da Vercel, cada publicação anterior fica guardada e pode ser promovida de volta a produção com um clique. Isso resolve em segundos qualquer alteração que tenha dado errado. Saber disso é o que permite trabalhar sem medo.

5.10Dar acesso a uma pessoa nova

Para usar o painel não é preciso acesso nenhum: basta o link. A lista abaixo é para quem vai manter o sistema.

SistemaPermissão necessáriaQuem concede
VercelMembro do projeto funildokaDono da conta Vercel
GitHubColaborador do repositórioAdministrador da organização
Google CloudLeitura no projeto coleta-ga4Administrador do Google Workspace
Google AnalyticsLeitura nas duas propriedadesAdministrador do GA4
Search ConsoleLeitura nos dois domíniosProprietário da propriedade
Planilha de dados manuaisEdiçãoDono da planilha
RD Station Marketing e CRMAcesso administrativoGestão de CRM
Neon (Postgres)Acesso via integração na VercelDono da conta Vercel
A conta de serviço não é uma pessoa

O sistema acessa o Google através de uma conta de serviço — um usuário robô com endereço próprio. Ela precisa estar listada como usuário com permissão de leitura no GA4, no Search Console e na planilha. Se alguém “limpar a lista de usuários” e remover esse endereço estranho, várias integrações param ao mesmo tempo. O endereço está em 6.4.

5.11Adicionar uma plataforma social

Exige alteração de código em quatro lugares, na ordem abaixo. É a alteração mais comum e a mais segura de fazer.

  1. Cadastre a plataforma no banco
    Insira uma linha na tabela platforms do Postgres, com a chave no padrão rede_marca — por exemplo threads_doka. A terminação _immersi é o que faz o valor entrar no recorte da Immersi.
  2. Inclua a chave na lista fechada
    No arquivo lib/manual-impressions-db.js, na lista PLATFORM_KEYS. Chaves fora dessa lista são recusadas com erro — é uma proteção contra erro de digitação, não um obstáculo.
  3. Inclua o campo na tela
    No arquivo app/manual/page.js, na lista de plataformas, com nome, marca, ícone e cores.
  4. Publique e teste
    Lance um valor de teste, confira que ele soma nas Impressões e depois apague a semana de teste.

5.12Incluir um novo evento como MQL

Quando uma nova landing page ou formulário de alta intenção entra no ar, o identificador do evento precisa ser incluído na lista de MQLs.

  1. Descubra o identificador exato
    Abra /api/debug-rd-mkt e localize o nome do evento como a RD o devolve. Copie exatamente, incluindo erros de grafia existentes — a lista atual contém whastapp, com a letra trocada, porque é assim que está cadastrado na RD.
  2. Adicione à lista
    No arquivo lib/rd-mkt.js, na lista MQL_EVENT_IDS.
  3. Verifique a marca
    Se o nome do evento contiver “doka” ou “immersi”, a classificação por marca é automática. Se não contiver nenhum dos dois, o evento entra só no total geral.
  4. Se for de categoria C, inclua também no webhook
    Eventos sem landing page, formulário ou pop-up por trás só chegam por webhook — veja 5.7.
  5. Publique e confira
    O evento deve aparecer no detalhamento de Leads.

6Referência técnica

Consulta rápida. Não é para ler de ponta a ponta — é para achar o nome exato de um arquivo, de uma variável ou de uma tabela quando você já sabe o que procura.

6.1Mapa de arquivos

Telas que a pessoa vê

ArquivoO que faz
app/page.jsO painel principal inteiro: filtros, seis cartões, funil vertical, botões de ajuda, janelas de detalhamento, painel de MQL por Fonte, Perfil de Clientes, status das integrações e alternância de tema. É o maior arquivo do projeto.
app/manual/page.jsPágina de lançamento manual: mapa de calor de 52 semanas, três abas de lançamento e importação por CSV.
app/emails/page.jsCadastro e remoção de assinantes do resumo semanal, com botão de envio imediato.
app/layout.jsMoldura comum a todas as páginas: idioma, título da aba e carregamento das fontes.
app/globals.cssFonte única de verdade das cores. Define a paleta clara e a escura em variáveis; as duas páginas e o mapa de dados consomem daqui. Mexer numa cor aqui muda o sistema todo.

Tradutores — cada um conversa com uma plataforma

ArquivoO que faz
lib/search-console.jsConsulta o Search Console em três frentes paralelas: total de impressões, as 15 páginas mais vistas e a lista de dias com dado — esta última só para a regra “API sempre vence”.
lib/ga4.jsDuas consultas ao Analytics: origem/mídia de primeiro contato para o detalhamento, e mídia de sessão para dividir pago e orgânico. Tem também uma função de tendência mensal, hoje sem uso no painel.
lib/rd-mkt.jsConversões do RD Marketing. Guarda a lista de eventos que contam como MQL, a lógica de classificação por marca e todo o tratamento da janela de 45 dias.
lib/rd-crm.jsO arquivo mais denso em regra de negócio. Faz duas passagens no CRM — uma por data de criação, outra por data de fechamento — e devolve MQL, SQL, Vendas e Perfil de Clientes de uma vez. Contém os mapas de campos personalizados e de fontes de origem.
lib/webhook-store.jsGrava e lê os eventos de webhook na planilha. Cria a aba sozinho se ela não existir e trata o problema de datas descrito em E-09.
lib/manual-impressions-db.jsTodas as leituras e escritas de impressões manuais no Postgres, incluindo a validação de plataforma, a substituição de valores repetidos e a regra “API sempre vence”.
lib/db.jsConexão com o Postgres. Poucas linhas, mas é por onde tudo do banco passa.
lib/sheets.jsLeitura e escrita do histórico de auditoria na aba Histórico. Hoje serve como registro paralelo, não como fonte do painel.
lib/history-cache.jsTodo o sistema de cache: verificação de validade, gravação, remoção e o cálculo de cobertura das 52 semanas que alimenta o mapa de calor.
lib/notify-emails.jsLista, cadastra e remove assinantes na aba Emails_Notificacao.
lib/mailer.jsEnvio pelo Gmail, uma mensagem por destinatário.
lib/email-template.jsMonta o HTML do e-mail semanal no formato de funil vertical.

Configuração e páginas estáticas

ArquivoO que faz
vercel.jsonRegistra a tarefa agendada do e-mail semanal. Este arquivo só passou a existir quando o e-mail foi criado.
package.jsonLista as bibliotecas usadas e suas versões.
next.config.js, jsconfig.jsonConfiguração do framework. O segundo é o que faz o atalho @/ apontar para a raiz do projeto.
public/mapa-dados-funil.htmlPágina estática de referência dos campos de cada API, com atalhos para as rotas de diagnóstico.
public/dashboard_lps_oportunidade_mes.htmlPainel exploratório das landing pages da Oportunidade do Mês, de Doka e Immersi. Análise pontual, independente do funil.
README.mdApenas o nome e uma linha de descrição. Deve passar a apontar para esta documentação.

6.2Rotas da API

Rotas são endereços internos que o sistema chama sozinho. Só as marcadas como seguras devem ser abertas manualmente no navegador.

RotaUsoO que fazAbrir à mão?
/api/funnelLeituraO agregador principal. Aceita periodo, start, end, marca e canal.Sim, seguro
/api/crm-insightsLeituraPerfil de Clientes com rótulos amigáveis. Aceita start e end.Sim, seguro
/api/manual-dataLeitura e escritaConsulta, grava e apaga lançamentos manuais e cache. Usada pela página /manual.Só leitura
/api/manual-data/csvEscritaImportação em lote por CSV.Não
/api/manual-data/coverageLeituraCobertura das 52 semanas para o mapa de calor.Sim, seguro
/api/notify-emailsLeitura e escritaLista, cadastra e remove assinantes.Só leitura
/api/notify-emails/sendEscritaDispara o resumo imediatamente para toda a lista.Não
/api/cron/weekly-emailAutomáticaChamada pela Vercel toda segunda. Protegida por segredo — recusa quem chamar sem ele.Não
/api/webhooks/rd-mktRecebimentoRecebe os eventos da RD. Responde sucesso sempre, mesmo se não conseguir gravar.Não
/api/admin/migrate-historyEscritaMigração única do histórico da planilha para o Postgres. Protegida por segredo. Já foi executada.Não
/api/debug e as seis rotas debug-*LeituraDiagnóstico das integrações. Ver 6.10.Sim, seguro
Rotas legadas — não apagar sem verificar

Existem ainda /api/manual-impressions e /api/manual-impressions/revert, herdadas da versão anterior do lançamento manual. A tela não as chama. Já houve um defeito real causado por essa duplicidade: o botão de apagar semana chamava uma rota, enquanto a lógica de apagar de verdade morava na outra — e por muito tempo o botão respondeu “apagado” sem apagar nada. Isso está corrigido.

Lição a manter: a existência de uma rota não prova que ela é usada. Antes de confiar em qualquer rota, procure no código da tela onde ela é de fato chamada.

6.3Variáveis de ambiente

Configuradas na Vercel, em Configurações → Variáveis de Ambiente. Os valores não aparecem neste documento e não devem aparecer em nenhum outro.

NomePara que serveO que quebra sem ela
GOOGLE_SERVICE_ACCOUNT_JSONCredencial da conta de serviço do Google, em bloco únicoSearch Console, Analytics, planilha e webhook — tudo do Google de uma vez
GA4_PROPERTY_ID_DOKAIdentificador da propriedade Doka no AnalyticsVisitantes da Doka
GA4_PROPERTY_ID_IMMERSIIdentificador da propriedade ImmersiVisitantes da Immersi
SEARCH_CONSOLE_SITE_URLDomínio da Doka no Search ConsoleImpressões da Doka
SEARCH_CONSOLE_SITE_URL_IMMERSIDomínio da ImmersiImpressões da Immersi
RD_MKT_CLIENT_IDIdentificação do aplicativo no RD MarketingLeads vindos da API do RD
RD_MKT_CLIENT_SECRETSenha do aplicativoIdem
RD_MKT_REFRESH_TOKENChave que renova o acesso a cada consultaIdem
RD_CRM_TOKEN_V1Token fixo do CRMMQL, SQL, Vendas e Perfil de Clientes
MANUAL_DATA_SHEET_IDIdentificador da planilha de dados manuaisCache, webhook, e-mails e auditoria
fd_db_DATABASE_URLConexão com o PostgresImpressões manuais deixam de somar e a página /manual falha ao salvar
GMAIL_USERConta que envia o resumoE-mail semanal
GMAIL_APP_PASSWORDSenha de aplicativo do GmailE-mail semanal
CRON_SECRETSegredo das rotas protegidasA tarefa agendada é recusada
SITE_URLEndereço público, usado nos links do e-mailNada — assume o endereço padrão se ausente
Duas pegadinhas que já causaram horas de investigação

O prefixo do banco é fora do padrão. A variável do Postgres se chama fd_db_DATABASE_URL, não DATABASE_URL. O prefixo veio do nome do banco na integração com a Neon. Se o banco for recriado com outro nome, o prefixo muda junto.

Mudar o valor não basta. Alterar uma variável na tela da Vercel não afeta o sistema que já está no ar. É obrigatório publicar de novo depois.

Variáveis que já existiram e não devem voltar, porque pertencem a caminhos abandonados: as do Upstash, as de versão 2 do CRM e as de token e projeto da própria Vercel.

6.4Contas, IDs e propriedades

ItemValor
Conta de serviço do Googlefunil-doka-reader@coleta-ga4.iam.gserviceaccount.com
Projeto no Google Cloudcoleta-ga4
Conta do Analytics9820993
Propriedade GA4 — Doka355526070
Propriedade GA4 — Immersi355713569
Search Console — Dokasc-domain:dokabathworks.com.br
Search Console — Immersisc-domain:immersi.com.br
RD Marketing — endereço basehttps://api.rd.services
RD Marketing — renovação de tokenhttps://api.rd.services/auth/token
RD CRM — endereço basehttps://crm.rdstation.com/api/v1
Banco Postgresfunildoka-db, região São Paulo
Repositóriogithub.com/dokabathworks-commits/funildoka
Projeto no Asana1205915971096498
Endereço do CRM

O endereço correto da versão 1 do CRM é crm.rdstation.com/api/v1. Usar api.rd.services/crm/v1 devolve “não encontrado” em todos os caminhos — um erro fácil de cometer, já que o RD Marketing usa o segundo endereço.

6.5Banco de dados Postgres

Hospedado na Neon, conectado à Vercel por integração. Três tabelas no esquema público:

TabelaGuardaDetalhes
platformsA lista fechada de plataformas válidasDez linhas: as oito redes sociais mais duas entradas de Search Console usadas apenas para marcar cobertura
manual_impressionsCada valor de impressão lançado à mãoColunas: plataforma, início e fim do período, valor, quem lançou, observação e data de criação
api_coverageOs dias em que alguma API trouxe dado realAlimenta a regra “API sempre vence” de 4.5

Comportamentos que valem saber

  • Lançar de novo a mesma plataforma e a mesma semana substitui o valor. Não cria uma segunda linha.
  • Por isso o banco guarda sempre o valor atual, e o histórico de correções vive só na planilha de auditoria. Essa divisão foi uma escolha consciente.
  • Apagar uma semana remove todas as plataformas daquela semana de uma vez.
  • Valores negativos, plataformas fora da lista e datas invertidas são recusados com mensagem clara.
Por que não um arquivo local

O sistema roda em servidores temporários que são criados e destruídos a cada requisição. Um banco em arquivo local não sobreviveria — cada visita começaria do zero. Qualquer proposta futura de banco de dados precisa ser um serviço hospedado, nunca um arquivo no projeto.

6.6Planilha Google Sheets

Uma única planilha, sete abas. Todas são criadas automaticamente com o cabeçalho correto se não existirem.

AbaConteúdoEscrita por
HistóricoRegistro de auditoria dos lançamentos de impressõesPágina /manual, como cópia de segurança
Cache_RD_MKTResultados já obtidos do RD Marketing, por períodoAutomático, a cada consulta bem-sucedida
Cache_RD_CRMResultados já obtidos do RD CRM, por períodoAutomático
Manual_RD_MKTLeads e MQLs lançados à mão para períodos antigosPágina /manual
Manual_RD_CRMSQLs e vendas lançados à mão, por funilPágina /manual
Emails_NotificacaoAssinantes do resumo semanalPágina /emails
Webhook_RD_MKTEventos de categoria C e D, incluindo os 8.569 registros reconstruídos historicamenteReceptor de webhook e colagem manual
Regras para quem abrir a planilha
  • Não renomeie abas. Os nomes estão escritos dentro do código, acentos incluídos.
  • Não reordene nem insira colunas. A leitura é por posição, não por nome.
  • Não classifique nem filtre com filtro salvo. A ordem das linhas importa em algumas abas.
  • Não remova a conta de serviço da lista de compartilhamento.

6.7Listas fixas dentro do código

Quatro listas estão escritas diretamente no código, não vêm de nenhuma API. Cada uma tem um motivo:

Eventos que contam como MQL — 14 itens, em lib/rd-mkt.js

oportunidade-mes-doka, oportunidade-mes-doka2, whastapp-oportunidade-mes-doka, onde-comprar-doka-hoteis, onde-comprar-doka-construtoras, onde-comprar-doka, fale-conosco, formulario-onde-comprar-doka, onde-comprar-immersi, oportunidade-mes-immersi, whastapp-oportunidade-mes-immersi, oportunidade-falar-consultor-immersi, oportunidade-falar-consultor-metal-rainbow, oportunidade-falar-consultor-air-massage.

Sim, whastapp está com as letras trocadas. É assim que está cadastrado na RD, e o código precisa bater exatamente. Corrigir aqui sem corrigir lá quebraria a contagem.

Campos personalizados do CRM — 7 itens, em lib/rd-crm.js

A versão 1 da API do CRM devolve os campos personalizados como uma lista de códigos hexadecimais, sem nome legível. Por isso existe um mapa fixo de código para nome, confirmado em agosto de 2026 pela rota /api/debug-cf. Os campos mapeados são: área de atuação, produto de interesse, como conheceu a Doka, representante, marca de interesse e cidade — esta última com dois códigos diferentes, porque existem dois campos de cidade no CRM.

Esses códigos só mudam se o campo for apagado e recriado no CRM. Se acontecer, rode /api/debug-cf e atualize o mapa.

Fontes de origem — 18 itens, em lib/rd-crm.js

Mapa de código para nome das fontes de origem, usado pelo painel MQL por Fonte. O sistema tenta primeiro o nome que a API já devolve embutido; o mapa é plano B. Cobre busca orgânica em seis buscadores, busca paga em seis origens, display, social, tráfego direto e Casoca.

Plataformas sociais — 8 itens, em lib/manual-impressions-db.js

instagram_doka, instagram_immersi, facebook_doka, facebook_immersi, pinterest_doka, youtube_doka, tiktok_doka, linkedin_doka. Precisa estar em sintonia com a tabela platforms do banco e com a lista da tela de lançamento — ver 5.11.

6.8Tarefas agendadas

TarefaQuandoO que faz
Resumo semanal por e-mailSegunda-feira, 11h no horário universal — cerca de 8h em BrasíliaBusca os dados dos últimos 7 dias e envia o resumo para toda a lista de assinantes
Limites do plano gratuito da Vercel
  • No máximo duas tarefas agendadas por projeto, cada uma no máximo uma vez por dia. O e-mail ocupa uma vaga; sobra exatamente uma.
  • O horário tem tolerância de cerca de uma hora — o e-mail pode chegar entre 8h e 9h.
  • Já foi verificado no painel da Vercel que não há outras tarefas ativas. Qualquer rotina que alguém suponha estar rodando automaticamente, e que não seja essa, não está.

6.9Resposta de /api/funnel

Estrutura devolvida a cada carregamento. Útil para quem for construir algo em cima destes dados.

{
  periodo, startDate, endDate, marca, canal,
  atualizadoEm,                     // data e hora exatas da consulta
  funil: {
    impressoes: { total, doka, immersi, manualSocial,
                  bySocial,         // valor por rede social
                  byPageDoka, byPageImmersi,
                  error, immersiError },
    visitantes: { total, doka, immersi,
                  byChannel, byChannelImmersi, error, immersiError },
    leads:      { total, breakdown, doka, immersi,
                  breakdownDoka, breakdownImmersi,
                  webhookTotal,     // parcela vinda de webhook
                  error },
    mqls:       { total, byAudience, bySource, error, src },
    sqls:       { total, byAudience, error },
    vendas:     { total, byAudience, perdas, error },
    perfilCRM                        // cinco campos do Perfil de Clientes
  },
  conversoes: {
    impressoesParaVisitantes, visitantesParaLeads, leadsParaMqls,
    mqlsParaSqls, sqlsParaVendas
  }
}

Todo campo error vem como nulo quando está tudo certo, ou com a mensagem original da plataforma quando falha. Um total nulo significa “não sei”; zero significa zero de verdade.

6.10Rotas de diagnóstico

RotaMostra
/api/debugPainel geral: presença de cada variável e teste de todas as sete integrações, com resumo de aprovados
/api/debug-crmCinco negociações completas do CRM, com todos os campos como a API os devolve
/api/debug-cfTodos os campos personalizados do CRM com seus códigos — é daqui que sai o mapa fixo
/api/debug-ga4Todas as dimensões e métricas disponíveis nas duas propriedades do Analytics
/api/debug-scDimensões disponíveis e amostras de dado dos dois domínios no Search Console
/api/debug-rd-mktEventos, campos e segmentações disponíveis no RD Marketing
/api/debug-rd-webhooksWebhooks já registrados e prévia do registro do webhook de categoria C — sem enviar nada

Todas devolvem texto puro, sem formatação, e nenhuma altera dado algum.

7Erros possíveis e o que fazer

Cada erro conhecido tem uma ficha com sintoma, causa, procedimento e como confirmar que voltou ao normal. Comece pela tabela rápida — ela leva direto à ficha certa.

7.1Como agir diante de um erro

  1. Não altere código ainda
    A grande maioria das falhas é de credencial, permissão ou limite de plataforma — nenhuma delas se resolve mexendo no programa.
  2. Rode o diagnóstico
    Abra /api/debug. Em trinta segundos você sabe qual das sete integrações falhou e com que mensagem.
  3. Descubra se é só você
    Peça a outra pessoa para abrir o painel. Se funciona para ela, o problema é de rede, cache do navegador ou extensão instalada.
  4. Localize a ficha
    Use a tabela de 7.2 e siga o procedimento indicado.
  5. Confirme a volta ao normal
    Cada ficha diz exatamente como verificar. Sem essa confirmação, você não sabe se resolveu ou se o erro só sumiu por um momento.
  6. Registre
    Se foi um erro novo, acrescente uma ficha nova aqui. Documentação de erro envelhece rápido quando ninguém escreve o que aconteceu.
O sistema é feito para falhar em pedaços

Nenhuma integração derruba as outras. Se o CRM cair, Impressões, Visitantes e Leads continuam corretos na tela. Isso é proposital: um painel parcialmente certo é muito mais útil do que uma página de erro.

7.2Tabela rápida: sintoma → causa

O que você vêCausa mais provávelFicha
A página inteira não abreVercel fora do ar ou publicação quebradaE-01
Todos os números do Google em Credencial da conta de serviço inválida ou ausenteE-02
Só Impressões em Conta de serviço sem permissão no Search ConsoleE-03
Só Visitantes em Conta de serviço sem acesso à propriedade do AnalyticsE-04
MQL, SQL, Vendas e Perfil todos em Token do CRM inválido ou endereço erradoE-05
Leads em ou muito baixoRenovação de token do RD Marketing falhouE-06
Leads zerado em período antigoLimite de 45 dias, sem cache preenchidoE-07
Número congelado há diasCache preso na planilhaE-08
Leads de WhatsApp somem ao mudar o períodoDatas na planilha de webhook lidas de forma erradaE-09
Página /manual não salvaBanco Postgres inacessívelE-10
MQL por Fonte todo “Não identificada”Campo de origem mudou de formato no CRME-11
Perfil de Clientes vazio ou com códigosCampos personalizados recriados no CRME-12
E-mail de segunda não chegouSenha de aplicativo, lista vazia ou tarefa agendadaE-13
Eventos de webhook pararam de chegarRD suspendeu o webhookE-14
Painel muito lentoPaginação do CRM em período longoE-15
Alterou a variável e nada mudouFaltou publicar de novoE-16

7.3Fichas de erro detalhadas

E-01 · O site inteiro não abre

Crítico
Sintoma
Erro do navegador, página em branco ou mensagem da Vercel em qualquer endereço do sistema.
Causa
Instabilidade da Vercel, ou uma publicação que quebrou o programa e foi promovida a produção.
O que fazer
Abra o painel da Vercel e veja o estado da última publicação. Se estiver com erro, promova a publicação anterior de volta a produção — leva segundos e resolve na hora. Se todas as publicações estão certas, verifique a página de estado de serviço da Vercel: pode ser instabilidade deles, e nesse caso é esperar.
Confirmação
O painel abre e os seis números aparecem.
Prevenção
Depois de qualquer publicação, abra o painel e confira. Não publique e vá embora.

E-02 · Tudo do Google parou ao mesmo tempo

Crítico
Sintoma
Impressões e Visitantes em , o lançamento manual não grava na planilha e os eventos de webhook não são lidos.
Causa
A credencial da conta de serviço foi apagada, expirou, teve a chave revogada, ou o projeto no Google Cloud foi desativado. Um único ponto atinge tudo do Google.
O que fazer
Abra /api/debug e verifique se a credencial aparece como presente. Se estiver faltando, ela foi apagada da Vercel — recadastre. Se estiver presente mas todas as integrações do Google falham, a chave foi revogada: gere uma nova no Google Cloud, no projeto coleta-ga4, atualize a variável e publique de novo.
Confirmação
No diagnóstico, as quatro verificações do Google voltam a passar.
Prevenção
Ninguém deve apagar chaves de conta de serviço sem verificar antes o que depende delas.

E-03 · Só as Impressões pararam

Moderado
Sintoma
Impressões em , mas Visitantes normal. O diagnóstico mostra falha só no Search Console.
Causa
A conta de serviço perdeu a permissão de leitura no domínio, ou o domínio foi reconfigurado no Search Console — o que gera uma propriedade nova, sem as permissões antigas.
O que fazer
Abra o Search Console, vá em usuários e permissões do domínio afetado e confirme que a conta de serviço está listada com permissão de leitura. Se não estiver, adicione. Confirme também que o valor da variável do domínio confere exatamente com o nome da propriedade, prefixo incluído.
Confirmação
/api/debug-sc devolve dados dos dois domínios.

E-04 · Só os Visitantes pararam

Moderado
Sintoma
Visitantes em para uma ou para as duas marcas.
Causa
Conta de serviço removida da propriedade do Analytics, ou identificador da propriedade errado na variável.
O que fazer
No Analytics, em administração → gerenciamento de acesso da propriedade, confirme que a conta de serviço aparece com permissão de leitura. Confira o número da propriedade contra a lista de 6.4 — é fácil trocar o identificador da propriedade pelo da conta, ou o da Doka pelo da Immersi.
Confirmação
/api/debug-ga4 devolve dados das duas propriedades.

E-05 · Metade do funil parou: MQL, SQL, Vendas e Perfil

Crítico
Sintoma
As três últimas etapas em e o painel de Perfil de Clientes vazio, tudo ao mesmo tempo.
Causa
Como as quatro informações vêm de uma única chamada ao CRM, uma falha lá derruba as quatro juntas. Costuma ser token inválido, ou um erro de endereço no código.
O que fazer
Abra /api/debug-crm. Se aparecer erro de autorização, o token foi revogado ou trocado no RD — gere um novo na configuração de integração do CRM, atualize a variável e publique. Se aparecer “não encontrado” em todos os caminhos, o endereço base está errado: precisa ser crm.rdstation.com/api/v1, e não o endereço do RD Marketing.
Confirmação
/api/debug-crm lista cinco negociações completas.
Observação
O token do CRM é fixo e não expira sozinho. Se ele parou de funcionar, alguém o revogou.

E-06 · Leads em branco ou muito abaixo do normal

Moderado
Sintoma
A etapa Leads mostra , ou um valor claramente pequeno demais.
Causa
A renovação do token do RD Marketing falhou. Isso acontece se a chave de renovação for revogada, se o aplicativo for removido na RD, ou se alguma das três variáveis estiver com valor truncado.
O que fazer
Abra /api/debug-rd-mkt: se a renovação falhar, a mensagem da própria RD aparece. Gere novas credenciais na área de aplicativos do RD Station, atualize as três variáveis e publique. Antes disso, confirme que o valor colado não perdeu caracteres no fim.
Confirmação
O diagnóstico devolve um total de conversões maior que zero para os últimos 30 dias.
Cuidado
Se o período consultado tiver mais de 45 dias, um valor baixo pode não ser erro nenhum — veja E-07 antes de trocar credencial.

E-07 · Leads zerado em período antigo

Comportamento esperado
Sintoma
Ao escolher 90 ou 180 dias, ou um intervalo de meses atrás, Leads aparece muito baixo ou zerado.
Causa
Não é defeito. O plano da RD só responde sobre datas até 45 dias atrás. O sistema detecta isso, ajusta ou nem chega a consultar, e passa a depender de cache, webhook e lançamento manual.
O que fazer
Confira se o período tem lançamento manual de RD registrado — no mapa de calor da página /manual. Se não tiver, e o dado ainda estiver disponível na RD, lance seguindo 5.4. Se já passou do alcance da própria RD, o dado é irrecuperável para aquele período.
Confirmação
Depois do lançamento, o número aparece ao consultar o mesmo período.
Prevenção
Lançar semanalmente. Cada semana não lançada vira um buraco permanente.

E-08 · Número congelado, sem mudar há dias

Moderado
Sintoma
O valor de Leads, SQL ou Vendas continua idêntico dia após dia, mesmo com atividade real acontecendo.
Causa
Cache preso. Um resultado gravado na planilha está sendo devolvido em vez de uma consulta nova. Períodos com mais de 45 dias têm cache permanente por definição; períodos recentes deveriam expirar em 24 horas.
O que fazer
Abra a planilha e vá na aba Cache_RD_MKT ou Cache_RD_CRM. Localize a linha cuja data inicial e final correspondem ao período consultado e apague a linha inteira. Recarregue o painel: o sistema vai consultar de novo e regravar.
Confirmação
O número muda e uma linha nova aparece na aba, com data de gravação atual.
Cuidado
Apagar a linha errada faz o sistema reconsultar aquele período — o que é inofensivo se o período estiver dentro dos 45 dias, mas apaga um dado insubstituível se for um período antigo lançado à mão. Confira a data antes de apagar.

E-09 · Leads de WhatsApp aparecem e somem conforme o período

Moderado
Sintoma
Os eventos de categoria C entram no total em alguns períodos e desaparecem em outros, sem lógica aparente.
Causa
O Google Sheets converte automaticamente texto que se parece com data no seu próprio formato interno. Quando isso acontece, a leitura devolve um número em vez do texto original, e a data pode ser interpretada errado.
O que fazer
O sistema já trata os dois formatos: pede o valor bruto da célula e converte número de série de data quando necessário. Se mesmo assim houver divergência, abra a aba Webhook_RD_MKT e confira a coluna de data do evento — células alinhadas à direita foram convertidas em data pelo Sheets; alinhadas à esquerda continuam como texto. Ambos os casos funcionam, mas uma célula vazia faz o evento ser contado em qualquer período, por segurança.
Confirmação
Compare o total de eventos de um mês fechado em duas consultas seguidas: deve ser idêntico.
Cuidado ao colar dados
Nunca reformate a coluna de datas dessa aba. Não “arrume” o formato — o sistema lida com o que está lá.

E-10 · A página de lançamento manual não salva

Crítico
Sintoma
Mensagem de erro ao salvar, ou o valor não aparece no painel depois de salvo.
Causa
Banco Postgres inacessível. Pode ser a variável de conexão ausente ou com nome errado, o banco pausado por inatividade no plano gratuito da Neon, ou o banco recriado com outro nome — o que muda o prefixo da variável.
O que fazer
Confirme na Vercel que existe a variável fd_db_DATABASE_URL, com esse nome exato. Abra o painel da Neon e verifique se o banco está ativo. Se o banco foi recriado, confira o novo nome da variável gerada pela integração e ajuste o código que a lê.
Confirmação
Lance um valor de teste, veja-o somar nas Impressões e apague a semana de teste.
Observação
Se o banco cair, o painel continua funcionando: só as impressões de redes sociais deixam de somar. As demais etapas não são afetadas.

E-11 · MQL por Fonte mostra tudo como “Não identificada”

Leve
Sintoma
Os cinco cartões de nota mostram uma única fonte, chamada “Não identificada”.
Causa
O campo de origem mudou de formato na resposta da API do CRM, ou existem fontes novas cadastradas que não estão no mapa fixo.
O que fazer
Abra /api/debug-crm e procure, numa negociação, como o campo de fonte de origem aparece. O sistema tenta três formatos: objeto com nome embutido, código solto e código em campo separado. Se o formato for um quarto, o código precisa ser ajustado. Se for só uma fonte nova, basta acrescentá-la ao mapa fixo em lib/rd-crm.js.
Confirmação
Os cartões voltam a listar nomes de fonte reconhecíveis.
Impacto
Apenas visual, nesse painel. Nenhum total do funil é afetado.

E-12 · Perfil de Clientes vazio ou com códigos no lugar dos nomes

Leve
Sintoma
Um ou mais dos cinco recortes aparece vazio, ou traz códigos hexadecimais.
Causa
O campo personalizado correspondente foi apagado e recriado no CRM — o que gera um código novo, ausente do mapa fixo do sistema.
O que fazer
Abra /api/debug-cf, que lista todos os campos personalizados com seus códigos atuais. Compare com o mapa em lib/rd-crm.js e atualize os códigos que mudaram. Publique.
Confirmação
Os cinco recortes voltam a mostrar valores legíveis.
Prevenção
Ao mexer em campos personalizados no CRM, prefira renomear a apagar e recriar. Renomear preserva o código.

E-13 · O resumo de segunda-feira não chegou

Moderado
Sintoma
Ninguém recebeu o e-mail, ou só algumas pessoas receberam.
Causa
Quatro possibilidades: lista de assinantes vazia, senha de aplicativo do Gmail revogada, segredo da tarefa agendada trocado sem atualizar os dois lados, ou o horário ainda não passou — há uma tolerância de cerca de uma hora.
O que fazer
Abra /emails e use o botão de envio imediato. Se ele funcionar, o problema é da tarefa agendada — confira no painel da Vercel se a tarefa está registrada e se o segredo confere. Se o envio imediato falhar, o problema é o Gmail: gere uma nova senha de aplicativo, atualize a variável e publique. Se apenas algumas pessoas não receberam, o resultado do envio informa quais endereços falharam — normalmente endereço digitado errado ou caixa cheia.
Confirmação
O envio imediato reporta o número de enviados igual ao de assinantes.
Nota
O painel não é afetado por nada disso.

E-14 · Os eventos de webhook pararam de chegar

Crítico se não notado
Sintoma
A aba Webhook_RD_MKT parou de receber linhas novas, e Leads caiu de patamar sem explicação.
Causa
A RD suspende automaticamente um webhook que falha repetidamente. Também pode ter sido removido manualmente na RD, ou o endereço do sistema pode ter mudado.
O que fazer
Abra /api/debug-rd-webhooks e veja se o webhook ainda consta na lista. Se sumiu, registre de novo seguindo 5.7. Se consta mas não entrega, confirme que o endereço responde com sucesso.
Confirmação
Linhas novas aparecem na aba nas horas seguintes.
Por que é perigoso
Esse é o erro mais silencioso do sistema. Não aparece na barra de status, não gera na tela: os números simplesmente ficam menores. Só se percebe comparando com o esperado. Ver 7.4.

E-15 · O painel demora muito para carregar

Leve
Sintoma
Vários segundos de espera, especialmente em períodos de 90 ou 180 dias.
Causa
A consulta ao CRM percorre as negociações de 200 em 200 até acabar, e faz isso duas vezes — uma por data de criação, outra por data de fechamento. Em períodos longos são muitas voltas.
O que fazer
Normalmente é só esperar. Se ficar inviável, use períodos mais curtos. Uma otimização futura possível é guardar em cache também o resultado do CRM para períodos fechados.
Não faça
Não adicione consultas paralelas ao CRM para “acelerar”. A arquitetura foi deliberadamente construída para fazer uma chamada ao CRM por carregamento; multiplicar chamadas tende a esbarrar em limite de uso da plataforma.

E-16 · Mudei a configuração e nada aconteceu

Moderado
Sintoma
Você corrigiu uma variável de ambiente na Vercel e o erro continua exatamente igual.
Causa
Alterar o valor de uma variável não atualiza o sistema que já está no ar. As funções em execução continuam com os valores antigos.
O que fazer
Dispare uma nova publicação. Pela Vercel, basta reexecutar a última publicação; pelo GitHub, qualquer alteração salva também serve.
Confirmação
O diagnóstico passa a refletir o valor novo.
Frequência
Esta é a causa mais comum de “tentei tudo e não resolveu”. Confira antes de qualquer investigação mais profunda.

7.4Erros silenciosos

Os erros mais perigosos não aparecem na tela. Eles não geram , não acendem luz vermelha: apenas produzem números menores do que a realidade. Quem apresenta esses números não tem como saber que estão errados.

Erro silenciosoEfeitoComo detectar
Webhook suspenso pela RDLeads perde toda a parcela de WhatsApp e institucionalConferir mensalmente se a aba Webhook_RD_MKT segue recebendo linhas novas
Semana de redes sociais não lançadaImpressões subestimadas para sempre naquele períodoMapa de calor em /manual: blocos claros são semanas vazias
Consulta ao Search Console de páginas falhando isoladaTotal certo, mas detalhamento por página vazioAbrir o detalhamento de Impressões e ver se lista páginas
Marcação de cobertura de API falhandoNenhum efeito hoje; no futuro, risco de contagem duplaSó relevante quando alguma rede social virar automática
Evento novo de alta intenção fora da lista de MQLMQL subestimadoRevisar a lista sempre que uma landing page nova entrar no ar
Cópia de segurança na planilha falhandoDado salvo no banco, mas sem registro de auditoriaComparar a aba Histórico com os lançamentos recentes
A regra que protege contra tudo isso

Uma vez por mês, alguém precisa olhar o painel e perguntar: “esse número faz sentido?”. Comparar com o mês anterior, com o RD Station, com a percepção do time comercial. Nenhum sistema automático substitui essa conferência — e é ela que revela erro silencioso.

8Manutenção e continuidade

A seção escrita para o dia em que outra pessoa assumir o sistema. Rotinas, riscos com data marcada, acessos, checklist de transferência e — o mais valioso — as decisões que já foram tomadas e não devem ser refeitas do zero.

8.1Rotina de manutenção

FrequênciaTarefaLevaSe ninguém fizer
Semanal, na quintaLançar impressões de redes sociais da semana fechada10 minBuraco permanente nas Impressões
Conferir se o resumo de segunda chegou1 minFalha de envio passa meses sem ser notada
MensalRodar /api/debug e conferir os sete testes2 minIntegração quebrada só aparece quando alguém precisa do número
Verificar se a aba de webhook segue recebendo linhas2 minLeads subestimado silenciosamente
Olhar o mapa de calor e preencher semanas em branco5 minHistórico irrecuperável
Comparar os seis números com o mês anterior e perguntar se fazem sentido10 minErro silencioso não detectado
TrimestralRevisar a lista de eventos que contam como MQL contra as landing pages ativas15 minMQL subestimado
Conferir a lista de assinantes do resumo — quem saiu da empresa?5 minDado interno indo para fora
Reler esta documentação e corrigir o que mudou30 minDocumentação vira ficção
AnualTrocar a chave da conta de serviço do Google20 minCredencial antiga circulando
Revisar quem tem acesso a Vercel, GitHub, planilha e Neon20 minEx-funcionário com acesso ativo
Atualizar as bibliotecas do projeto1 hFalha de segurança conhecida sem correção

8.2Calendário de riscos

Coisas que quebram sozinhas com o tempo, sem ninguém mexer em nada:

RiscoQuando costuma acontecerAviso prévioPreparação
Chave da conta de serviço revogada por política do Google WorkspaceQuando a organização impõe expiração de chavesNormalmente nenhumSaber gerar uma nova — 5.8
Banco Neon pausado por inatividadeSe ficar semanas sem uso no plano gratuitoNenhumReativar pelo painel da Neon
Webhook suspenso pela RDDepois de falhas repetidas de entregaE-mail da RD, se alguém estiver monitorandoVerificação mensal — E-14
Aplicativo do RD Marketing removido ou expiradoEm reorganizações da conta RDNenhumSaber recriar as credenciais
Senha de aplicativo do Gmail invalidadaAo trocar a senha da conta ou mudar política de segurançaNenhumGerar nova senha de app
Campos personalizados recriados no CRMEm qualquer faxina do CRMNenhumRodar /api/debug-cf e atualizar o mapa
Domínio reconfigurado no Search ConsoleEm migrações de siteDepende de quem migrou avisarRecolocar a conta de serviço nas permissões
Limite do plano da Vercel excedidoSe o uso crescer muitoE-mail da VercelAvaliar plano pago
O padrão a notar

Quase nenhum desses riscos vem com aviso prévio. É exatamente por isso que a verificação mensal de dois minutos com /api/debug vale mais do que qualquer sistema de alerta que ninguém configurou.

8.3Acessos necessários

Para o sistema continuar existindo, pelo menos duas pessoas precisam ter todos os acessos abaixo. Uma só é um ponto único de falha humano.

AcessoSem ele, é impossívelRecuperável se perdido?
Conta Vercel com acesso ao projetoPublicar, ver variáveis, reverter uma publicação, ver a tarefa agendadaSim, pelo dono da conta
GitHub, repositório da organizaçãoAlterar qualquer linha de códigoSim, pelo administrador da organização
Google Cloud, projeto coleta-ga4Gerar nova chave da conta de serviçoSim, pelo administrador do Workspace
Administração do GA4 e do Search ConsoleRecolocar permissões da conta de serviçoSim, pelo proprietário
Planilha de dados manuais, com ediçãoCorrigir cache, revisar webhook, ver auditoriaSim, pelo dono da planilha
RD Station Marketing, área de aplicativosRecriar credenciais e registrar webhookSim, pela gestão de CRM
RD Station CRM, configuraçõesGerar novo tokenSim, pela gestão de CRM
Neon, via VercelReativar o banco, consultar as tabelasSim, pelo dono da conta Vercel
Conta Gmail que envia o resumoGerar nova senha de aplicativoSim, pelo administrador do Workspace
Boa notícia

Todo acesso desta lista é recuperável por um administrador da empresa. Nada no sistema depende de uma conta pessoal insubstituível. O pior cenário custa algumas horas de reconfiguração, não a perda do sistema.

8.4Checklist de transferência

A transferência está completa quando a pessoa que assume consegue operar, corrigir e alterar o sistema sem precisar falar com quem saiu. Esse é o critério — não “eu expliquei tudo”.

Antes da saída

  • Conceder à pessoa que assume os nove acessos de 8.3 e confirmar que cada um funciona, entrando de fato
  • Acompanhá-la fazendo um lançamento manual completo sozinha, do começo ao fim
  • Acompanhá-la rodando /api/debug e interpretando o resultado
  • Acompanhá-la publicando uma alteração pequena e revertendo em seguida
  • Percorrer juntos as fichas de erro da seção 7, especialmente E-08, E-14 e E-16
  • Ler juntos a lista de decisões já tomadas em 8.6 e explicar o motivo de cada uma
  • Repassar as pendências de 8.5 com o estado atual de cada uma
  • Confirmar que ela sabe onde as credenciais ficam — e que elas não estão neste documento
  • Apresentá-la aos contatos: gestão de CRM, quem administra o Workspace e o suporte da RD
  • Atualizar esta documentação com o que mudou durante a passagem

Depois da saída

  • Remover os acessos de quem saiu em todas as nove plataformas
  • Trocar o segredo das rotas protegidas
  • Se a conta de envio de e-mail era pessoal, migrar para uma conta institucional
  • Rodar o diagnóstico e confirmar que nada quebrou com a remoção de acessos
  • Registrar aqui a data da transferência e quem passou a ser responsável
Teste honesto

Uma semana antes da saída, peça à pessoa que assume para executar sozinha o lançamento semanal e a verificação mensal, sem ajuda e sem perguntas. O que ela travar é exatamente o que falta documentar ou ensinar. Essa é a única forma confiável de descobrir os buracos antes que eles custem caro.

8.5Pendências e próximos passos

Estado em 10 de setembro de 2026. O funil em si está concluído e em uso — o que segue são frentes abertas.

PendênciaSituaçãoO que faltaPrioridade
Registrar o webhook da RDReceptor pronto e testado; webhook não registradoUma ação manual — 5.7Alta: enquanto isso, os leads de categoria C só existem no histórico reconstruído
Três identificadores de evento não verificadosoportunidade-falar-consultor-immersi, -metal-rainbow e -air-massageConfirmar se aparecem no relatório de conversões ou se são categoria CMédia
“Participantes Vendeu, Ganhou 2026”11 ocorrências encontradas, com padrão de nome diferente das demaisConfirmar se é a mesma coisa que vendeu-ganhou-2026 antes de incluirBaixa
Propriedades de plataforma do Search ConsoleO Google lançou rastreio de Instagram, TikTok, YouTube e X por volta de julho de 2026Dar acesso à conta de serviço em cada nova propriedade e testar se a API já as devolve. Se funcionar, parte do lançamento manual deixa de ser necessáriaMédia: é a maior economia de trabalho manual à vista
Página de jornada de oportunidadesDesenhada e codificada, nunca validada em produçãoValidar e registrar a tarefa agendada diária — há exatamente uma vaga livre no planoMédia
Rotas legadas de lançamento manualDuas rotas que a tela não usa maisConfirmar que nada as chama e removerBaixa, mas evita repetir o defeito descrito em 6.2
Arquivo de apresentação do repositórioTem duas linhasApontar para esta documentaçãoBaixa
Cache do CRM para períodos fechadosIdeia, não implementadaReduziria a lentidão descrita em E-15Baixa

8.6Decisões já tomadas

Cada linha abaixo custou tempo de investigação, testes com API ao vivo ou conversa com suporte. Refazer qualquer uma delas é desperdício. Se você pensou em mudar algo daqui, leia o motivo primeiro.

Arquitetura

DecisãoMotivo
Usar a versão 1 da API do CRM, com token fixo, e não a versão 2A versão 2 usa tokens que se renovam e trocam a cada uso. Nos servidores temporários da Vercel, várias execuções simultâneas disputam a mesma renovação e invalidam o token uma da outra. A versão 1 não tem esse problema.
Uma única chamada ao CRM por carregamentoEla devolve MQL, SQL, Vendas e Perfil de uma vez. SQL é derivado internamente, sem consulta extra. Multiplicar chamadas aumenta a lentidão e o risco de esbarrar em limite de uso.
Banco hospedado, nunca arquivo localO servidor é destruído após cada requisição. Um arquivo de banco no projeto não sobreviveria a uma única visita seguinte.
Postgres como fonte de verdade das impressões; planilha como auditoriaO banco guarda o valor atual, a planilha guarda a história de quem mudou o quê. Cada um faz bem uma coisa.
Google Sheets como cacheJá estava disponível, é auditável a olho nu e não custa nada. Contorna o limite de 45 dias da RD sem infraestrutura adicional.
Redis descartadoFoi testado e removido. As gravações exigiam formato específico e falhavam silenciosamente quando o token continha certos caracteres.
O receptor de webhook sempre responde sucessoA RD suspende webhooks que falham. Perder um registro é menos grave do que perder o webhook inteiro.

Contagem e dados

DecisãoMotivo
Vendas por data de fechamento, numa consulta separadaUma venda de agosto pode vir de uma negociação de março. Antes disso, essas vendas simplesmente nunca apareciam.
SQL conta nota 4 ou 5, aberta ou fechadaVerificado: já era o comportamento correto. Nenhuma mudança foi necessária.
Origem de primeiro contato no detalhamento de VisitantesMais preciso que o agrupamento padrão de canal. A divisão entre pago e orgânico continua usando a mídia de sessão, sem alteração.
Mapa fixo de campos personalizados do CRMA API devolve códigos hexadecimais sem nome legível. Não há como resolver isso por consulta.
Painel de MQL por Fonte usando o campo nativo de origemSubstituiu um painel anterior de público. Usa o campo próprio do CRM, não um campo personalizado, com mapa de códigos como plano B.
Ler a planilha em valor bruto, não formatadoO Sheets converte texto parecido com data no seu formato interno, e a leitura formatada devolve algo ambíguo. O valor bruto é interpretável com segurança.
Lançar de novo substitui, não empilhaPermite corrigir erro de digitação sem procedimento especial. A história das correções fica na planilha.
Regra “API sempre vence” descarta o lançamento inteiroRateio proporcional inventaria dados. Descartar e sinalizar é honesto.

Limites confirmados nas plataformas — não insista

LimiteComo foi confirmado
O relatório de conversões da RD só aceita landing page, formulário e pop-upDocumentação oficial da RD. Cliques de WhatsApp nunca aparecem ali, com qualquer combinação de parâmetros.
O limite de 45 dias conta a partir de hoje, não da duração do períodoTestado ao vivo: um período de poucos dias, iniciado meses atrás, é recusado igual.
Não há filtro por etiqueta na listagem de contatos da RDSó e-mail, telefone, cargo e nome. A única leitura em massa por etiqueta é via segmentação.
A exportação da base de leads não traz data por eventoConfirmado com o suporte da RD. A coluna de eventos traz só nomes, sem data, e corta em 100 eventos por lead.
A exportação a partir de uma segmentação traz uma linha por conversão, com dataFoi isso que permitiu reconstruir 8.569 eventos históricos. É um arquivo fundamentalmente diferente do anterior.
O plano gratuito da Vercel permite duas tarefas agendadas, uma vez por dia cadaVerificado no painel. Uma vaga já está ocupada pelo e-mail semanal.

Interface

DecisãoMotivo
Uma só fonte de cores para todo o sistemaTema claro e escuro definidos em um arquivo, consumidos pelas duas páginas e pelo mapa de dados. Muda num lugar, muda em todos.
Lato em toda a interface; serifa apenas no logotipoÚnica exceção deliberada, por identidade de marca.
Cor de destaque da Immersi em terracotaO azul anterior conflitava com a paleta institucional.
Título das janelas de ajuda em caixa alta por estilo, não por texto digitadoO corpo do texto permanece em caixa normal. A exceção é o alerta dentro do texto de Vendas Digitais, que é caixa alta de propósito.
Janelas sobrepostas redefinem explicitamente a transformação de textoPropriedades de estilo são herdadas pela estrutura do documento, mesmo quando a janela aparece em tela cheia. Um botão de ajuda dentro de um rótulo em caixa alta contaminava a janela inteira.

8.7Manter esta documentação viva

Documentação desatualizada é pior que documentação nenhuma: ela é confiável na aparência e errada no conteúdo. Três regras bastam para evitar isso.

Alterou o sistema, alterou o documento

Na mesma tarefa, não “depois”. Um arquivo novo entra em 6.1; uma variável nova, em 6.3.

Erro novo vira ficha

Assim que for resolvido, com o sintoma real que apareceu na tela. É o que o próximo vai procurar.

Decisão vira linha em 8.6

Sobretudo as negativas: o que foi testado e descartado, e por quê. Isso é o que impede alguém de refazer o mesmo caminho.

Onde este arquivo deve ficar

Publique-o dentro do próprio sistema, na pasta de arquivos públicos, para que fique acessível em funildoka.vercel.app/documentacao.html. Assim ele viaja junto com o código: quem clonar o repositório leva a documentação, e quem abrir o painel encontra o link. Uma cópia solta numa pasta compartilhada se perde na primeira reorganização.

Vale também acrescentar um link para ele no rodapé do painel e no arquivo de apresentação do repositório.

Como este documento está organizado

A estrutura segue quatro tipos de conteúdo, separados de propósito: aprendizado (seção 2, para quem está começando), tarefa (seção 5, para quem precisa fazer algo agora), consulta (seções 6 e 7, para quem já sabe o que procura) e compreensão (seções 3, 4 e 8, para quem quer entender o porquê). Ao acrescentar conteúdo, coloque cada coisa no tipo certo — misturar explicação dentro de um passo a passo é o erro mais comum e o que mais atrapalha quem está com pressa.

9Glossário

Todo termo técnico usado neste documento, em português simples. Se você travou em alguma palavra em qualquer seção, ela está aqui.

TermoO que significa
APIA porta de entrada que uma plataforma abre para outros programas conversarem com ela. É por API que o sistema pergunta ao Google quantas impressões houve, sem precisar de ninguém clicando em telas.
CacheCópia guardada de uma resposta já obtida, para não precisar perguntar de novo. Economiza tempo, mas pode ficar desatualizada — ver 4.4.
Conta de serviçoUm usuário robô do Google, com endereço de e-mail próprio, que o sistema usa para acessar Analytics, Search Console e a planilha. Precisa aparecer nas listas de permissão como se fosse uma pessoa.
CPCCusto por clique. No Analytics, é a marcação que identifica visitas vindas de anúncio pago. É o que define o filtro “Pago” do painel.
CRMSistema onde o time comercial registra e acompanha as negociações. Aqui é o RD Station CRM.
Deal / negociaçãoUm registro de oportunidade dentro do CRM, com nota, origem, responsável e status.
Endpoint / rotaUm endereço específico dentro do sistema que devolve um dado ou executa uma ação. /api/funnel é uma rota.
Funil (no CRM)A separação das negociações por tipo de cliente: Consumidor Final, Arquiteto, E-commerce, Immersi, Construtora e Hotéis. Não confundir com o funil de seis etapas do painel.
GA4Google Analytics 4, a versão atual do Analytics. Fonte da etapa Visitantes.
ImpressãoUma exibição do conteúdo para alguém. Aparecer não é clicar.
JSONFormato de texto que programas usam para trocar informação estruturada. As rotas de diagnóstico devolvem JSON — é o texto com chaves e aspas que parece bagunçado, mas é organizado.
Landing pagePágina feita para uma campanha específica, normalmente com um formulário. No RD Station é um tipo de material que gera conversões.
LeadPessoa que deixou seus dados em algum formulário. Interesse, ainda não intenção de compra.
MQLMarketing Qualified Lead — lead qualificado pelo marketing. Na Doka, as Oportunidades. Ver 4.1.
NeonA empresa que hospeda o banco de dados Postgres do sistema.
Next.jsA tecnologia com que o sistema foi construído. Define a organização das pastas: cada pasta dentro de app vira um endereço no site.
PostgresTipo de banco de dados. Guarda as impressões de redes sociais lançadas à mão.
Pop-upJanela que aparece sobre a página. No RD Station, um dos três tipos de material que geram conversões.
Publicar / deployColocar uma versão nova do sistema no ar. Aqui é automático: alterou o código no GitHub, a Vercel publica.
Rating / notaClassificação de 1 a 5 estrelas que o time comercial dá a uma negociação no CRM. Nota 4 ou 5 define o SQL.
RD StationA plataforma de marketing e vendas usada pela empresa. São dois produtos distintos, com APIs diferentes: Marketing e CRM.
RepositórioO lugar onde o código-fonte fica guardado, com todo o histórico de alterações. Aqui, no GitHub.
Search ConsoleFerramenta do Google que mostra como o site aparece nos resultados de busca. Fonte da etapa Impressões.
SegmentaçãoNo RD Station, um grupo de contatos definido por critérios. É a partir de uma segmentação que se consegue exportar conversões com data — ver 8.6.
ServerlessModelo em que o programa roda em servidores criados na hora e destruídos logo depois. Barato e escalável, mas nada pode ser guardado em arquivo local.
SQL (a etapa)Sales Qualified Lead — lead qualificado pelo time de vendas. Nota 4 ou 5.
SQL (a linguagem)Coincidência infeliz de sigla: é também o nome da linguagem usada para consultar bancos de dados. Neste documento, “SQL” sozinho sempre se refere à etapa do funil.
Tag / etiquetaMarcação livre aplicada a contatos no RD Station. É como os leads de eventos e feiras são identificados — a categoria D de 3.4.
TokenUma senha que programas usam entre si. Alguns são fixos, outros precisam ser renovados a cada uso.
UpsertGravar substituindo, se já existir um registro igual. É como o lançamento manual funciona: lançar de novo a mesma semana troca o valor em vez de somar.
Variável de ambienteUma configuração guardada fora do código, na Vercel. É onde ficam todas as senhas e identificadores. Ver 6.3.
VercelO serviço que hospeda o site e executa a tarefa agendada do e-mail semanal.
WebhookO inverso de uma consulta: em vez de o sistema perguntar, a plataforma avisa quando algo acontece. É como os cliques de WhatsApp chegam.