Criação de Campanha Google Ads — CCA-F Prep
Skill operacional específica de produto para subir campanhas de Pesquisa do CCA-F Prep (comunidade de preparação para o Claude Certified Architect — Foundations) pelo MCP GOOGLE ADS B2 TECH. Deriva da skill agnóstica criacao-de-campanha-google-ads; o método e os guardrails são os mesmos — aqui o produto, a copy e os defaults já vêm resolvidos.
Ficha do produto (defaults desta skill)
| Parâmetro | Valor |
|---|
| Produto | CCA-F Prep — Comunidade + simulados + mentorias (12 meses) |
| URL final | https://claudeprep.io/ |
| Orçamento diário | R$ 20,00/dia |
| Estratégia de lance | TARGET_SPEND (maximizar cliques) |
| Match type | PHRASE |
| Geo | Brasil ["2076"] |
| Idioma (keyword ideas) | language_id: "1014" (pt-BR) |
| Conta | customer_id: 4342319594 (Blog B2 Tech, BRL) |
| Display path | path1: "cca-f" · path2: "prep" |
| Nome da campanha | CCAF Prep - Search - TARGET_SPEND | {DD/MM HH:MM} |
Oferta vigente (confirme se mudou antes de subir): founder R$ 2.497 ou 12x R$ 249,70 · 240 questões · 6 cenários · mentorias semanais · 12 meses de acesso. A copy pronta está em references/copy-ccaf-prep.md — leia antes de montar a chamada.
Se o Bruno pedir campanha para outro produto, esta skill não se aplica — use a skill agnóstica criacao-de-campanha-google-ads.
Princípios inegociáveis
- Preview antes de criar, sempre. Toda tool de criação aceita
preview: true — rode primeiro para validar limites e estrutura server-side, depois preview: false. Vale para campanha, sitelinks e callouts.
- Tudo nasce PAUSED. O funil cria tudo pausado; nada gasta até ativação explícita. Ativar é passo separado e exige confirmação.
- O funil NÃO é atômico. Se um passo falha no meio, os recursos já criados não sofrem rollback — voltam no retorno como
resource_names inertes. Reaproveite-os no retry; nunca recrie do zero.
- Confirmar antes de gastar. Ativação, mudança de orçamento ou geo exigem o "ok" do Bruno. Apresente o plano, espere a confirmação.
Modo headless (fila agent_jobs — kind create_google_ads)
Passo 0 — detecte o modo ANTES de qualquer outra coisa (antes até do pré-flight).
Rode via Bash:
[ -n "${AGENT_JOB_ID:-}" ] && echo "MODO=headless job=${AGENT_JOB_ID}" || echo "MODO=interativo"
O poller da fila agent_jobs sempre exporta AGENT_JOB_ID (poll-agent-jobs.sh linha 140);
numa sessão interativa com o Bruno essa env não existe. Não adivinhe o modo pelo tom do
prompt — um run da fila que "pergunta e sai com exit 0" é um bug silencioso: o job conta
como sucesso sem ter feito nem registrado nada.
Se MODO=headless: não há humano para responder. Regras que SUBSTITUEM os pontos
interativos desta skill:
-
NUNCA chame AskUserQuestion nem pare esperando confirmação — deadlock. Todas as
frases "confirme com o Bruno / espere o ok" valem só no modo interativo. No headless,
os defaults da ficha do produto valem integralmente (R$ 20/dia, TARGET_SPEND,
PHRASE, BR, copy de references/copy-ccaf-prep.md).
-
Anti-dup vira término gracioso. Se o pré-flight achar campanha com CCAF Prep ou
CCA-F Prep no nome com status ENABLED ou PAUSED criada há menos de 7 dias, NÃO
crie nada: grave o operation_logs de skip (passo 4 — OBRIGATÓRIO, não pule) com
summary explicando qual campanha já existe, e encerre com exit 0 (isso é
sucesso, não falha).
-
NUNCA ative nada. Pule o passo de ativação por completo (as tools update_*_status
nem estão no allowed-tools). A campanha fica PAUSED; ativação é manual do Bruno.
-
Persista em operation_logs via REST — no headless o MCP do Supabase é OAuth-gated
e NÃO está disponível; use curl com os envs que o runner já tem (SUPABASE_URL +
SUPABASE_SECRET_KEY). Uma linha por entidade criada (ou uma única de skip):
curl -fsS -X POST "${SUPABASE_URL%/}/rest/v1/operation_logs" \
-H "apikey: ${SUPABASE_SECRET_KEY}" \
-H "Authorization: Bearer ${SUPABASE_SECRET_KEY}" \
-H "Content-Type: application/json" \
-d '{"client_id":"fe1b93e9-2f23-4949-897e-59a5c5130788","entity_type":"campaign",
"meta_entity_id":"customers/4342319594/campaigns/<id>","action":"create",
"actor":"claude-code","summary":"Campanha Google Ads Search CCAF Prep R$20/dia criada PAUSED, 10 keywords, 6 sitelinks, 6 callouts, 12 negativas, geo BR"}'
⚠️ A constraint operation_logs_action_check só aceita action em
create|update|delete|activate|pause — não existe skip. No skip use
action='update' (no-op) com o summary começando com e = resource_name da campanha
já existente. do brunobracaioli é o acima. grave nas tabelas
— o schema delas é específico da Meta. Este passo NÃO é
opcional: o run só está completo depois do POST retornar 2xx (confira com
se em dúvida).
⚠️ Conformidade de marca (específico deste produto)
O CCA-F Prep é um preparatório independente — não é afiliado, endossado nem patrocinado pela Anthropic. Isso vale também para os anúncios:
- Nunca use copy que implique oficialidade: nada de "certificação oficial da B2 Tech", "curso oficial Anthropic", "parceiro oficial do exame" em headlines/descrições/sitelinks.
- Pode citar nominativamente "CCA-F", "Claude Certified Architect" e "Anthropic" como referência ao exame (uso nominativo), como a copy validada já faz.
- Se o Google reprovar algum asset por trademark, não brigue com variação de grafia — reporte ao Bruno; a decisão de contestar é dele (envolve os termos do Partner Network).
- A landing já carrega o disclaimer legal; os anúncios devem apontar só para
https://claudeprep.io/.
Intake — confirme antes de tocar em qualquer tool
Os defaults acima cobrem o caso padrão. Confirme com o Bruno, numa única pergunta consolidada, apenas o que fugir deles (orçamento diferente de R$ 20, outra estratégia de lance, geo restrito, teste A/B, etc.). Se ele só disse "sobe a campanha do CCAF Prep", os defaults valem.
⚠️ Pré-flight anti-duplicação (não pule)
Antes de criar qualquer coisa, rode list_campaigns na conta 4342319594 e verifique:
- Já existe campanha do CCA-F Prep / claudeprep.io? Se sim, não duplique — pergunte ao Bruno se quer editar a existente, criar variante (ad group novo, teste A/B) ou seguir mesmo assim. Atenção: pode existir campanha antiga do produto apontando para domínio anterior — se achar, pergunte se pausa/atualiza a antiga.
- O nome do orçamento é derivado do nome da campanha. Nome repetido → budget colide → funil quebra no passo budget/campaign. Garanta nome único incluindo data + hora:
CCAF Prep - Search - TARGET_SPEND | {DD/MM HH:MM}.
- Não há
list_budgets exposta. Se suspeitar de budget órfão de um run anterior que falhou no meio, use o resource_name retornado naquele run para reaproveitá-lo no Caminho B, em vez de criar outro.
Pular este passo já levou um Claude a tentar recriar uma campanha que estava ENABLED e gastando. Não pule.
Conta e estratégia de lance
- Conta de operação:
customer_id: 4342319594 (Blog B2 Tech, BRL). Passe customer_id explicitamente sempre. A 1720061401 é manager/restrita — não veicule nela.
- Default do produto:
TARGET_SPEND. Se o Bruno pedir outra coisa: max conversões → MAXIMIZE_CONVERSIONS · max valor de conversão → MAXIMIZE_CONVERSION_VALUE · CPC manual → MANUAL_CPC.
Fluxo completo (ordem obrigatória)
Caminho A — create_search_campaign (all-in-one, preferido)
Monta budget → campaign → ad group → targeting → keywords → RSA numa chamada. Use a copy de references/copy-ccaf-prep.md: campaign_name (com data+hora), ad_group_name (ex: CCA-F Prep - Certificação), budget_amount: 20, final_urls: ["https://claudeprep.io/"], headlines (15), descriptions (4), keywords (PHRASE), geo_target_ids: ["2076"], path1: "cca-f", path2: "prep". Rode em preview: true, depois preview: false.
⚠️ Workaround — bug no passo campaign
Há histórico do passo campaign falhar com "The required field was not present." (erro genérico da Google Ads API, não nomeia o campo; independe da bidding_strategy). Quando ocorre:
- O orçamento já foi criado e retorna em
completed[] — anote o resource_name.
- Não recrie o orçamento. Vá para o Caminho B reaproveitando esse budget.
- Se o
create_campaign standalone também falhar igual, é bug do wrapper (campo obrigatório omitido na mutation). Reporte ao Bruno com o request_id para corrigir o servidor; depois retome do passo que falhou.
Caminho B — funil manual (retry/controle)
Cada passo retorna o resource_name que alimenta o próximo:
create_campaign_budget → campaignBudgets/{id}
create_campaign (budget_resource_name) → campaigns/{id}
create_ad_group (campaign_resource_name) → adGroups/{id}
create_responsive_search_ad (ad_group_resource_name + copy + paths)
add_keywords (ad_group_resource_name, match_type: PHRASE)
Extensões — após o funil
create_sitelinks (campaign_resource_name, lista de references/copy-ccaf-prep.md) — cria e linka numa chamada. Preview primeiro.
create_callouts (campaign_resource_name, lista) — idem.
Assets ficam a nível de campanha (campaignAssets), valem para todos os ad groups. Não-atômicos: se o link falhar, os assets voltam no retorno e são reutilizáveis.
Negativas — obrigatórias neste produto
O termo "cca-f"/"certificação claude" atrai busca informacional e caçador de material grátis. Após o funil, aplique add_negative_keywords a nível de campanha com a lista de negativas da copy (grátis, download, dumps, etc.). Se a tool não estiver exposta na versão corrente do MCP, avise o Bruno para aplicar no Ads Manager — deixe registrado no quadro final como item em aberto.
Geo e ativação
add_geo_targeting (campaign_resource_name, ["2076"]). Sem geo a campanha roda global e queima os R$ 20 com clique internacional — sempre trave Brasil. Pode aplicar com a campanha já ativa.
- (Opcional)
add_age_targeting no ad group.
- Ativação — só após confirmação. Os três níveis nascem PAUSED:
update_campaign_status (active, confirm: true)
update_ad_group_status (active, confirm: true)
update_ad_status (ad_group_id + ad_id, active, confirm: true)
Limites de caractere (respeite ou toma erro de validação)
| Asset | Campo | Limite |
|---|
| RSA | headline | ≤ 30 char (3–15 títulos) |
| RSA | description | ≤ 90 char (2–4 descrições) |
| Sitelink | text | ≤ 25 char |
| Sitelink | description1/description2 | ≤ 35 char cada — both-or-neither |
| Callout | frase | ≤ 25 char (até 20) |
| Ad path | path1/path2 | ≤ 15 char cada |
Acento conta como 1 caractere. A copy do produto já foi conferida contra esses limites — se editar qualquer asset, reconfira. Na dúvida, o preview confirma.
DKI — já embutida na copy
A copy validada usa 3 headlines com Inserção Dinâmica de Palavra-chave: {KeyWord:Simulado CCA-F}, {KeyWord:Certificação Claude} e {KeyWord:Curso CCA-F Prep}. Regras se for mexer:
- Texto padrão (depois dos
:) ≤ 30 char — é o fallback quando a keyword não cabe.
{KeyWord:...} = Title Case, padrão para headlines. Em descrição use {Keyword:...} (sentence case).
- O ad group é temático (certificação CCA-F), então a inserção lê gramaticalmente. Se criar ad group novo com keywords de outro tema, revise se as DKI ainda fazem sentido.
- Nunca use DKI em todos os títulos — o RSA precisa de fixos de marca/oferta.
Pesquisa de keywords (generate_keyword_ideas)
A lista base está na copy. Para expandir/dimensionar:
- Sem paginação — controle por
limit (máx 1000).
- Use
geo_target_ids: ["2076"] + language_id: "1014".
- Multi-seed cirúrgico > seed amplo. Seeds bons para este produto: "certificação claude", "claude certified architect", "simulado cca-f", "certificação anthropic", "certificação de ia". Evite seeds genéricos ("inteligência artificial") — devolvem ruído informacional e CPC altíssimo.
- Sempre cheque o lance de topo antes de adotar keyword nova: termo caro zera R$ 20/dia num clique.
- Nicho pequeno (menos de 100 certificados no BR): volumes baixos são esperados. Não infle a lista com termo genérico de IA só para ter volume — melhor pouco tráfego qualificado do que budget queimado.
Fechamento
Termine sempre com um quadro do estado (campanha/RSA/keywords/sitelinks/callouts/negativas/geo + status). Lembre que os assets passam por revisão do Google (algumas horas) antes de servir — e que termos de marca de terceiros podem levar a revisão manual. Aponte itens em aberto (geo não travado, negativas pendentes, etc.). Nunca ative sem confirmação explícita.