Runbook de Operação Real: Google Ads + ClickBank no Brandvelia¶
Este guia orienta o operador de tráfego pago na execução real de campanhas com dinheiro real na Brandvelia, garantindo segurança financeira, integridade de tracking e automação ponta a ponta guiada por IA.
1. Conexão da Conta Google Ads (MCC + Conta de Anúncios)¶
A plataforma opera com acesso via MCC e criação direta de campanhas via API Google Ads v25.
Credenciais e Contas Configuradas:¶
- MCC Administradora (Login Customer ID):
872-713-5564(Brandvelia MCC) - Conta de Anúncios (Customer ID):
862-553-8203(vinicdroid@gmail.com) - Modo de acesso:
DRAFT_WRITE— "Operar campanhas" (criar pausada, ativar, pausar e ajustar orçamento; ativar e aumentar passam por Meu orçamento) - Credencial de OAuth:
GOOGLE_ADS_REFRESH_TOKEN_1(armazenada de forma segura nas variáveis de ambiente do servidor)
Como verificar a conexão:¶
- Abra Conexões (
/app/integrations) → cartão Google Ads. - Confira conta, MCC, modo Operar campanhas e a ação de conversão
(recurso
customers/…/conversionActions/…, tipo Importação de cliques). - Clique em Testar conexão (conta, moeda e conversão). A plataforma lê do
Google a moeda e o fuso reais da conta (ex.: BRL) e confere se a ação de
conversão está ativa e é de importação de cliques. Sem isso a ativação de
campanhas fica bloqueada (
ACCOUNT_NOT_VERIFIED/CONVERSION_ACTION_NOT_VERIFIED). Trocar conta ou ação zera a verificação. - O mesmo teste grava a saúde real da API (
last_api_ok_at) e lê os pré-requisitos da conta. O cartão mostra “API OK há N min”, “Sem confirmação recente” ou, em vermelho, “Token expirado — gere um novo”. Criar pausada e ativar exigem a API confirmada nos últimos 30 min (o passo 4 roda uma sonda leve quando está vencida). Pausar nunca é bloqueado.
Renovar o token do Google Ads¶
Quando o cartão mostrar “Token expirado — gere um novo” (GOOGLE_ADS_TOKEN_REVOKED):
- No Google Cloud Console do client OAuth, confirme “Status de publicação: Em produção” (em Teste o token expira em 7 dias) e a Google Ads API habilitada.
- No OAuth Playground → engrenagem → “Use your own OAuth credentials” com o
MESMO Client ID/Secret da Vercel. Se aparecer
redirect_uri_mismatch, adicionehttps://developers.google.com/oauthplaygroundnas URIs autorizadas de um client do tipo Web. - Se o client for do tipo Desktop, crie um client Web (ou use o fluxo
local do exemplo oficial) e atualize também
GOOGLE_ADS_CLIENT_IDeGOOGLE_ADS_CLIENT_SECRETjunto com o token: o refresh token fica preso ao client que o gerou. - Escopo
https://www.googleapis.com/auth/adwords, entrando com a conta que administra a MCC872-713-5564. - “Exchange authorization code for tokens” e copie o refresh token (começa com
1//). Nunca cole o token em chat ou e-mail. - Vercel → Settings → Environment Variables → edite
GOOGLE_ADS_REFRESH_TOKEN_1em Production (e Preview/Development) → redeploy de produção. - Volte em Conexões e clique em Testar conexão.
Trocar a Referência de Credencial no formulário NÃO renova o token.
Pré-requisitos da conta¶
“Testar conexão” (e o cron, 1×/dia por conexão) lê a conta. Um campo que não
pôde ser lido aparece como “Não foi possível conferir” (aviso *_UNKNOWN),
nunca como OK.
| Código | Bloqueia | Como resolver |
|---|---|---|
ACCOUNT_PREREQUISITES_NOT_CHECKED |
ativar (aviso ao criar) | Clique em “Testar conexão”. |
ACCOUNT_IS_MANAGER |
criar e ativar | Use o ID da conta de anúncios, não o da MCC. |
CUSTOMER_NOT_ENABLED |
criar e ativar | Confira o status da conta no Google Ads. |
EU_DECLARATION_MISSING_ON_ACCOUNT |
criar e ativar | Declare “Não contém publicidade política da UE” em cada campanha. |
TEST_ACCOUNT |
ativar (aviso ao criar) | Use a conta real: contas de teste nunca veiculam. |
AUTO_TAGGING_OFF |
ativar (aviso ao criar) | Administrador → Configurações da conta → Codificação automática. |
BILLING_NOT_APPROVED |
ativar (aviso ao criar) | Faturamento: aprove a forma de pagamento. |
BILLING_APPROVED_HELD |
não (aviso) | Faturamento aprovado mas retido: confira em Faturamento se os anúncios não veicularem. |
DEVELOPER_TOKEN_NOT_APPROVED |
criar e ativar | MCC → Administrador → Central de API → “Solicitar acesso básico”. |
GOOGLE_API_HEALTH_STALE |
criar e ativar | “Verificar de novo” no passo 4 ou “Testar conexão”. |
CONVERSION_COUNTING_ONE_PER_CLICK, CONVERSION_ACTION_SECONDARY, CONVERSION_LOOKBACK_SHORT |
não (aviso ao ativar) | Ajuste a ação de conversão no Google Ads. |
Códigos de erro do Google → ação¶
| Código | Ação na tela |
|---|---|
GOOGLE_ADS_REQUEST_INVALID, GOOGLE_CAMPAIGN_NAME_CONFLICT, códigos do builder (GOOGLE_KEYWORD_*, RSA_COPY_INVALID…) em criar pausada |
Voltar aos anúncios: corrija e salve de novo (novo envio). A DLQ de validação não é reenviada (COMMAND_NEEDS_NEW_ADS). |
GOOGLE_ADS_REQUEST_INVALID em ativar, pausar ou orçamento |
Abrir no Google Ads (com o código do Google) e Tentar agora. Pausar nunca tem o reenvio recusado. |
GOOGLE_ADS_TOKEN_REVOKED, GOOGLE_ADS_CREDENTIALS_MISSING |
Gerar novo token (passo a passo acima). |
GOOGLE_ADS_AUTH_ERROR, GOOGLE_ADS_OAUTH_CLIENT_INVALID, GOOGLE_ADS_DEVELOPER_TOKEN_NOT_APPROVED, GOOGLE_ADS_CUSTOMER_NOT_ENABLED, GOOGLE_ADS_PERMISSION_DENIED |
Abrir Conexões. “Já resolvi — tentar de novo” só aparece quando a readiness mostra a conexão saudável. |
GOOGLE_ADS_NETWORK_ERROR, GOOGLE_ADS_HTTP_ERROR, GOOGLE_ADS_QUOTA_EXHAUSTED |
O sistema tenta de novo sozinho; Tentar agora antecipa. |
“Validar no Google” (passo 4) usa validateOnly — nada é criado no Google Ads —
e lista os erros por item. “Criar campanha pausada” roda a mesma validação
antes; se o Google recusar, nenhum comando é criado. Um 400 de validação no
envio real vai para a DLQ na 1ª tentativa, com google_error_code e
google_field_path nos diagnósticos.
2. Presell & Proteção Contra Perda de Vendas (Tracking First-Party)¶
Para que nenhuma comissão seja perdida no ClickBank e o tráfego do Google Ads seja rastreado com precisão cirúrgica:
O que foi implementado e blindado:¶
- Isenção de Erro 404 no Middleware: As rotas públicas
/lp/{slug}(ex:https://brandvelia.com/lp/slug) são servidas diretamente pelo Next.js sem reescrita para/app, eliminando qualquer erro 404 em acessos de visitantes. - Cookies First-Party de 90 Dias:
bv_session_idebv_click_idsão persistidos comMax-Age=7776000(90 dias),SameSite=LaxeSecure.- Garantem que visitantes que retornam dias depois continuem atribuídos à sua campanha e ao seu lead.
- Delegação Nativa de Cliques no Documento:
- Eventos de clique em qualquer botão ou link para o ClickBank (
*.pay.clickbank.netou HopLink) são interceptados dinamicamente viadocument.addEventListener. - O parâmetro
extclid(ID único de rastreamento) é injetado no link de checkout. - Os parâmetros
gclid,gbraidewbraidda URL do Google Ads são preservados no checkout. - Conferência antes de publicar: no passo 2 do lançamento, Ver como ficou abre o preview da pressel; a lista de pendências (aviso de afiliado, links legais, promessas proibidas, scripts inseguros) precisa estar vazia para Publicar pressel.
3. Lançamento (passo a passo)¶
Guia completo e curto: manual-operador.md. Resumo:
- Ofertas (
/app/radar) → Lançar na linha da oferta (ou Continuar se já existe preparação para ela). - Produto — confirme a política de tráfego do produtor (Google Search permitido + link de evidência).
- Pressel — Importar página (URL de vendas já preenchida) → revisar → Publicar pressel. A cópia é determinística; seu link de afiliado substitui os botões de compra.
- Anúncios e orçamento — Gerar anúncios com IA (títulos ≤ 30, descrições ≤ 90, palavras-chave e negativas a partir do nome do produto). Orçamento sugerido = metade da comissão por dia, convertida para a moeda da conta e limitada por Meu orçamento.
- Conferir e criar no Google — Criar campanha pausada no Google: comando idempotente no outbox, entregue na hora (ou pelo cron em minutos). A tela espera o Google confirmar PAUSED — nada é gasto.
- Ativar — a lista "Antes de ativar" confere Meu orçamento, cotação do dólar (≤ 7 dias), aviso de venda do ClickBank recebido, conversão verificada e teto diário. Só então Ativar e começar a gastar.
3.1 Proteção do dinheiro¶
- Meu orçamento (
Dinheiro): teto por dia, máximo por campanha, verba de teste, stop-loss (× comissão) e aumento máximo em 24h. Imposto no banco: ativar ou aumentar orçamento acima dos limites é recusado. - Controle de gasto (
/api/cron/traffic-control, a cada 15 min): pausa sozinho e avisa no Telegram quando o teto do dia estoura, a verba de teste acaba ou uma campanha gasta o stop-loss sem venda líquida. - Pausar tudo (topo da tela): pausa todas as campanhas no Google na hora e bloqueia ativações até ser desligado. Pausar nunca é bloqueado.
4. Ingestão de Vendas e Fechamento Contábil¶
- INS 8.0 Webhook: Cada venda, cancelamento ou rebill dispara notificação para
https://brandvelia.com/api/webhooks/clickbank. - Atribuição: o
extclidrecebido no webhook liga a venda à visita. A campanha vem do ID da campanha Google (utm_campaign={campaignid}da visita) ou do vínculo pressel → campanha gravado ao salvar os anúncios (passo ADS); depois nome e pack READY. Ambiguidade fica nula e uma falha do resolvedor nunca derruba a venda. Comgclidna URL, a visita é gravada no servidor mesmo com bloqueador de anúncios. - Conferência: em Conexões, o card INS mostra o mini-painel Última venda (atribuída · gclid · enviada ao Google, ou o motivo em pt-BR) e a conferência diária do QuickStats, com divergência por dia. Cada sync do QuickStats registra uma verificação de integridade (deduplicada em 6 h).
- Rebill: não é enviado ao Google (
SKIP_REBILL_NOT_UPLOADED); o reembolso de um rebill não retrata o PURCHASE original. - Rebill nas métricas: entra na receita (somas), mas não conta como conversão nova no Início
nem no Financeiro (contagens excluem
subtype = 'rebill'). - Eventos antigos com falha de recibo repetido: antes da migration
20260927120400_brandvelia_clickbank_transaction_external_ref, todo rebill/reembolso/chargeback de um recibo já vendido falhava comSQLSTATE_23505_uq_transactions_workspace_external_ref. Se aparecer algum evento INS assim (hoje não há nenhum em produção), use Tentar de novo em Conexões → Avançado (bv_retry_clickbank_ingestion_event) em ordem cronológica (venda → rebill → reembolso), para cada evento encontrar o lançamento original. - Ledger Imutável: As transações são registradas em SQL e alimentam o dashboard com Lucro Líquido e ROAS real.
- Moedas: o gasto do Google (BRL) é convertido para USD pela cotação informada em Meu orçamento
(
fx_rate_snapshots); lançamentos sem cotação aparecem como "sem câmbio", nunca somados como USD.