A ideia em um minuto
A plataforma que assinamos hoje faz três coisas: busca os dados nas plataformas de mídia, guarda esses dados, e desenha o relatório. Estamos pagando pelas três juntas. A proposta é separá-las e ficar donos da do meio.
O dado deixa de morar na ferramenta do fornecedor e passa a morar numa base nossa. A partir dela, a agência desenha o relatório onde quiser — no Looker Studio, numa interface própria, num PDF. Trocar de interface deixa de ser um projeto; vira uma decisão de fim de semana.
Fontes
Google Ads, Meta Ads, GA4, Search Console, Perfil da Empresa, formulários do site.
continua igualColeta
Rotina diária que puxa tudo e padroniza nomes, moeda e fuso.
construirBase da VER
BigQuery. Uma tabela por tipo de métrica, granularidade diária, histórico sem prazo.
o ativoRelatório
Looker Studio para o cliente, interface própria para a operação.
escolha livreGoogle Ads só reporta os leads que o Google gerou. O Meta, idem. Nenhum dos dois conhece o orgânico, o perfil no Google ou o WhatsApp. Na demonstração, com os dados simulados do Eletro Repair, 40% dos leads do mês vêm de canais que a mídia paga não enxerga. Essa linha só existe quando as fontes estão na mesma base.
Veja o resultado antes de ler o resto
Demonstração navegável com três clientes fictícios, todos os canais e a tela de arquitetura.
A demonstração está no mesmo endereço, em reporting.ver.ag. A página não é indexada por buscadores e os dados são simulados.
Três decisões antes de escrever qualquer código
1. Quantos clientes justificam o esforço
O custo de construir é fixo; o custo da plataforma atual é por cliente. Faça a conta com o número real: se a mensalidade é X por cliente e temos N clientes, o gasto anual é 12 · X · N. Compare com uma estimativa honesta de horas de desenvolvimento mais o custo de nuvem da seção 6. Abaixo de uns 5 clientes, normalmente não fecha.
2. Quem sustenta isso daqui a um ano
Conector de API quebra. Meta muda versão da Marketing API periodicamente; o Google deprecia campos. Se a resposta para "quem arruma quando quebrar" for uma pessoa só, e essa pessoa for você, isso precisa entrar na decisão — não como impedimento, mas como risco declarado.
3. Qual é o primeiro cliente
Escolha um só para a Fase 1. De preferência um com Google Ads e Meta Ads rodando, site com formulário, e paciência se algum número sair errado na primeira semana. Um cliente em produção ensina mais que três no papel.
Não cancele nada ainda. Rode a base nova em paralelo com a plataforma atual por pelo menos um ciclo de fechamento. Quando os dois baterem em dois meses seguidos, aí sim a conversa sobre cancelar faz sentido.
Como construir, fase a fase
A ordem importa: cada fase entrega alguma coisa apresentável sozinha. Se o projeto parar no meio, o que já foi feito continua valendo.
As três fontes Google, sem escrever código
Google Ads, GA4 e Search Console já exportam para o BigQuery nativamente. Isso significa que a parte mais volumosa do trabalho é configuração, não programação.
- Criar um projeto no Google Cloud e um dataset no BigQuery — algo como
ver_reporting. - Ligar o BigQuery Data Transfer Service para o Google Ads, apontando para a conta do cliente.
- No GA4, ativar o export para BigQuery nas configurações da propriedade (é nativo e gratuito na faixa padrão).
- No Search Console, ativar a exportação em massa de dados para o mesmo projeto.
- Esperar 24 a 48 horas. As três começam a escrever tabelas sozinhas.
No fim da semana você tem: histórico diário de Google Ads, GA4 e busca orgânica no BigQuery, atualizando sozinho, sem nenhuma linha de código.
O que não tem conector pronto
Três fontes exigem código nosso. São elas que dão à VER a vantagem que a plataforma atual não tem — e, não por acaso, o trabalho de verdade.
- Meta Ads — Marketing API. Criar um app no Business Manager, gerar um token de usuário de sistema e agendar um job diário que grava em
campaign_metrics. - Perfil da Empresa no Google — Business Profile Performance API. Volume baixo, chamada simples, alimenta
business_metrics. - Leads do site — um endpoint nosso que recebe cada envio de formulário com as UTMs preservadas e grava na tabela
leads. É a peça mais barata de construir e a mais valiosa do conjunto.
Onde rodar: um Cloud Run job agendado pelo Cloud Scheduler resolve os três. Cada job pega os últimos 7 dias, não só ontem — plataformas de mídia revisam números retroativamente, e ignorar isso é a causa mais comum de relatório que não bate.
No fim das semanas 2 e 3 você tem: a base completa, incluindo leads com origem — o dado que hoje não existe em lugar nenhum de forma centralizada.
A camada de modelagem — onde a VER define o que cada número significa
Cada fonte chega com o vocabulário dela. O Google chama de cost, o
Meta de spend. Crie views no BigQuery que traduzem tudo
para o modelo único: campaign_metrics,
seo_metrics, business_metrics, leads.
É aqui que CPL, CPA e ROAS passam a ter uma definição só, válida para todos os clientes e todos os canais. Hoje cada plataforma calcula do seu jeito e ninguém consegue somar.
No fim da semana 4 você tem: uma camada de views estável, que é o contrato entre a base e qualquer relatório que venha depois.
O relatório e o comentário automático
- Conectar o Looker Studio ao BigQuery e montar um painel-template, parametrizado por cliente (detalhes na seção 5).
- Ligar o envio agendado por e-mail no dia do fechamento.
- Colocar o comentário escrito por Claude no topo do relatório (seção 4).
No fim: o cliente recebe, no mesmo dia todo mês, um relatório com a marca da VER, com todos os canais e com um parágrafo de análise escrito — sem ninguém ter aberto uma planilha.
Onde o Claude entra
Em dois papéis bem diferentes: como ferramenta de construção, enquanto vocês montam isso, e como peça do produto, rodando sozinho todo mês depois de pronto. O segundo é o que a plataforma atual não faz.
Como ferramenta de construção
Os conectores da Fase 2 e as views da Fase 3 são trabalho repetitivo e bem documentado — exatamente o tipo de código que o Claude Code escreve rápido. A diferença está em como o pedido é feito: peça o contrato, não "um script".
Escreva um job em TypeScript para Cloud Run que lê a Meta Marketing API e grava
no BigQuery na tabela campaign_metrics, com este schema exato:
client_id, account_id, platform, date, campaign_id, campaign_name, impressions,
reach, clicks, spend, conversions, leads, revenue.
Requisitos: reprocessar sempre os últimos 7 dias, não só ontem; ser idempotente (rodar duas vezes no mesmo dia não pode duplicar linha); ler o token de um Secret Manager; registrar falha por conta sem derrubar as outras contas; respeitar o rate limit da API com backoff.
A frase que mais economiza retrabalho é "ser idempotente". Sem isso, um job que roda duas vezes dobra o investimento do dia no relatório — e você só descobre na reunião com o cliente.
Tenho no BigQuery as tabelas brutas do Data Transfer do Google Ads e do export do GA4. Escreva as views que normalizam as duas para este schema [cole o schema], convertendo micros para reais no Google Ads, tratando fuso para America/Sao_Paulo e garantindo que a mesma campanha tenha o mesmo campaign_id entre os dias. Explique cada decisão de conversão em comentário no SQL.
Como peça do produto: o comentário do relatório
Este é o uso que muda a percepção do cliente. Todo mês, um job lê os números fechados do BigQuery e pede ao Claude um parágrafo de análise — o que mudou, por que provavelmente mudou, e o que olhar no mês seguinte. O texto entra no topo do Looker Studio, com a assinatura da agência.
Cloud Run job · TypeScript
// npm install @anthropic-ai/sdk @google-cloud/bigquery import Anthropic from "@anthropic-ai/sdk"; import { BigQuery } from "@google-cloud/bigquery"; const client = new Anthropic(); // lê ANTHROPIC_API_KEY do ambiente const bq = new BigQuery(); // 1. Os números fechados do mês, já agregados pelas views da Fase 3. const [rows] = await bq.query({ query: `SELECT * FROM \`ver_reporting.v_resumo_mensal\` WHERE client_id = @clientId AND mes = @mes`, params: { clientId, mes }, }); // 2. O Claude recebe SÓ números e escreve a leitura. const response = await client.beta.messages.create({ model: "claude-opus-5", max_tokens: 4000, thinking: { type: "adaptive" }, // se o modelo recusar a tarefa, a API refaz num modelo alternativo betas: ["server-side-fallback-2026-07-01"], fallbacks: "default", system: `Você é analista de performance da Agência VER. Escreva a leitura do mês para o cliente, em português do Brasil. Regras: - 3 parágrafos, no máximo 180 palavras no total. - Cite sempre o número junto da afirmação. - CPL e CPA subindo é resultado pior, mesmo que o volume tenha crescido. - Não invente causa que os dados não sustentam; se a variação não tem explicação nos números, diga que precisa de investigação. - Termine com a recomendação para o mês seguinte.`, messages: [{ role: "user", content: `Dados do mês:\n${JSON.stringify(rows[0], null, 2)}`, }], }); // 3. Grava de volta no BigQuery; o Looker Studio lê daqui. const texto = response.content.find((b) => b.type === "text")?.text ?? "";
A linha "CPL e CPA subindo é resultado pior" parece óbvia e é o que separa uma análise de um resumo. Sem ela, o modelo escreve "o CPL cresceu 12%" com o mesmo tom animado de "os leads cresceram 12%". As regras de negócio da agência moram no prompt.
Outros dois usos que valem o esforço
Alerta de variação, todo dia de manhã
Um job diário compara os últimos 7 dias com os 7 anteriores. Se algum cliente cruzar um limiar — CPL 25% acima, investimento parado, leads em queda —, aí sim chama o Claude para escrever o alerta e manda no canal da equipe. O modelo só é acionado quando há o que dizer, o que mantém o custo perto de zero e evita que o alerta vire ruído.
Manutenção quando a API quebrar
Quando um conector falhar, o log de erro mais o arquivo do job colados no
Claude Code costumam resolver em minutos. Vale guardar cada conector num
repositório com um CLAUDE.md explicando o schema e as regras de
idempotência — assim o contexto não precisa ser reconstruído a cada incidente.
O que não delegar ao modelo. Não peça ao Claude para calcular CPL, ROAS ou variação percentual. Isso é SQL, é determinístico e precisa bater com a tabela. O modelo entra depois da conta feita, para interpretar — nunca para fazer aritmética que o cliente vai conferir.
Onde o Looker Studio entra
O Looker Studio (o antigo Data Studio) deixa de ser a fonte dos dados e passa a ser uma das saídas. Ele lê a base da VER pelo conector nativo do BigQuery, que já vem pronto e é gratuito.
Um painel, todos os clientes
O erro clássico é duplicar o relatório por cliente e acabar com onze painéis
ligeiramente diferentes. A alternativa é montar um painel e
filtrar por client_id, de duas maneiras combinadas:
- Parâmetro na URL — o mesmo relatório abre já filtrado para o cliente certo, e cada cliente recebe o seu link.
- Fonte de dados parametrizada — a consulta ao BigQuery recebe o cliente como parâmetro e traz só as linhas dele, o que também reduz custo de consulta.
Ajuste de layout feito uma vez vale para a carteira inteira. É o mesmo princípio da interface própria: uma aplicação, N clientes.
O que o Looker Studio automatiza sozinho
- Envio agendado — PDF por e-mail, no dia e horário que você definir. Resolve o fechamento mensal sem ninguém exportar nada.
- Atualização — o painel lê a base a cada abertura; como a coleta é diária, o cliente vê o dado de ontem sem pedir.
- Cache — vale ativar o cache do relatório e, se as consultas ficarem lentas ou caras, avaliar o BI Engine do BigQuery.
O limite honesto da ferramenta
O Looker Studio é excelente para entregar ao cliente e limitado para operar a agência. Ele não faz alerta por variação, o controle de acesso é mais grosso do que gostaríamos, e desenhar nele qualquer coisa fora do padrão é lento. Por isso a interface própria existe em paralelo: Looker Studio para o cliente, VER Reporting para a operação — as duas lendo a mesma base, sem duplicar regra de cálculo.
O que isso custa para rodar
Ordens de grandeza para uma carteira pequena, considerando volumes de agência — não de e-commerce grande. Confirme os preços atuais antes de levar a conta para a reunião; tabelas de nuvem mudam.
| Item | Como é cobrado | Estimativa / mês |
|---|---|---|
| BigQuery | Armazenamento e consulta, com uma faixa gratuita mensal que costuma cobrir uma carteira pequena | US$ 0 a 20 |
| Cloud Run + Scheduler | Por tempo de execução; os jobs rodam poucos minutos por dia | US$ 0 a 10 |
| Looker Studio | Gratuito na versão padrão | US$ 0 |
| Claude — comentário mensal | Por token. Opus 5 a US$ 5 por milhão de entrada e US$ 25 de saída; um comentário custa frações de centavo | menos de US$ 1 |
| Claude Code — construção | Assinatura de quem estiver desenvolvendo | custo já existente |
Se o comentário mensal sair caro em escala — não é o caso aqui —, a mesma chamada roda em Claude Sonnet 5 (US$ 2 / US$ 10 por milhão) ou Haiku 4.5 (US$ 1 / US$ 5). Para um parágrafo por cliente por mês, a diferença é irrelevante e não vale abrir mão da qualidade da análise.
O gasto real é tempo de gente. Estime as horas das fases 2, 3 e 4 pelo valor da hora de quem vai fazer, some, e compare com a mensalidade anual da plataforma atual. Se a conta não fechar com folga, o argumento de verdade para seguir é outro: ficar dono do histórico e do relatório, não economizar.
O que pode dar errado
Os quatro riscos reais, na ordem em que costumam aparecer:
Número que não bate com a plataforma
Vai acontecer, e quase sempre por um destes três motivos: fuso horário (a plataforma usa o fuso da conta, o BigQuery grava em UTC), janela de atribuição diferente, ou revisão retroativa que o nosso job não reprocessou. Por isso a Fase 2 puxa 7 dias, e por isso a operação em paralelo existe.
Conector que quebra em silêncio
O pior cenário não é o job falhar — é ele rodar e trazer zero. Cada job precisa gravar um registro de execução, e o alerta diário deve disparar quando um cliente amanhece com investimento zerado sem motivo.
Dependência de uma pessoa só
Se só uma pessoa sabe onde as coisas estão, a agência trocou uma dependência de
fornecedor por uma dependência interna — que é pior, porque não tem contrato.
Código em repositório, credenciais no Secret Manager, e o
CLAUDE.md de cada conector explicando o schema reduzem bastante isso.
Escopo que cresce sozinho
Assim que o primeiro painel funcionar, vão pedir TikTok, LinkedIn, atribuição
multi-toque e previsão de investimento. O modelo de dados aguenta — novas
plataformas entram na mesma tabela campaign_metrics —, mas cada uma
é mais um conector para manter. Vale combinar antes que canal novo só entra com
demanda de cliente que justifique.
Para começar segunda-feira
Nenhum destes passos exige decisão definitiva nem cancelamento de nada. São todos reversíveis, e juntos dão um mês de dado real para decidir com base em algo além de estimativa.
- Criar o projeto no Google Cloud e o dataset
ver_reportingno BigQuery. - Escolher o cliente-piloto e conferir se temos acesso de leitura às contas dele.
- Ligar o Data Transfer do Google Ads para esse cliente.
- Ativar o export do GA4 e a exportação em massa do Search Console.
- Esperar 48 horas e conferir se as tabelas apareceram.
- Levantar a mensalidade real da plataforma atual, por cliente e no ano.
- Mostrar a demonstração ao sócio e fechar a decisão da seção 2.
Se em duas semanas as três fontes Google estiverem no BigQuery e o Looker Studio já mostrar um gráfico com dado de verdade, o projeto é viável e o resto é execução. Se travar aí, trava por acesso e permissão — não por tecnologia —, e é melhor descobrir isso na semana dois do que no mês três.