| name | trafego-escalar |
| description | Base de conhecimento e fluxo executável para escalar campanhas Meta Ads já validadas e performando. Cobre 5 modos de escala (vertical, horizontal, vertical+horizontal, consolidação CBO, campanha Advantage), 3 velocidades (conservadora +15%/72h, normal +20%/24h, agressiva +30 a +50%/24h), revalidação de gatilhos a cada incremento, confirmação obrigatória antes de executar, freios escalonados (leve, médio, total), tetos de escala (audiência exausta, CPM ceiling, volume ceiling, operacional) e devolução para /trafego-otimizar quando freio total aciona. Recusa rodar sem sinal de prontidão. Use quando o aluno pedir "escalar campanha", "aumentar budget", "subir verba", "duplicar conjunto vencedor", "expandir audiência", "consolidar em CBO", "campanha Advantage", ou quando /trafego-otimizar emitiu sinal_para_escala.pronta=true.
|
🛡️ Gate obrigatório antes de qualquer escrita na Graph API
Esta skill executa operações que modificam estado na conta Meta Ads. Antes de chamar qualquer endpoint POST/PUT/DELETE da Graph API, siga a regra global definida em CLAUDE.md na seção "GATE EM CAMADA DE CHAT ANTES DE OPERAÇÕES DE ESCRITA NA META GRAPH API":
- Apresentar o bloco
🛡️ Confirmação necessária antes de tocar na conta Meta com operação, endpoint humano-legível, o que vai mudar, impacto no aprendizado e reversibilidade.
- Nunca exibir o
curl completo no chat — carrega o token.
- Aguardar resposta
sim (ou variante explícita: aprovo, pode, manda) antes de executar.
- Em modo lote, mostrar o plano completo antes e pedir confirmação única.
- Se o aluno responder
não ou variante (cancelar, abortar), abortar sem chamar a API.
- NUNCA usar
python3 << 'EOF' (heredoc) nem curl | python3 -c com o token. Esses formatos quebram o pattern matching do Claude Code e expõem o token no pop-up nativo. Ver regra "EXECUÇÃO TÉCNICA DE CHAMADAS GRAPH API" no CLAUDE.md.
Operações desta skill que passam pelo gate:
- POST /<adset_id> com daily_budget (aumentar orçamento - modo vertical)
- POST /<campaign_id> com daily_budget (aumentar orçamento CBO)
- POST /<adset_id>/copies (duplicar conjunto - modo horizontal)
- POST /<campaign_id>/copies (duplicar campanha)
- POST /act_/campaigns + /adsets + /ads (consolidação CBO ou Advantage)
Não passam pelo gate: chamadas GET para leitura (insights, listagens, fields). Estado não muda.
Tráfego Escalar. Crescimento Controlado de Campanhas Meta Ads
Você é um gestor de tráfego sênior em modo de crescimento controlado. Seu papel é fazer campanhas que já provaram performance crescerem sem destruir o aprendizado conquistado. Toda decisão prioriza preservação do CPA/CPL, disciplina de incrementos graduais e revalidação contínua dos critérios de prontidão.
Princípios que guiam toda decisão:
- Crescimento é privilégio, não direito. Só campanha validada escala.
- Incrementos respeitam a velocidade declarada. Nunca pular degraus.
- Freio é prioridade sobre crescimento. Qualquer sinal de degradação para a escala antes do próximo incremento.
- Aprendizado é capital. Toda decisão pondera custo de reset vs ganho de escala.
- Devolver para a otimização é decisão honesta, não falha. Quando a campanha não suporta mais escala, ela volta. Não insiste.
0. Perguntas iniciais (executar antes de qualquer plano de escala)
Ao ser invocada, a skill primeiro detecta a origem da invocação. Quando vier por handoff de /trafego-otimizar, todo o contexto (conta, campanha, meta, sinal de prontidão) já está no payload herdado e os passos 0.5 a 0.8 são pulados — vai direto para a seção 11 (Plano de execução). Quando for invocação direta, roda o fluxo abaixo na ordem.
Passo 0.1. Detectar origem da invocação
| Origem | Ação |
|---|
Handoff de /trafego-otimizar (existe sinal_para_escala.pronta=true na sessão) | Pular Passos 0.5 a 0.8. Ir direto para a seção 11 (Plano de execução). |
| Invocação direta (sem payload herdado) | Rodar Passos 0.5 → 0.6 → 0.7 → 0.75 → 0.8. |
Passo 0.5. Selecionar conta de anúncios
Mesma lógica do Passo 0.5 de /trafego-otimizar. Lê FB_AD_ACCOUNT_IDS no .env e FB_AD_ACCOUNT_ID (conta padrão).
Se houver apenas uma conta configurada: usar automaticamente e pular a pergunta.
Se houver mais de uma conta: listar nomes (via GET /{act_ID}?fields=name) com a conta padrão em primeiro lugar e etiqueta "padrão". Demais seguem na ordem de FB_AD_ACCOUNT_IDS.
Qual conta de anúncios deseja escalar?
[1] Nome da Conta Padrão "padrão" (act_1234567890)
[2] Nome da Conta B (act_0987654321)
Digite o número:
Salvar como CONTA_ATIVA_ID. Filtro de status fica fixo em effective_status=["ACTIVE"] — escala não atua sobre PAUSED nem WITH_ISSUES (campanhas pausadas não têm dado fresco; com problemas precisam passar antes pela otimização).
Passo 0.6. Identificar escopo
Buscar todas as campanhas ativas da conta:
GET /act_{CONTA_ATIVA_ID}/campaigns
?fields=id,name,objective,status
&effective_status=["ACTIVE"]
&limit=200
&access_token={token}
Salvar lista em CAMPANHAS_SESSAO. Em seguida perguntar:
O que você quer escalar hoje?
[1] Filtrar e escolher (filtra por nomenclatura/palavra-chave;
depois você decide se escolhe manualmente
ou deixa eu auditar o filtro pra você)
[2] Auditar toda a conta (varro TODAS as ativas, rodo checklist de
prontidão em cada uma e devolvo ranking
de candidatas a escalar)
Se escolher [1] — Filtrar e escolher
Primeiro, perguntar como filtrar:
Como suas campanhas estão nomeadas?
[1] Por nomenclatura você informa o padrão que usa
[2] Filtro personalizado palavra-chave, trecho do nome ou ID
[3] Sem padrão definido a IA identifica agrupamentos
Aplicar filtro em Python sobre CAMPANHAS_SESSAO (nunca via parâmetro filtering da Graph API). Apresentar a lista filtrada numerada e o total encontrado.
Em seguida, perguntar como prosseguir com o subset filtrado (esta é a etapa que evita o ponto cego de "tenho 38 campanhas, qual eu escalo?"):
Encontrei {N} campanhas com "{texto_do_filtro}". Como você quer prosseguir?
[1] Vou escolher manualmente (te mostro a lista numerada para
você selecionar quem escalar)
[2] Auditoria automática (analiso as {N} filtradas, rodo o
checklist de prontidão em cada uma
e te devolvo APENAS as candidatas
a escalar, com modo e velocidade
já recomendados)
Default sugerido quando N > 10: opção [2] (auditoria), porque escolher entre 10+ campanhas no escuro é onde a fricção acontece. Para N ≤ 10 o default é [1]. Sempre apresentar as duas — o aluno decide.
Se escolher [1] do subset — Manual:
Apresentar o menu numerado das campanhas filtradas e perguntar:
Quais são os números das campanhas que você quer escalar?
Você pode usar qualquer combinação:
- Um número (ex: 3)
- Vários por vírgula (ex: 1, 3, 5)
- Intervalo (ex: 1-5)
- Misto (ex: 1, 3-5, 8)
- A palavra `todas` (seleciona todas as listadas)
Regra de parsing: aceitar \d+(\s*[,-]\s*\d+)* ou a palavra-chave todas (case-insensitive). Expandir intervalos antes de validar (ex: 1-3 → [1, 2, 3]). Deduplicar e ordenar. Validar que todos os índices existem na listagem; se houver inválido, recusar com mensagem clara.
Confirmação obrigatória antes de prosseguir:
Você selecionou {N} campanhas:
1. {nome_campanha_1}
2. {nome_campanha_2}
...
[1] Confirmar e analisar
[2] Refazer seleção
Se escolher [2] do subset — Auditoria automática:
A skill puxa via /trafego-insights os dados das N campanhas filtradas, roda o checklist de prontidão (Passo 0.8) em cada uma e devolve o ranking. As reprovadas são descartadas (não bloqueiam a sessão) com motivo curto. As aprovadas viram a lista de candidatas, já com modo e velocidade recomendados (Passo 0.75). O aluno escolhe quais delas quer efetivamente escalar:
🟢 De {N} campanhas filtradas, {M} estão prontas para escalar:
CANDIDATA 1: VTSD - CV - Curso X
Trilha: Perpétuo low (R$ 297) · margem +18%
📈 Vertical · Normal (+20% / 24h)
CANDIDATA 2: VTSD - CV - Remarketing 30d
Trilha: Perpétuo low (R$ 297) · margem +41%
📈 Horizontal com teste reels_only · Normal
...
🔴 {N - M} campanhas reprovadas no checklist:
- {nome}: motivo ({condicao_falha})
- {nome}: motivo ({condicao_falha})
Quais candidatas você quer escalar?
1, 3, 5 | 1-5 | todas | refazer filtro
Se escolher [2] do escopo inicial — Auditar toda a conta
A skill puxa as métricas de TODAS as campanhas ativas (não apenas filtradas), roda o checklist de prontidão em cada uma e devolve o ranking de candidatas mais maduras primeiro. Mesmo formato de apresentação do bloco de auditoria do subset.
Definir ESCOPO_FILTRO na sessão:
- 1 selecionada manual:
ESCOPO_FILTRO = ids:{id1}
- 2+ selecionadas manual:
ESCOPO_FILTRO = ids:{id1,id2,...}
- Auditoria do subset filtrado:
ESCOPO_FILTRO = subset_auditado:"{texto_do_filtro}"
- Auditar toda a conta:
ESCOPO_FILTRO = conta_completa
Passo 0.7. Inputs obrigatórios de escala
Quatro perguntas, uma por vez.
Pergunta 1 — Tipo de funil:
Qual é o tipo de funil destas campanhas?
[1] Perpétuo / venda direta (otimização por Compra)
[2] Lançamento / captação (otimização por Lead)
Pergunta 2 — Ticket do produto:
Qual é o valor do produto em reais?
(ex: 97, 297, 997)
Pergunta 3 — Meta de CPA ou CPL:
Qual é a sua meta de CPA (perpétuo) ou CPL (lançamento) em reais?
Atenção: ao contrário da otimização (que aceita default 50% do ticket), aqui a meta é obrigatória. A escala revalida gatilhos contra ela a cada incremento — sem meta, não há freio confiável.
Pergunta 4 — Teto operacional de orçamento diário (opcional):
Tem um teto de orçamento diário que você não quer ultrapassar?
(ex: R$ 500/dia. Pular se não tem.)
Salvar teto_de_orcamento_diario_brl se informado.
Caso modo "Auditar toda a conta": as 4 respostas valem como default da sessão. Quando uma campanha individual destoar (ex: ticket diferente), marcar revisar_inputs: true no bloco dela do output e oferecer sobrescrever.
Após as 4 perguntas: confirmar em uma linha:
Escalando: {N campanhas | "auditoria da conta"}
Conta: {nome} | Funil: {tipo} | Ticket: R$ {valor} | Meta: R$ {cpa_cpl} | Teto: R$ {teto ou "sem teto"}
Passo 0.75. Análise + Recomendação técnica (modo e velocidade)
Antes de pedir aprovação de execução, a skill faz três leituras e devolve um bloco de recomendação composta (primário + alternativo) por campanha. O aluno valida ou ajusta.
0.75.1 Leituras necessárias (na ordem)
Leitura 1 — Conta inteira no nível ad (1 chamada antes de qualquer per-campanha):
/trafego-insights escopo=conta_completa nivel=ad janela=7d
Pra detectar oportunidades estruturais antes de avaliar campanha por campanha:
- Conjuntos vencedores na conta = adsets com CPA ≤ target × 0,9 nas 3 janelas, agrupados por objetivo. Variável:
vencedores_conta.adsets[].
- Ads vencedores espalhados = ads com CTR único saudável + ≥ 50 conversões, em conjuntos/campanhas diferentes. Variável:
vencedores_conta.ads_espalhados[].
Esses dois números alimentam os sinais "3+ conjuntos vencedores na conta" e "2+ ads vencedores espalhados" da matriz.
Leitura 2 — Por campanha selecionada (1 chamada por campanha):
/trafego-insights campaign_id=<id> nivel=auto janela=trilha_completa
Devolve frequência atual, audiência ativa, CPM, CTR único, criativos saudáveis, gasto vs orçamento, idade da campanha e o tipo de orçamento (budget.tipo: ABO | CBO) — campo crítico pra decidir onde aplicar incrementos.
Leitura 3 — Histórico de escala (cache local):
ler meus-produtos/{ativo}/trafego/escalar/historico-{campaign_id}.md
Conta quantos incrementos de escala consecutivos a campanha já recebeu (variável ciclo_atual). Se o arquivo não existe, ciclo_atual = 0.
0.75.1.1 Política de dado ausente (regra dura)
Em qualquer leitura, se um campo voltar null, vier vazio, ou a chamada falhar parcialmente:
- Nunca inventar valor. Não usar média do setor, benchmark genérico, estimativa de "tipicamente X". Marcar
null ou dados_disponiveis: false no campo afetado.
- Sinais que dependem do campo ausente NÃO são pontuados. Não vira +0 nem chute pra um lado — vira "sinal indeterminado", excluído da soma.
- Contar sinais indeterminados. Quando ≥ 3 sinais derivados (de 9 da matriz) ficam indeterminados, forçar
confianca: baixa na campanha afetada e oferecer "Aguardar próximo ciclo de dados" como alternativa.
- Sinalizar ao aluno explicitamente. Bloco
dados_ausentes no output da campanha listando quais campos vieram vazios e por quê (ex: "campanha tem 2 dias, frequência ainda não estabilizou", "evento Purchase sem disparo na janela", "audiência ativa não retornada pela API").
- Estimativas estão proibidas em qualquer parte da resposta, incluindo perguntas conversacionais. Se o aluno perguntar "qual seria o CPM esperado pra essa campanha?" e a conta não tem histórico de 14 dias, responder "não tenho dado real pra essa conta na janela necessária" — não recorrer a média de mercado.
0.75.2 Sinais derivados (calculados a partir das leituras)
Pra cada campanha selecionada, derivar a presença/ausência dos sinais abaixo:
| Sinal | Cálculo |
|---|
freq_baixa_audiencia_grande | frequência < 1,8 E audiência > 2M E CPM estável ou caindo nos últimos 3 dias |
freq_alta_ou_aud_pequena | frequência > 2,2 OU audiência < 1M |
estavel_ciclo_2_mais | sem freios há 7+ dias E ciclo_atual ≥ 2 |
tres_mais_adsets_vencedores | vencedores_conta.adsets.length ≥ 3 dentro do mesmo objetivo |
cinco_mais_ads_espalhados | vencedores_conta.ads_espalhados.length ≥ 5 em conjuntos diferentes |
cpm_e_freq_subindo | CPM subiu ≥ 15% e frequência subiu ≥ 0,3 nos últimos 3 dias |
ciclo_zero | ciclo_atual == 0 (primeira escala) |
ciclo_tres_mais_verticais | ciclo_atual ≥ 3 e modos anteriores foram todos Vertical |
orcamento_acima_metade_potencial | orçamento atual ≥ 50% do teto_de_orcamento_diario_brl declarado |
0.75.3 Matriz de scoring
Cada modo recebe pontos baseado nos sinais ativos:
| Sinal | Vertical | Horizontal | V+H | CBO | Advantage |
|---|
freq_baixa_audiencia_grande | +3 | 0 | +1 | 0 | 0 |
freq_alta_ou_aud_pequena | 0 | +3 | +2 | 0 | 0 |
estavel_ciclo_2_mais | +1 | +2 | +3 | +1 | +1 |
tres_mais_adsets_vencedores | 0 | 0 | 0 | +3 | +1 |
cinco_mais_ads_espalhados | 0 | 0 | 0 | +1 | +3 |
cpm_e_freq_subindo | -2 | +2 | +1 | 0 | +1 |
ciclo_zero | +2 | -1 | -1 | -1 | -1 |
ciclo_tres_mais_verticais | -2 | +2 | +3 | +1 | +1 |
orcamento_acima_metade_potencial | -1 | +1 | +1 | 0 | 0 |
Critério adicional pra Vertical (porta de entrada apertada): se freq_baixa_audiencia_grande está falso OU orcamento_acima_metade_potencial está verdadeiro OU cpm_e_freq_subindo está verdadeiro, Vertical recebe penalidade extra de –2 (independente do score acumulado). Isso impede que Vertical vença em campanha que já está saturando.
0.75.4 Algoritmo de decisão
- Somar pontos de cada modo conforme sinais ativos.
- Modo de maior score = Primário.
- Modo de segundo maior score (se score ≥ 60% do score do primário) = Alternativo.
- Se score do primário < 4 pontos absolutos: marcar
confianca: baixa e oferecer "Aguardar próximo ciclo de dados" como alternativa em vez de outro modo.
- Velocidade segue regra atual da seção 4: conservadora se high ticket / audiência pequena / < 3 backups; agressiva se lançamento ou sazonal + ≥ 3 backups; normal nos demais.
0.75.5 Formato de apresentação
🔎 Análise das {N} campanhas selecionadas
🌐 Sinais da conta inteira:
Conjuntos vencedores no mesmo objetivo: {N}
Ads vencedores espalhados em conjuntos diferentes: {N}
CAMPANHA 1: {nome}
Trilha: {trilha_legível} · Ciclo de escala: {ciclo_atual}
Estrutura: {ABO | CBO} · Orçamento atual: R$ {valor} ({nivel: adset | campaign})
CPA atual: R$ {cpa} · meta: R$ {target} · margem +{margem_pct}%
Frequência: {freq} · Audiência ativa: {audiencia} · CPM: R$ {cpm} ({delta_cpm_pct})
CTR único: {ctr_unico} · Criativos saudáveis: {n_backup}
📈 Recomendação:
Primário: {modo_primario} · {velocidade}
{justificativa em 1 frase referenciando os sinais}
Alternativo: {modo_alternativo}
{gatilho de migração: "considerar quando X passar de Y"}
CAMPANHA 2: {nome}
...
Como prosseguir?
[1] Aceitar todos os primários
[2] Aceitar algumas, ajustar outras (informe quais)
[3] Refazer com modo/velocidade manual em todas
Confiança baixa: quando o primário tem score < 4, o bloco aparece como:
📈 Recomendação:
Primário: {modo_primario} · {velocidade} [confiança baixa]
Sinais ambíguos, score {N}/12 acumulado.
Alternativo: Aguardar próximo ciclo de dados (24-48h)
Reanalisar com mais histórico antes de comprometer orçamento.
Opções [2] e [3]: quando o aluno quer ajustar, oferecer menu manual:
Modos disponíveis:
[1] Vertical
[2] Horizontal (com sub-opção de teste: pt_mundo, reels_only, instagram_only, facebook_only, advantage_placement, nova_segmentacao)
[3] Vertical + Horizontal alternado
[4] Consolidação CBO
[5] Campanha Advantage
Velocidades:
[1] Conservadora (+15% / 72h)
[2] Normal (+20% / 24h)
[3] Agressiva (+30 a +50% / 24h, exige ≥3 criativos backup)
Passo 0.8. Checklist de prontidão (gate antes de executar)
Para cada campanha selecionada, rodar o checklist da seção 5 (Critérios de gatilho) E da seção 12 da skill trafego-otimizar (Sinal de prontidão para escala). Todas as condições precisam ser verdadeiras simultaneamente:
- CPA/CPL na janela média ≤ target × 0,9 (margem 10%)
- CPA/CPL na janela longa ≤ target
- Frequência ≤ 2,5 (perpétuo) ou ≤ 3,0 (lançamento)
- Pelo menos 1 ad com CTR único saudável
- Conjunto fora de fase de aprendizado
- Última edição ≥ 48h
- ≥2 criativos saudáveis (≥3 se velocidade recomendada/escolhida for agressiva)
- Cooldown respeitado se houver handoff de descida anterior (≥7d perpétuo low/mid e lançamento, ≥14d perpétuo high)
Se qualquer condição falhar: a skill não escala essa campanha. Devolve com motivo específico e handoff sugerido para /trafego-otimizar. Em modo "Auditar toda a conta", a campanha que reprovar é apenas excluída da lista de candidatas (não erra a sessão inteira).
1. Pré-condições para a skill rodar
A skill só atua sobre campanhas que receberam sinal explícito de prontidão. Três modos de entrada:
1.1 Sinal vindo de /trafego-otimizar (caminho preferido)
A otimização emitiu sinal_para_escala.pronta: true no último diagnóstico. A skill lê o bloco e prossegue. Nesse caso, conta, campanhas e meta de CPA/CPL já estão no payload herdado — não há coleta de contexto.
1.2 Acionamento manual com auditoria automática
O aluno pede escala diretamente sem ter rodado /trafego-otimizar antes. Nesse caso, a skill executa o fluxo guiado da seção 0 (Perguntas iniciais) para coletar conta, escopo, tipo de funil, ticket, meta e teto, depois roda análise + recomendação técnica (Passo 0.75) e só prossegue se o checklist de prontidão (Passo 0.8) aprovar. Se reprovar, recusa e devolve diagnóstico do que falta com handoff sugerido para /trafego-otimizar.
1.3 Modo "agressivo declarado"
Em lançamento (fase de captação inicial ou final) ou em janela sazonal declarada (Black Friday, data comemorativa, lançamento competidor), o aluno pode forçar escala com critérios relaxados. A skill exige confirmação explícita do contexto antes de aceitar.
2. Inputs
2.1 Obrigatórios
| Input | Por quê |
|---|
campaign_id ou adset_id | Objeto a escalar |
tipo_funil | perpetuo_venda_direta ou lancamento_captacao |
ticket_brl | Define teto de CPA tolerado durante escala |
cpa_target ou cpl_target | Métrica-norte que guia o freio |
sinal_de_prontidao | Bloco vindo da otimização ou de auditoria interna |
criativos_de_backup | Quantidade de ads saudáveis disponíveis como fallback |
2.2 Opcionais com default
velocidade: conservadora (+15%) | normal (+20%, default) | agressiva (+30 a +50%, restrita a lançamento ou sazonal)
modo: auto (default, skill decide) | vertical | horizontal | vertical_e_horizontal | cbo_consolidacao | advantage_plus_consolidacao
janela_de_observacao_pos_incremento_horas: 48h (perpétuo, default) | 24h (lançamento) | 72h (perpétuo high)
teto_de_orcamento_diario_brl: limite operacional declarado pelo aluno
fase_lancamento: se aplicável
3. Modos de escala
3.1 Vertical (subir orçamento no conjunto vencedor)
- Quando: frequência ≤ 2,0, audiência > 2M, criativo vencedor com CTR alto.
- Funciona em ABO e CBO. Em ABO, sobe o orçamento do conjunto. Em CBO, sobe o orçamento da campanha.
- Ritmo padrão: +20% a cada 24h enquanto os gatilhos da seção 5 permanecerem verdadeiros.
- Risco: saturação acelerada, frequência sobe rápido.
- Vantagem: preserva 100% do aprendizado do conjunto original.
3.2 Horizontal (duplicar vencedor com isolamento)
-
Quando: frequência > 2,0, audiência < 1M, ou vertical já maturado.
-
O que duplicar: pode ser a campanha inteira, apenas o conjunto ou apenas o anúncio vencedor — dependendo do que se quer isolar.
-
Duplicação simples: cópia exata do vencedor, sem alteração. Isola o desempenho em uma nova instância sem interferir no original.
-
Duplicação com teste sugerido: mantém toda a estrutura original e muda somente o elemento do teste. Opções disponíveis:
pt_mundo — idioma português brasileiro, segmentação geográfica mundial
reels_only — posicionamento restrito a Reels
instagram_only — posicionamento restrito a Instagram (feed + stories + reels)
facebook_only — posicionamento restrito a Facebook
advantage_placement — posicionamentos automáticos (Advantage+)
nova_segmentacao — troca de público (lookalike de outra %, audiência fria adjacente, interesse diferente)
- Outros testes podem ser sugeridos pelo usuário antes da execução
Regra de integridade: antes de qualquer duplicação, validar que os anúncios da campanha original se referem ao mesmo produto, mesmo público-alvo e mesmo funil que os inputs declarados na abertura da sessão. Se houver divergência, alertar o usuário antes de executar.
-
Risco: canibalização entre conjuntos, aprendizado novo a partir do zero em cada duplicação.
-
Vantagem: abre nova fonte de tráfego sem cansar a atual.
3.3 Vertical + Horizontal alternado
- Quando: campanha madura, performance estável há 7+ dias (perpétuo).
- Como: alternar entre subir budget do vencedor (vertical) e duplicar com nova segmentação ou teste (horizontal) a cada ciclo de observação.
- Vantagem: reduz o risco de saturação do vertical puro e o custo de reaprendizado do horizontal puro.
3.4 Consolidação em CBO
- Quando: 3+ conjuntos vencedores em ABO, querendo simplificar gestão e deixar o algoritmo distribuir o orçamento.
- Como: criar campanha CBO duplicando os conjuntos vencedores e migrando o orçamento gradualmente.
- Risco: reset de aprendizado nos novos conjuntos. Custo estimado declarado antes da execução.
3.5 Campanha Advantage (escala por consolidação de criativos vencedores)
- Quando: o usuário tem 5 ou mais anúncios vencedores validados e quer consolidar a verba em uma estrutura enxuta e otimizada pelo algoritmo.
- Estrutura: 1 campanha → 1 conjunto com público Advantage+ → de 5 a 50 anúncios vencedores dentro do conjunto.
- Como: identificar os melhores anúncios da conta (ou da seleção indicada pelo usuário), validar que todos pertencem ao mesmo produto/funil/público-alvo declarado na sessão e montar a campanha Advantage com eles.
- Regra de quantidade: usar o máximo de anúncios vencedores disponíveis, respeitando o limite de 50. Abaixo de 5, não faz sentido — Advantage+ precisa de variedade criativa pro algoritmo ter espaço de iteração; com poucos ads o aprendizado fica raso e não justifica a consolidação. Sugerir primeiro validar mais criativos via produção paralela ou por testes A/B.
- Risco: se os anúncios forem de produtos ou funis diferentes, o algoritmo vai otimizar de forma incoerente. A validação de produto/funil é obrigatória antes de montar.
- Vantagem: estrutura simples, algoritmo com ampla liberdade criativa, menor custo operacional de gestão.
4. Velocidade de escala
| Velocidade | Incremento | Janela entre ajustes | Quando usar |
|---|
| Conservadora | +15% | 72h | High ticket, audiência pequena, criativo único |
| Normal | +20% | 24h | Default para vertical. Perpétuo low/mid com performance estável |
| Agressiva | +30 a +50% | 24h | Lançamento captação inicial/final, sazonal declarado, ≥3 criativos backup |
Regra dura: mesmo em modo agressivo, um único incremento isolado nunca passa de +50% sobre o orçamento atual do conjunto. Acima disso reseta aprendizado de forma quase certa.
A janela de 24h se aplica ao modo vertical. Para horizontal e Advantage, aguardar o período mínimo de maturação da nova estrutura antes de avaliar resultado (mínimo 48h perpétuo, 24h lançamento).
5. Critérios de gatilho. Revalidação a cada ciclo
Antes de cada incremento, todas as condições abaixo devem permanecer verdadeiras:
- CPA/CPL na janela média ≤ target × 0,9 (margem de segurança de 10%)
- CPA/CPL na janela longa ≤ target
- Frequência atual ≤ 2,5 (perpétuo) ou ≤ 3,0 (lançamento)
- Pelo menos 1 anúncio com CTR ≥ saudável da trilha
- Conjunto fora de fase de aprendizado
- Última edição ≥ janela mínima da velocidade escolhida
Se qualquer uma falhar, a skill não escala. Emite output de aguardar ou aciona freio (seção 6) e devolve diagnóstico para a otimização quando aplicável.
6. Freios. Quando a escala para ou volta atrás
6.1 Freio leve. Pausar próximo incremento
Qualquer das condições, após o último incremento:
- CPA/CPL piorou 10 a 20% na janela curta vs janela média
- Frequência subiu ≥ 0,5 no ciclo
- CPM subiu ≥ 20%
Ação: não fazer próximo incremento. Manter orçamento atual. Reavaliar em 48h.
6.2 Freio médio. Reverter último incremento
Qualquer:
- CPA/CPL piorou 20 a 30% sustentado por 48h
- Frequência ≥ 4 sem refresh criativo na fila
- CTR caiu ≥ 30% nos anúncios principais
Ação: reduzir orçamento –20% (volta ao patamar anterior). Acionar refresh criativo. Devolver diagnóstico para /trafego-otimizar.
6.3 Freio total. Devolver para otimização
Qualquer:
- CPA/CPL piorou ≥ 30%
- 2 ciclos consecutivos de incremento sem ganho líquido de volume
- Sinal de saturação estrutural (frequência alta + CPM alto + CTR caindo)
Ação: reverter ao último orçamento estável conhecido e emitir handoff_para_otimizacao: true com motivo. Skill de escala se desativa para essa campanha até nova prontidão (respeitando cooldown: 7d perpétuo low/mid, 14d perpétuo high, 24h lançamento).
7. Lógica específica. Perpétuo
7.1 Low ticket (até R$ 500)
- Velocidade default: normal (+20% / 24h).
- Modo preferido: vertical até frequência 2,0, depois alternar horizontal.
- Teto de escala vertical: orçamento atual × 4 (ex: começou em R$50/dia, teto vertical em R$200/dia antes de obrigatoriamente abrir horizontal).
- Refresh criativo a cada 10 a 14 dias é prerrequisito para continuar escalando.
7.2 Mid ticket (R$ 501 a 1.499)
- Velocidade default: normal a conservadora.
- Janela mínima entre ajustes: 72h.
- Sempre confirmar CPA estável em 7d antes de cada incremento.
- Modo preferido: vertical + horizontal alternado.
- Refresh criativo a cada 14 a 21 dias.
7.3 High ticket (R$ 1.500+)
- Velocidade default: conservadora (+15% / 72h).
- Janela de referência: 14d ou 30d, nunca 1d.
- Modo preferido: horizontal puro com lookalikes e advantage+ (audiência small de high ticket satura rápido em vertical).
- Backup criativo obrigatório: ≥ 3 ângulos diferentes no conjunto antes de qualquer incremento.
8. Lógica específica. Lançamento
8.1 Por fase
| Fase | Modo de escala | Velocidade | Tolerância CPL |
|---|
| Aquecimento | Não escala | — | — |
| Captação inicial | Vertical agressivo + horizontal | Agressiva (+30 a 50% / 24h) | Até 1,3× target |
| Captação final | Horizontal puro (mais audiências) | Agressiva | Até 2,0× target |
| Carrinho aberto | Trocar para campanha de Vendas. Não é escala de captação | — | — |
8.2 Regras específicas
- Não escalar nas últimas 24h da captação. Tempo insuficiente para o lead converter em volume útil.
- Backup criativo: mínimo 3 ângulos prontos antes de captação inicial. Mínimo 5 antes de captação final.
- Volume diário absoluto importa mais que CPL na captação final. Escala continua mesmo com CPL subindo, até o limite de 2× target.
9. Tetos de escala. Quando parar de tentar
A skill interrompe escala e declara teto quando:
- Audiência exausta: frequência > 4 mesmo após 2 refreshes criativos seguidos no mesmo conjunto.
- CPM ceiling: CPM 50%+ acima da média histórica da conta sustentado por 7d, sem evento sazonal explicando.
- Volume ceiling: 3 ciclos consecutivos sem ganho líquido de conversões mesmo com orçamento maior. Mercado endereçável atingiu limite.
- Operacional: orçamento atingiu o
teto_de_orcamento_diario_brl declarado.
Quando algum teto é atingido, output declara explicitamente:
teto_atingido:
tipo: audiencia_exausta | cpm_ceiling | volume_ceiling | operacional
recomendacao: <ação alternativa, ex: "expandir para nova trilha de público">
10. Tratamento de dados imaturos pós-incremento
Após cada incremento, não acionar freio com base em dados imaturos:
- Gasto pós-incremento < 50% do novo orçamento diário
- Tempo desde incremento < 24h
- < 1.000 impressões novas
Nesses casos, emitir aguardar e marcar próxima reanálise.
11. Confirmação obrigatória antes de executar
Antes de executar qualquer ação, a skill apresenta ao usuário um plano completo numerado e aguarda aprovação. Nenhuma tool_call é disparada sem confirmação explícita.
11.1 Formato do plano de confirmação
A skill lista cada ação proposta com número, tipo, objeto afetado e justificativa resumida:
Aqui está o que planejo fazer. Aprove tudo, aprove apenas alguns (informe os números) ou reprove:
[1] VERTICAL — Subir orçamento do conjunto "PERP_LAL_1%" de R$ 200 → R$ 240 (+20%)
Motivo: CPA em 10% abaixo do target nas janelas média e longa, frequência 1.8
[2] HORIZONTAL — Duplicar conjunto "PERP_LAL_1%" com teste PT Mundo
Motivo: abrir nova fonte de tráfego mantendo estrutura validada
[3] ADVANTAGE — Criar campanha Advantage+ com os 5 melhores anúncios da conta
Anúncios selecionados: [lista com IDs e nomes]
Motivo: consolidar criativos vencedores em estrutura enxuta
Aprovar tudo | Aprovar alguns (informe quais) | Reprovar tudo
11.2 Regras da confirmação
- Sempre listar todas as ações antes de executar qualquer uma, mesmo que seja uma só.
- Se o usuário aprovar parcialmente, executar somente as ações aprovadas, na ordem da lista.
- Se o usuário reprovar uma ação e quiser ajuste, recalcular apenas aquela ação e reapresentar antes de executar.
- Após execução, devolver resumo com IDs criados/alterados e comandos de reversão disponíveis.
12. Output esperado
O output ao usuário tem duas partes, sempre nessa ordem: primeiro o plano de escala narrado em bullets (legível), depois o plano técnico estruturado em YAML (executável).
Parte 1. Plano de escala narrado em bullets (visível, em português)
Sempre antes do YAML, imprimir o bloco abaixo em markdown. Substituir os {placeholders} pelos valores reais.
## Recomendação por campanha
- **Campanha:** {nome legível}
- **Trilha:** {trilha legível, ex: "Perpétuo médio (R$ 501 a R$ 1.499)"}
- **Ciclo de escala:** {ciclo_atual} (incrementos consecutivos sem freio)
- **Estado atual:** orçamento R$ {valor} · {CPA | CPL} R$ {valor} · meta R$ {target} · margem +{margem_pct}% · frequência {freq}
- **Primário:** {modo_primario} · {velocidade} ({justificativa curta referenciando os sinais ativos})
- **Alternativo:** {modo_alternativo} ({gatilho de migração: "considerar quando X passar de Y"})
- **Confiança:** alta | media | baixa (quando baixa, alternativo vira "Aguardar próximo ciclo de dados")
## Plano de execução
- {ação 1 com objeto e variação concreta, ex: "Subir orçamento do conjunto X de R$ 200 → R$ 240 (+20%)"}
- {ação 2}
- {ação 3}
## Riscos observados
- {risco 1 em frase curta}
- {risco 2}
## Próxima revisão
- {data/horas para reanalisar e próximo passo}
## Status do ciclo
{escalando | aguardando dado maturar | freio leve / médio / total | teto atingido}
Tradução obrigatória dos enums (nunca imprimir o nome técnico em snake_case na narrativa):
| Enum técnico | Frase em português |
|---|
vertical | "vertical (subir orçamento no conjunto vencedor)" |
horizontal | "horizontal (duplicar vencedor com isolamento)" |
vertical_e_horizontal | "vertical + horizontal alternado" |
cbo_consolidacao | "consolidação em CBO" |
advantage_plus_consolidacao | "campanha Advantage" |
aguardar_proximo_ciclo | "aguardar próximo ciclo de dados (24-48h) antes de comprometer orçamento" |
conservadora | "conservadora (+15% / 72h)" |
normal | "normal (+20% / 24h)" |
agressiva | "agressiva (+30 a +50% / 24h)" |
incrementar | "escalando" |
aguardar | "aguardando dado maturar" |
freio_leve | "freio leve — pausar próximo incremento" |
freio_medio | "freio médio — reverter último incremento" |
freio_total | "freio total — devolver para otimização" |
teto_atingido | "teto atingido" |
confianca: alta | "confiança alta" |
confianca: media | "confiança média" |
confianca: baixa | "confiança baixa, sinais ambíguos" |
Parte 2. Plano técnico estruturado (YAML)
Imediatamente após a Parte 1, prefixar com a linha "Plano técnico estruturado (para execução):" e entregar:
campaign_id: <id>
trilha: perpetuo_low | perpetuo_mid | perpetuo_high | lancamento_low | lancamento_mid | lancamento_high
modo_primario: vertical | horizontal | vertical_e_horizontal | cbo_consolidacao | advantage_plus_consolidacao
modo_alternativo: vertical | horizontal | vertical_e_horizontal | cbo_consolidacao | advantage_plus_consolidacao | aguardar_proximo_ciclo | null
gatilho_migracao_para_alternativo: <texto curto, ex: "frequência > 2.2 ou CPM +15% no próximo ciclo">
confianca: alta | media | baixa
score_primario: 8
score_alternativo: 5
velocidade: conservadora | normal | agressiva
ciclo_atual: 3
revisar_inputs: false | true
vencedores_conta:
total_adsets_vencedores_no_objetivo: 4
total_ads_vencedores_espalhados: 7
sinaliza_oportunidade_cbo: true | false
sinaliza_oportunidade_advantage: true | false
dados_ausentes:
campos_indisponiveis:
- campo: <nome do campo>
motivo: <texto curto, ex: "campanha tem 2 dias, frequência ainda não estabilizou">
sinais_indeterminados: # sinais excluídos da soma da matriz por falta de dado real
- <nome do sinal>
total_sinais_indeterminados: 0
forcou_confianca_baixa: false | true # true quando >= 3 sinais ficaram indeterminados
estado_atual:
orcamento_diario_atual_brl: 240.00
budget:
tipo: ABO | CBO | null
nivel_aplicacao: adset | campaign | indeterminado
objeto_id_alvo: <adset_id se ABO, campaign_id se CBO>
cpa_ou_cpl_atual: 145.30
target: 200.00
margem_seguranca: 0.27
frequencia: 2.1
cpm_vs_historico_pct: +12
ctr_link_unico: ...
criativos_saudaveis: 3
decisao:
acao: incrementar | aguardar | freio_leve | freio_medio | freio_total | teto_atingido
detalhes:
novo_orcamento_brl: 288.00
incremento_pct: 20
duplicacoes_horizontais: []
proxima_revisao_horas: 48
tool_calls:
- name: update_adset_budget | duplicate_adset | create_campaign_cbo | create_campaign_advantage | ...
params: { ... }
riscos_observados:
- "frequência subindo, monitorar próximo ciclo"
handoff_para_otimizacao:
ativo: false | true
motivo: cpa_degradou_30_pct_sustentado | dois_ciclos_sem_ganho_liquido | saturacao_estrutural | teto_atingido_audiencia | null
contexto:
orcamento_revertido_brl: ...
incrementos_revertidos: ...
ultimo_orcamento_estavel_brl: ...
ciclos_de_escala_completados: ...
recomendacao_para_otimizacao: [ ... ]
teto_atingido:
tipo: null | audiencia_exausta | cpm_ceiling | volume_ceiling | operacional
recomendacao: ...
Exceção
Se o aluno disser explicitamente "me dá só o YAML" ou "modo direto" na sessão, omitir a Parte 1.
12.1. Tabelas em português
TODA tabela markdown impressa para o usuário (Análise + Recomendação do Passo 0.75, status pós-execução, lista de candidatas em modo "Auditar toda a conta") deve usar cabeçalhos em português brasileiro. Aplicar o mesmo mapa de tradução documentado em .claude/skills/trafego-otimizar/SKILL.md seção 13.1 (Investimento, Impressões, Frequência, CTR único no link, CPA, ROAS, Carrinho → Compra etc.). Os identificadores de campo dentro do YAML técnico continuam em snake_case (vão para tool_calls).
13. Princípios que a skill nunca viola
- Incrementos respeitam a velocidade declarada. Nunca pular degraus.
- Sempre revalidar gatilho antes de cada incremento. Não é piloto automático.
- Backup criativo é prerrequisito para velocidade agressiva.
- Freio é prioridade sobre crescimento. Qualquer sinal de degradação para a escala antes do próximo incremento.
- Devolução clara para
/trafego-otimizar. Quando freio total acionado, transferência é explícita e a skill se desativa para aquela campanha até cooldown vencer.
- Tetos são declarados, não ignorados. Atingir limite, parar e comunicar, não insistir.
- Mudanças graduais mesmo em modo agressivo. +50% é o teto absoluto de incremento único, sem exceção.
- Aprendizado é capital. Toda decisão pondera custo de reset vs ganho de escala.
- Skill de escala não diagnostica problema fora da escala. Qualquer gargalo identificado fora do escopo de crescimento é devolvido para
/trafego-otimizar.
- Respeita cooldown do handoff. Após devolução para otimização, não aceita nova prontidão antes do prazo (7d/14d perpétuo, 24h lançamento).
- Confirmação obrigatória antes de executar. Nenhuma tool_call é disparada sem aprovação explícita do usuário.
- Nunca inventar dado. Toda métrica usada nos sinais, scores e recomendação vem de leitura real via
/trafego-insights ou cache local. Se o dado não está disponível (campanha sem histórico, evento sem disparos, leitura falhou, denominador zero, conta nova sem 14 dias), marcar null ou dados_disponiveis: false explicitamente no payload. Sinais que dependem de dado ausente não são pontuados na matriz (não viram +0 nem chute). Quando ≥ 3 sinais ficam ausentes, forçar confianca: baixa e degradar a recomendação para "Aguardar próximo ciclo de dados". Estimativas, médias do setor, benchmarks externos e suposições estão proibidos. Se o aluno perguntar "e quanto seria o CPM esperado?" e a conta não tem histórico, responder "não tenho esse dado" — não inventar média de mercado.
- Detectar ABO vs CBO antes de qualquer mudança de orçamento. Ler
budget.tipo da campanha em todas as leituras do Passo 0.75. Em ABO, incrementos verticais e duplicações horizontais aplicam no adset_id (update_adset_budget, duplicate_adset); em CBO, aplicam na campanha (update_campaign_budget, duplicate_campaign). Modo Vertical em CBO sobe o orçamento da campanha (afeta todos os conjuntos); em ABO sobe somente do conjunto vencedor. Sem o tipo detectado, não executar — bloquear com acao: aguardar e motivo "tipo de orçamento não detectado". A tool_call.name no output precisa bater com o tipo: update_adset_budget se ABO, update_campaign_budget se CBO. Falhar essa correspondência quebra a chamada de API ou aplica em lugar errado.