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.
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.
| # | Etapa | Em palavras simples | De onde vem |
|---|---|---|---|
| 01 | Impressões | Quantas 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 |
| 02 | Visitantes | Pessoas diferentes que entraram no site no período. | Google Analytics 4 |
| 03 | Leads | Quem preencheu algum formulário. Demonstrou interesse, mas não necessariamente intenção de comprar. | RD Station Marketing + webhook |
| 04 | MQL | Oportunidades: quem “levantou a mão” com intenção clara — Onde Comprar, Oportunidade do Mês, WhatsApp. | RD Station CRM |
| 05 | SQL | Oportunidades que o time comercial classificou com 4 ou 5 estrelas. | RD Station CRM |
| 06 | Vendas digitais | Negociações marcadas como “Vendido” no CRM. | RD Station CRM |
“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.
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ê
| Perfil | O que faz no sistema | Com que frequência |
|---|---|---|
| Marketing | Acompanha as seis etapas, compara períodos, identifica o gargalo do mês, lança as impressões de redes sociais | Semanal |
| Gestão / diretoria | Recebe o resumo por e-mail toda segunda-feira; abre o painel quando quer detalhe | Semanal, passivo |
| Comercial / CRM | Confere se MQL, SQL e Vendas batem com o que veem no RD | Eventual |
| Quem mantém o sistema | Roda diagnósticos, renova credenciais, publica alterações | Mensal 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.
“Preciso consultar um dado técnico”
Seção 6. Nomes de arquivo, rotas, variáveis, tabelas do banco, listas fixas.
“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ágina | Endereço | Para que serve |
|---|---|---|
| Painel principal | funildoka.vercel.app | O funil completo, com filtros e detalhamentos |
| Lançamento manual | funildoka.vercel.app/manual | Inserir impressões de redes sociais e dados antigos de RD |
| Assinantes do e-mail | funildoka.vercel.app/emails | Cadastrar e remover quem recebe o resumo semanal |
| Mapa de dados | funildoka.vercel.app/mapa-dados-funil.html | Página de referência técnica das origens de dado |
| Diagnóstico | funildoka.vercel.app/api/debug | Teste automático das integrações (ver 5.6) |
| Código-fonte | github.com/dokabathworks-commits/funildoka | Onde 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:
- 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. - Filtros
Período, marca e canal. Detalhados em 2.3. - Barra de status
Aparece no topo quando alguma integração falha. Some sozinha quando está tudo certo. - 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. - 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. - MQL por Fonte e Perfil de Clientes
Dois painéis de análise. Detalhados em 2.5. - Status das integrações
No rodapé: um indicador por plataforma, verde quando os dados chegaram e vermelho quando houve falha.
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
| Filtro | Opções | O que muda |
|---|---|---|
| Período | 7, 30, 90 ou 180 dias; ou um intervalo personalizado | Recalcula tudo. O período sempre termina hoje, exceto no intervalo personalizado. |
| Marca | Todas · Doka · Immersi | Escolhe quais propriedades do Google e quais eventos da RD entram na conta. |
| Canal | Todos · Orgânico · Pago | Afeta somente a etapa Visitantes. Pago = visitas cujo meio de sessão é cpc; orgânico = todo o resto. |
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:
| Etapa | O que o detalhamento mostra |
|---|---|
| Impressões | As 15 páginas mais vistas no Google, por marca, com cliques e taxa de cliques; e o total lançado manualmente por rede social |
| Visitantes | Origem e mídia de primeiro contato de cada visitante, ordenada por volume |
| Leads | Cada formulário/evento de conversão e quantas conversões trouxe, separado por marca |
| MQL, SQL, Vendas | Distribuiçã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.
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.
| Sinal | Significado | O que fazer |
|---|---|---|
| Verde em todas | As quatro APIs responderam | Nada |
| Uma vermelha | Aquela plataforma não respondeu ou recusou a credencial | Abrir /api/debug e ir para a seção 7 |
Um número aparece como — | O dado não veio; não é zero | Mesmo procedimento acima |
| Zero de verdade | A API respondeu e o valor é zero mesmo | Conferir o período: pode ser um intervalo sem atividade |
— 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
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
| Plataforma | O que entrega | Como o sistema entra | Se cair |
|---|---|---|---|
| Google Search Console | Impressões, cliques e páginas mais vistas na busca, por dia | Conta de serviço do Google com permissão de leitura em cada domínio | Impressões ficam só com o valor manual |
| Google Analytics 4 | Visitantes únicos, origem/mídia de primeiro contato, divisão pago × orgânico | A mesma conta de serviço, com acesso às duas propriedades | Visitantes mostra — |
| RD Station Marketing | Conversões de landing pages, formulários e pop-ups | Autenticação por token renovável (client id, secret e refresh token) | Leads cai para o que houver em cache e webhook |
| RD Station CRM | Negociações, notas de 1 a 5, fonte de origem, campos personalizados, status vendido/perdido | Token fixo, passado na própria URL | MQL, SQL, Vendas e Perfil de Clientes ficam todos em — |
| Webhook da RD | Avisos em tempo real de conversões que não aparecem no relatório de conversões | A RD chama o endereço do sistema quando o evento acontece | Leads perde a parcela de WhatsApp e institucional |
| Postgres (Neon) | Guarda as impressões de redes sociais lançadas à mão | Integração Neon dentro da Vercel | A página /manual falha ao salvar e as impressões manuais somem do total |
| Google Sheets | Cache do RD, eventos de webhook, lista de e-mails, auditoria dos lançamentos | A mesma conta de serviço, com permissão de edição na planilha | Cache e webhook param; o painel continua funcionando com dados ao vivo |
| Gmail | Envio do resumo semanal | Senha de aplicativo de uma conta Google Workspace | O e-mail de segunda não sai; o painel não é afetado |
| Vercel | Hospeda o site e executa a tarefa agendada de segunda-feira | Conta conectada ao repositório do GitHub | O sistema inteiro sai do ar |
| GitHub | Guarda o código-fonte e o histórico de alterações | Repositório da organização | O 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:
- O navegador pede os dados
A página chama/api/funnelpassando período, marca e canal. - 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. - 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. - Cada resultado é conferido
O que deu certo entra com o valor real. O que falhou entra comonull— que a tela mostra como—— e carrega junto a mensagem de erro. - 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. - 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. - 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. - 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. - 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:
| Categoria | O que é | Como entra no sistema | Situação |
|---|---|---|---|
| A | Conversões com landing page, formulário ou pop-up nativo da RD por trás | Consulta ao relatório de conversões da RD | Funcionando |
| B | As mesmas conversões, mas de períodos além de 45 dias atrás | Cache no Google Sheets ou lançamento manual | Funcionando |
| C | Cliques de WhatsApp e formulários do site institucional que não têm um material da RD por trás | Webhook — a RD avisa o sistema quando o evento acontece | Receptor pronto; webhook ainda não registrado na RD |
| D | Leads importados à mão em eventos e feiras, identificados por etiqueta | Parte deles foi reconstruída historicamente e colada na planilha | Histórico reconstruído; não há coleta automática |
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
| Dado | Fica em | Por quanto tempo | Some se… |
|---|---|---|---|
| Impressões, visitantes, conversões, negociações | Em lugar nenhum — são consultados ao vivo | Não são guardados | — |
| Impressões de redes sociais lançadas à mão | Postgres, tabela manual_impressions | Permanente | O banco Neon for apagado |
| Histórico de quem lançou o quê e quando | Google Sheets, aba Histórico | Permanente | A planilha for apagada |
| Resultados da RD já consultados | Google Sheets, abas Cache_RD_MKT e Cache_RD_CRM | 24 h para períodos recentes; permanente para períodos com mais de 45 dias | A planilha for apagada |
| Eventos de WhatsApp e institucionais | Google Sheets, aba Webhook_RD_MKT | Permanente | A planilha for apagada |
| Quem recebe o e-mail semanal | Google Sheets, aba Emails_Notificacao | Permanente | A planilha for apagada |
| Senhas e tokens | Variáveis de ambiente na Vercel | Até serem trocados | Alguém apagar a variável |
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
| Etapa | Fórmula exata | Filtro 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 |
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 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:
- Calcula quantos dias separam hoje da data inicial pedida.
- Se for mais de 44, empurra a data inicial para 44 dias atrás e avisa na resposta que o período foi ajustado.
- 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íodo | Validade do cache | Motivo |
|---|---|---|
| Recente (começa há menos de 45 dias) | 24 horas | O dado ainda pode mudar; vale reconsultar diariamente |
| Antigo (começa há mais de 45 dias) | Permanente | O 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.
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.
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:
| Etapa | Como Doka e Immersi são separados |
|---|---|
| Impressões e Visitantes | Cada marca tem sua própria propriedade no Google. A separação é natural. |
| Impressões manuais | Pelo nome da plataforma: chaves terminadas em _immersi são Immersi; o resto é Doka. |
| Leads | Pelo nome do evento de conversão: contém “immersi” → Immersi; contém “doka” → Doka; nenhum dos dois → conta só no total. |
| MQL, SQL e Vendas | Não há filtro de marca. Esses números são sempre do CRM inteiro; a separação existente é por área de atuação. |
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:
| Sintoma | Causa provável |
|---|---|
| Leads menor que no RD Station | Perí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 CRM | O painel conta por data de fechamento; o relatório comparado provavelmente conta por data de criação |
| MQL maior do que o esperado | MQL conta todas as negociações criadas, não só as com nota alta |
| Visitantes diferente do GA4 | O 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 total | Eventos sem marca no nome — a categoria “ambas” de 4.6 |
| Impressões abaixo do esperado | Alguma rede social não foi lançada naquela semana. Confira o mapa de calor em /manual |
| Número parado, sem mudar há dias | Cache preso — veja E-08 |
| Search Console abaixo do painel do Google | O 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.
- 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. - Abra
funildoka.vercel.app/manual
A aba de impressões já vem selecionada. - Escolha a semana no mapa de calor
As 52 semanas aparecem em blocos. Semanas sem dado ficam claras. Clique na quinta-feira correspondente. - 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. - 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. - 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.
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
- Monte a planilha
No Excel ou no Google Sheets, com os cabeçalhos exatamente como acima. Salve como CSV separado por vírgula. - Envie em
/manual
Use o campo de importação por CSV, na parte de cima da página. - 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. - Confira no mapa de calor
As semanas importadas devem ter mudado de cor.
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
- Selecione a semana
No mapa de calor de/manual. - Use o botão de apagar da semana
Ele remove todas as plataformas daquela semana de uma vez, não uma plataforma isolada. - Confirme
O bloco volta a aparecer como vazio.
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).
- 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á. - Escolha a semana e a aba correspondente
Lembre: a semana começa na quinta. - Preencha e salve
Esses valores vão para o cache permanente, e o painel passa a usá-los quando aquele período for consultado.
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
- Abra
funildoka.vercel.app/emails - 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.
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.
- Abra
funildoka.vercel.app/api/debug
A página mostra texto puro, sem formatação. Isso é esperado. - Leia o resumo no final
Há um bloco_summarycom quantos testes passaram de um total de sete. - Localize o que falhou
Cada integração aparece com"ok": trueou"ok": false. Quando falha, vem junto a mensagem de erro original da plataforma. - 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. - 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.
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.
- 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. - 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. - Envie o registro
É um envio parahttps://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. - Confirme
Abra/api/debug-rd-webhooksde novo: o novo webhook deve aparecer na lista. - Verifique a chegada dos eventos
Depois de algumas horas, abra a abaWebhook_RD_MKTda 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.
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.
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.
| Credencial | Onde gerar de novo | Quando trocar |
|---|---|---|
| Chave da conta de serviço do Google | Google Cloud, no projeto coleta-ga4, em contas de serviço → chaves | Se vazar; ou por política, anualmente |
| Credenciais do RD Marketing | Área de aplicativos do RD Station | Se o token parar de renovar |
| Token do RD CRM | Configurações de integração do CRM | Raramente — o token é fixo e não expira |
| Senha de aplicativo do Gmail | Conta Google → Segurança → Senhas de app | Se o envio de e-mail começar a falhar |
| Conexão do banco Postgres | Painel do Neon, dentro da integração na Vercel | Só se o banco for recriado |
| Segredo das rotas protegidas | Qualquer texto aleatório definido por você | Quando alguém que o conhecia sai do time |
- Gere o valor novo na plataforma de origem
Sem apagar o antigo ainda, se a plataforma permitir manter os dois. - 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. - 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. - Confirme com o diagnóstico
Abra/api/debuge verifique se a integração voltou a passar. - Só então revogue o valor antigo
Na plataforma de origem.
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.
- Altere o arquivo
Pelo próprio site do GitHub, para mudanças pequenas, ou por um editor de código. - 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. - 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. - Teste
Abra o painel, confira os seis números e rode/api/debug.
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.
| Sistema | Permissão necessária | Quem concede |
|---|---|---|
| Vercel | Membro do projeto funildoka | Dono da conta Vercel |
| GitHub | Colaborador do repositório | Administrador da organização |
| Google Cloud | Leitura no projeto coleta-ga4 | Administrador do Google Workspace |
| Google Analytics | Leitura nas duas propriedades | Administrador do GA4 |
| Search Console | Leitura nos dois domínios | Proprietário da propriedade |
| Planilha de dados manuais | Edição | Dono da planilha |
| RD Station Marketing e CRM | Acesso administrativo | Gestão de CRM |
| Neon (Postgres) | Acesso via integração na Vercel | Dono da conta Vercel |
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.
- Cadastre a plataforma no banco
Insira uma linha na tabelaplatformsdo Postgres, com a chave no padrãorede_marca— por exemplothreads_doka. A terminação_immersié o que faz o valor entrar no recorte da Immersi. - Inclua a chave na lista fechada
No arquivolib/manual-impressions-db.js, na listaPLATFORM_KEYS. Chaves fora dessa lista são recusadas com erro — é uma proteção contra erro de digitação, não um obstáculo. - Inclua o campo na tela
No arquivoapp/manual/page.js, na lista de plataformas, com nome, marca, ícone e cores. - 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.
- Descubra o identificador exato
Abra/api/debug-rd-mkte localize o nome do evento como a RD o devolve. Copie exatamente, incluindo erros de grafia existentes — a lista atual contémwhastapp, com a letra trocada, porque é assim que está cadastrado na RD. - Adicione à lista
No arquivolib/rd-mkt.js, na listaMQL_EVENT_IDS. - 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. - 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. - 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ê
| Arquivo | O que faz |
|---|---|
app/page.js | O 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.js | Pá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.js | Cadastro e remoção de assinantes do resumo semanal, com botão de envio imediato. |
app/layout.js | Moldura comum a todas as páginas: idioma, título da aba e carregamento das fontes. |
app/globals.css | Fonte ú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
| Arquivo | O que faz |
|---|---|
lib/search-console.js | Consulta 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.js | Duas 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.js | Conversõ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.js | O 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.js | Grava 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.js | Todas 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.js | Conexão com o Postgres. Poucas linhas, mas é por onde tudo do banco passa. |
lib/sheets.js | Leitura 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.js | Todo 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.js | Lista, cadastra e remove assinantes na aba Emails_Notificacao. |
lib/mailer.js | Envio pelo Gmail, uma mensagem por destinatário. |
lib/email-template.js | Monta o HTML do e-mail semanal no formato de funil vertical. |
Configuração e páginas estáticas
| Arquivo | O que faz |
|---|---|
vercel.json | Registra a tarefa agendada do e-mail semanal. Este arquivo só passou a existir quando o e-mail foi criado. |
package.json | Lista as bibliotecas usadas e suas versões. |
next.config.js, jsconfig.json | Configuração do framework. O segundo é o que faz o atalho @/ apontar para a raiz do projeto. |
public/mapa-dados-funil.html | Página estática de referência dos campos de cada API, com atalhos para as rotas de diagnóstico. |
public/dashboard_lps_oportunidade_mes.html | Painel exploratório das landing pages da Oportunidade do Mês, de Doka e Immersi. Análise pontual, independente do funil. |
README.md | Apenas 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.
| Rota | Uso | O que faz | Abrir à mão? |
|---|---|---|---|
/api/funnel | Leitura | O agregador principal. Aceita periodo, start, end, marca e canal. | Sim, seguro |
/api/crm-insights | Leitura | Perfil de Clientes com rótulos amigáveis. Aceita start e end. | Sim, seguro |
/api/manual-data | Leitura e escrita | Consulta, grava e apaga lançamentos manuais e cache. Usada pela página /manual. | Só leitura |
/api/manual-data/csv | Escrita | Importação em lote por CSV. | Não |
/api/manual-data/coverage | Leitura | Cobertura das 52 semanas para o mapa de calor. | Sim, seguro |
/api/notify-emails | Leitura e escrita | Lista, cadastra e remove assinantes. | Só leitura |
/api/notify-emails/send | Escrita | Dispara o resumo imediatamente para toda a lista. | Não |
/api/cron/weekly-email | Automática | Chamada pela Vercel toda segunda. Protegida por segredo — recusa quem chamar sem ele. | Não |
/api/webhooks/rd-mkt | Recebimento | Recebe os eventos da RD. Responde sucesso sempre, mesmo se não conseguir gravar. | Não |
/api/admin/migrate-history | Escrita | Migraçã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-* | Leitura | Diagnóstico das integrações. Ver 6.10. | Sim, seguro |
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.
| Nome | Para que serve | O que quebra sem ela |
|---|---|---|
GOOGLE_SERVICE_ACCOUNT_JSON | Credencial da conta de serviço do Google, em bloco único | Search Console, Analytics, planilha e webhook — tudo do Google de uma vez |
GA4_PROPERTY_ID_DOKA | Identificador da propriedade Doka no Analytics | Visitantes da Doka |
GA4_PROPERTY_ID_IMMERSI | Identificador da propriedade Immersi | Visitantes da Immersi |
SEARCH_CONSOLE_SITE_URL | Domínio da Doka no Search Console | Impressões da Doka |
SEARCH_CONSOLE_SITE_URL_IMMERSI | Domínio da Immersi | Impressões da Immersi |
RD_MKT_CLIENT_ID | Identificação do aplicativo no RD Marketing | Leads vindos da API do RD |
RD_MKT_CLIENT_SECRET | Senha do aplicativo | Idem |
RD_MKT_REFRESH_TOKEN | Chave que renova o acesso a cada consulta | Idem |
RD_CRM_TOKEN_V1 | Token fixo do CRM | MQL, SQL, Vendas e Perfil de Clientes |
MANUAL_DATA_SHEET_ID | Identificador da planilha de dados manuais | Cache, webhook, e-mails e auditoria |
fd_db_DATABASE_URL | Conexão com o Postgres | Impressões manuais deixam de somar e a página /manual falha ao salvar |
GMAIL_USER | Conta que envia o resumo | E-mail semanal |
GMAIL_APP_PASSWORD | Senha de aplicativo do Gmail | E-mail semanal |
CRON_SECRET | Segredo das rotas protegidas | A tarefa agendada é recusada |
SITE_URL | Endereço público, usado nos links do e-mail | Nada — assume o endereço padrão se ausente |
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
| Item | Valor |
|---|---|
| Conta de serviço do Google | funil-doka-reader@coleta-ga4.iam.gserviceaccount.com |
| Projeto no Google Cloud | coleta-ga4 |
| Conta do Analytics | 9820993 |
| Propriedade GA4 — Doka | 355526070 |
| Propriedade GA4 — Immersi | 355713569 |
| Search Console — Doka | sc-domain:dokabathworks.com.br |
| Search Console — Immersi | sc-domain:immersi.com.br |
| RD Marketing — endereço base | https://api.rd.services |
| RD Marketing — renovação de token | https://api.rd.services/auth/token |
| RD CRM — endereço base | https://crm.rdstation.com/api/v1 |
| Banco Postgres | funildoka-db, região São Paulo |
| Repositório | github.com/dokabathworks-commits/funildoka |
| Projeto no Asana | 1205915971096498 |
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:
| Tabela | Guarda | Detalhes |
|---|---|---|
platforms | A lista fechada de plataformas válidas | Dez linhas: as oito redes sociais mais duas entradas de Search Console usadas apenas para marcar cobertura |
manual_impressions | Cada valor de impressão lançado à mão | Colunas: plataforma, início e fim do período, valor, quem lançou, observação e data de criação |
api_coverage | Os dias em que alguma API trouxe dado real | Alimenta 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.
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.
| Aba | Conteúdo | Escrita por |
|---|---|---|
Histórico | Registro de auditoria dos lançamentos de impressões | Página /manual, como cópia de segurança |
Cache_RD_MKT | Resultados já obtidos do RD Marketing, por período | Automático, a cada consulta bem-sucedida |
Cache_RD_CRM | Resultados já obtidos do RD CRM, por período | Automático |
Manual_RD_MKT | Leads e MQLs lançados à mão para períodos antigos | Página /manual |
Manual_RD_CRM | SQLs e vendas lançados à mão, por funil | Página /manual |
Emails_Notificacao | Assinantes do resumo semanal | Página /emails |
Webhook_RD_MKT | Eventos de categoria C e D, incluindo os 8.569 registros reconstruídos historicamente | Receptor de webhook e colagem manual |
- 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
| Tarefa | Quando | O que faz |
|---|---|---|
| Resumo semanal por e-mail | Segunda-feira, 11h no horário universal — cerca de 8h em Brasília | Busca os dados dos últimos 7 dias e envia o resumo para toda a lista de assinantes |
- 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
| Rota | Mostra |
|---|---|
/api/debug | Painel geral: presença de cada variável e teste de todas as sete integrações, com resumo de aprovados |
/api/debug-crm | Cinco negociações completas do CRM, com todos os campos como a API os devolve |
/api/debug-cf | Todos os campos personalizados do CRM com seus códigos — é daqui que sai o mapa fixo |
/api/debug-ga4 | Todas as dimensões e métricas disponíveis nas duas propriedades do Analytics |
/api/debug-sc | Dimensões disponíveis e amostras de dado dos dois domínios no Search Console |
/api/debug-rd-mkt | Eventos, campos e segmentações disponíveis no RD Marketing |
/api/debug-rd-webhooks | Webhooks 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
- 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. - Rode o diagnóstico
Abra/api/debug. Em trinta segundos você sabe qual das sete integrações falhou e com que mensagem. - 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. - Localize a ficha
Use a tabela de 7.2 e siga o procedimento indicado. - 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. - 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.
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ável | Ficha |
|---|---|---|
| A página inteira não abre | Vercel fora do ar ou publicação quebrada | E-01 |
Todos os números do Google em — | Credencial da conta de serviço inválida ou ausente | E-02 |
Só Impressões em — | Conta de serviço sem permissão no Search Console | E-03 |
Só Visitantes em — | Conta de serviço sem acesso à propriedade do Analytics | E-04 |
MQL, SQL, Vendas e Perfil todos em — | Token do CRM inválido ou endereço errado | E-05 |
Leads em — ou muito baixo | Renovação de token do RD Marketing falhou | E-06 |
| Leads zerado em período antigo | Limite de 45 dias, sem cache preenchido | E-07 |
| Número congelado há dias | Cache preso na planilha | E-08 |
| Leads de WhatsApp somem ao mudar o período | Datas na planilha de webhook lidas de forma errada | E-09 |
Página /manual não salva | Banco Postgres inacessível | E-10 |
| MQL por Fonte todo “Não identificada” | Campo de origem mudou de formato no CRM | E-11 |
| Perfil de Clientes vazio ou com códigos | Campos personalizados recriados no CRM | E-12 |
| E-mail de segunda não chegou | Senha de aplicativo, lista vazia ou tarefa agendada | E-13 |
| Eventos de webhook pararam de chegar | RD suspendeu o webhook | E-14 |
| Painel muito lento | Paginação do CRM em período longo | E-15 |
| Alterou a variável e nada mudou | Faltou publicar de novo | E-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/debuge 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 projetocoleta-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-scdevolve 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-ga4devolve 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 sercrm.rdstation.com/api/v1, e não o endereço do RD Marketing. - Confirmação
/api/debug-crmlista 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_MKTouCache_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_MKTe 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-crme 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 emlib/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 emlib/rd-crm.jse 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
/emailse 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_MKTparou 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-webhookse 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 silencioso | Efeito | Como detectar |
|---|---|---|
| Webhook suspenso pela RD | Leads perde toda a parcela de WhatsApp e institucional | Conferir mensalmente se a aba Webhook_RD_MKT segue recebendo linhas novas |
| Semana de redes sociais não lançada | Impressões subestimadas para sempre naquele período | Mapa de calor em /manual: blocos claros são semanas vazias |
| Consulta ao Search Console de páginas falhando isolada | Total certo, mas detalhamento por página vazio | Abrir o detalhamento de Impressões e ver se lista páginas |
| Marcação de cobertura de API falhando | Nenhum efeito hoje; no futuro, risco de contagem dupla | Só relevante quando alguma rede social virar automática |
| Evento novo de alta intenção fora da lista de MQL | MQL subestimado | Revisar a lista sempre que uma landing page nova entrar no ar |
| Cópia de segurança na planilha falhando | Dado salvo no banco, mas sem registro de auditoria | Comparar a aba Histórico com os lançamentos recentes |
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ência | Tarefa | Leva | Se ninguém fizer |
|---|---|---|---|
| Semanal, na quinta | Lançar impressões de redes sociais da semana fechada | 10 min | Buraco permanente nas Impressões |
| Conferir se o resumo de segunda chegou | 1 min | Falha de envio passa meses sem ser notada | |
| Mensal | Rodar /api/debug e conferir os sete testes | 2 min | Integração quebrada só aparece quando alguém precisa do número |
| Verificar se a aba de webhook segue recebendo linhas | 2 min | Leads subestimado silenciosamente | |
| Olhar o mapa de calor e preencher semanas em branco | 5 min | Histórico irrecuperável | |
| Comparar os seis números com o mês anterior e perguntar se fazem sentido | 10 min | Erro silencioso não detectado | |
| Trimestral | Revisar a lista de eventos que contam como MQL contra as landing pages ativas | 15 min | MQL subestimado |
| Conferir a lista de assinantes do resumo — quem saiu da empresa? | 5 min | Dado interno indo para fora | |
| Reler esta documentação e corrigir o que mudou | 30 min | Documentação vira ficção | |
| Anual | Trocar a chave da conta de serviço do Google | 20 min | Credencial antiga circulando |
| Revisar quem tem acesso a Vercel, GitHub, planilha e Neon | 20 min | Ex-funcionário com acesso ativo | |
| Atualizar as bibliotecas do projeto | 1 h | Falha 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:
| Risco | Quando costuma acontecer | Aviso prévio | Preparação |
|---|---|---|---|
| Chave da conta de serviço revogada por política do Google Workspace | Quando a organização impõe expiração de chaves | Normalmente nenhum | Saber gerar uma nova — 5.8 |
| Banco Neon pausado por inatividade | Se ficar semanas sem uso no plano gratuito | Nenhum | Reativar pelo painel da Neon |
| Webhook suspenso pela RD | Depois de falhas repetidas de entrega | E-mail da RD, se alguém estiver monitorando | Verificação mensal — E-14 |
| Aplicativo do RD Marketing removido ou expirado | Em reorganizações da conta RD | Nenhum | Saber recriar as credenciais |
| Senha de aplicativo do Gmail invalidada | Ao trocar a senha da conta ou mudar política de segurança | Nenhum | Gerar nova senha de app |
| Campos personalizados recriados no CRM | Em qualquer faxina do CRM | Nenhum | Rodar /api/debug-cf e atualizar o mapa |
| Domínio reconfigurado no Search Console | Em migrações de site | Depende de quem migrou avisar | Recolocar a conta de serviço nas permissões |
| Limite do plano da Vercel excedido | Se o uso crescer muito | E-mail da Vercel | Avaliar plano pago |
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.
| Acesso | Sem ele, é impossível | Recuperável se perdido? |
|---|---|---|
| Conta Vercel com acesso ao projeto | Publicar, ver variáveis, reverter uma publicação, ver a tarefa agendada | Sim, pelo dono da conta |
| GitHub, repositório da organização | Alterar qualquer linha de código | Sim, pelo administrador da organização |
Google Cloud, projeto coleta-ga4 | Gerar nova chave da conta de serviço | Sim, pelo administrador do Workspace |
| Administração do GA4 e do Search Console | Recolocar permissões da conta de serviço | Sim, pelo proprietário |
| Planilha de dados manuais, com edição | Corrigir cache, revisar webhook, ver auditoria | Sim, pelo dono da planilha |
| RD Station Marketing, área de aplicativos | Recriar credenciais e registrar webhook | Sim, pela gestão de CRM |
| RD Station CRM, configurações | Gerar novo token | Sim, pela gestão de CRM |
| Neon, via Vercel | Reativar o banco, consultar as tabelas | Sim, pelo dono da conta Vercel |
| Conta Gmail que envia o resumo | Gerar nova senha de aplicativo | Sim, pelo administrador do Workspace |
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/debuge 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
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ência | Situação | O que falta | Prioridade |
|---|---|---|---|
| Registrar o webhook da RD | Receptor pronto e testado; webhook não registrado | Uma ação manual — 5.7 | Alta: enquanto isso, os leads de categoria C só existem no histórico reconstruído |
| Três identificadores de evento não verificados | oportunidade-falar-consultor-immersi, -metal-rainbow e -air-massage | Confirmar se aparecem no relatório de conversões ou se são categoria C | Média |
| “Participantes Vendeu, Ganhou 2026” | 11 ocorrências encontradas, com padrão de nome diferente das demais | Confirmar se é a mesma coisa que vendeu-ganhou-2026 antes de incluir | Baixa |
| Propriedades de plataforma do Search Console | O Google lançou rastreio de Instagram, TikTok, YouTube e X por volta de julho de 2026 | Dar 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ária | Média: é a maior economia de trabalho manual à vista |
| Página de jornada de oportunidades | Desenhada e codificada, nunca validada em produção | Validar e registrar a tarefa agendada diária — há exatamente uma vaga livre no plano | Média |
| Rotas legadas de lançamento manual | Duas rotas que a tela não usa mais | Confirmar que nada as chama e remover | Baixa, mas evita repetir o defeito descrito em 6.2 |
| Arquivo de apresentação do repositório | Tem duas linhas | Apontar para esta documentação | Baixa |
| Cache do CRM para períodos fechados | Ideia, não implementada | Reduziria a lentidão descrita em E-15 | Baixa |
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ão | Motivo |
|---|---|
| Usar a versão 1 da API do CRM, com token fixo, e não a versão 2 | A 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 carregamento | Ela 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 local | O 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 auditoria | O 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 cache | Já 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 descartado | Foi 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 sucesso | A RD suspende webhooks que falham. Perder um registro é menos grave do que perder o webhook inteiro. |
Contagem e dados
| Decisão | Motivo |
|---|---|
| Vendas por data de fechamento, numa consulta separada | Uma 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 fechada | Verificado: já era o comportamento correto. Nenhuma mudança foi necessária. |
| Origem de primeiro contato no detalhamento de Visitantes | Mais 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 CRM | A 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 origem | Substituiu 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 formatado | O 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 empilha | Permite 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 inteiro | Rateio proporcional inventaria dados. Descartar e sinalizar é honesto. |
Limites confirmados nas plataformas — não insista
| Limite | Como foi confirmado |
|---|---|
| O relatório de conversões da RD só aceita landing page, formulário e pop-up | Documentaçã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íodo | Testado 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 RD | Só 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 evento | Confirmado 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 data | Foi 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 cada | Verificado no painel. Uma vaga já está ocupada pelo e-mail semanal. |
Interface
| Decisão | Motivo |
|---|---|
| Uma só fonte de cores para todo o sistema | Tema 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 terracota | O azul anterior conflitava com a paleta institucional. |
| Título das janelas de ajuda em caixa alta por estilo, não por texto digitado | O 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 texto | Propriedades 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.
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.
| Termo | O que significa |
|---|---|
| API | A 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. |
| Cache | Có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ço | Um 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. |
| CPC | Custo por clique. No Analytics, é a marcação que identifica visitas vindas de anúncio pago. É o que define o filtro “Pago” do painel. |
| CRM | Sistema onde o time comercial registra e acompanha as negociações. Aqui é o RD Station CRM. |
| Deal / negociação | Um registro de oportunidade dentro do CRM, com nota, origem, responsável e status. |
| Endpoint / rota | Um 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. |
| GA4 | Google Analytics 4, a versão atual do Analytics. Fonte da etapa Visitantes. |
| Impressão | Uma exibição do conteúdo para alguém. Aparecer não é clicar. |
| JSON | Formato 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 page | Página feita para uma campanha específica, normalmente com um formulário. No RD Station é um tipo de material que gera conversões. |
| Lead | Pessoa que deixou seus dados em algum formulário. Interesse, ainda não intenção de compra. |
| MQL | Marketing Qualified Lead — lead qualificado pelo marketing. Na Doka, as Oportunidades. Ver 4.1. |
| Neon | A empresa que hospeda o banco de dados Postgres do sistema. |
| Next.js | A 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. |
| Postgres | Tipo de banco de dados. Guarda as impressões de redes sociais lançadas à mão. |
| Pop-up | Janela que aparece sobre a página. No RD Station, um dos três tipos de material que geram conversões. |
| Publicar / deploy | Colocar uma versão nova do sistema no ar. Aqui é automático: alterou o código no GitHub, a Vercel publica. |
| Rating / nota | Classificaçã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 Station | A plataforma de marketing e vendas usada pela empresa. São dois produtos distintos, com APIs diferentes: Marketing e CRM. |
| Repositório | O lugar onde o código-fonte fica guardado, com todo o histórico de alterações. Aqui, no GitHub. |
| Search Console | Ferramenta do Google que mostra como o site aparece nos resultados de busca. Fonte da etapa Impressões. |
| Segmentação | No 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. |
| Serverless | Modelo 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 / etiqueta | Marcação livre aplicada a contatos no RD Station. É como os leads de eventos e feiras são identificados — a categoria D de 3.4. |
| Token | Uma senha que programas usam entre si. Alguns são fixos, outros precisam ser renovados a cada uso. |
| Upsert | Gravar 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 ambiente | Uma configuração guardada fora do código, na Vercel. É onde ficam todas as senhas e identificadores. Ver 6.3. |
| Vercel | O serviço que hospeda o site e executa a tarefa agendada do e-mail semanal. |
| Webhook | O inverso de uma consulta: em vez de o sistema perguntar, a plataforma avisa quando algo acontece. É como os cliques de WhatsApp chegam. |