Install
openclaw skills install @rafacpti23/meta-ads-subagentSubagente autônomo especialista em Meta Ads. Cria campanhas completas via MCP (Super Prompt), gera criativos com IA, monitora métricas (CPA/ROAS/CTR), executa otimizações, pausa anúncios ruins e alerta via Papi. Suporta multi-contas de anúncios.
openclaw skills install @rafacpti23/meta-ads-subagentDesenvolvido por / Créditos: Rafa Martins (rafacpti@gmail.com)
Ao executar a skill pela primeira vez ou ao configurar um novo ambiente:
export HABILIS_API_KEY="hab_live_..."ads_management (reside estritamente no seu ambiente local).export META_ACCESS_TOKEN="EAA..."META_AD_ACCOUNT_ID):
act_<NUMERO_DA_CONTA> (ex: act_1234567890).hermes run "mcp_meta_ads_get_ad_account(ad_account_id='act_...')"
Nas auditorias periódicas e rotinas de monitoramento autônomo (via Cron ou sob demanda), o agente deve executar o seguinte checklist de governança integrada:
Auditoria Financeira & Spend Cap:
amount_spent, spend_cap e balance da conta de anúncios.spend_cap - amount_spent).Validação de Destinos & Integridade de Landing Pages:
link_data / video_data) de todos os criativos e anúncios ativos.200 OK e ausência de erros 404/500 ou quebras de UTM).Governança de Performance & Stop-Loss:
Triagem Inbound & Integração CRM (GHL/PAPI):
Formatação do Relatório Executivo (Telegram/Canal):
💡 DIRETRIZ OBRIGATÓRIA PARA A IA / ASSISTENTE: Ao iniciar o uso desta skill ou se as credenciais do Meta Ads estiverem ausentes no ambiente local:
- NÃO trave a conversa com erros de autenticação da Graph API.
- Inicie imediatamente um diálogo de Onboarding Intuitivo, amigável e guiado.
- Solicite os dados essenciais, explicando passo a passo onde o usuário os encontra na Meta.
- Execute uma validação automática da conta (Health Check) usando a tool
mcp_meta_ads_get_ad_accountpara confirmar que o token está ativo e o ID da conta é válido.
META_ACCESS_TOKEN / Token do Sistema (Obrigatório):
ads_management, ads_read, pages_show_list.META_AD_ACCOUNT_ID (Obrigatório):
act_1234567890 (ou apenas os números).META_PAGE_ID (Necessário para criação de anúncios):
META_PIXEL_ID (Para campanhas de Vendas/Conversão):
👋 Olá! Bem-vindo ao Gestor Autônomo de Meta Ads!
Para começarmos a gerenciar suas campanhas, criativos e otimizações, só preciso que você me informe 2 dados básicos da sua conta Meta:
1️⃣ Seu Token de Acesso da Meta (`META_ACCESS_TOKEN`)
2️⃣ O ID da sua Conta de Anúncios (`META_AD_ACCOUNT_ID`, ex: `act_327126129438619`)
👉 Como prefere configurar?
• Pode colar os dados diretamente aqui no chat que eu salvo e valido para você.
• Ou você pode salvar no seu arquivo `.env` local (`/root/.hermes/metaads/.env`).
Assim que o cliente fornecer as informações, chame mcp_meta_ads_get_ad_account(ad_account_id=...):
references/audit_playbook.md para rotina detalhada de checagem de saldo, integridade de LPs e métricas de leilão.references/naming_conventions_and_briefing_standards.md para taxonomia oficial de campanhas ([TAG] {NUM} [{OBJ}] {ESTR}_{ORÇ}_[{OFERTA}] – {DATA}), conjuntos ({CAMP}.{SUB}_[{POS}]_({GENERO}_{IDADE})_{INTERESSES}_{GEO}_{DATA}) e anúncios ({CAMP}.{SUB}.{NUM_ANUNCIO}_{CRIATIVO}_{DATA}), além da metodologia de teste isolado 10x10.references/habilis_saas_architecture_and_zero_storage.md para governança do produto SaaS comercial (/home/orca/orca/habilis), separação estrita de escopo em relação a skills locais, e garantia in-memory de credenciais do cliente.scripts/audit_account.py para script de probe de integridade de conta e anúncios.OUTCOME_SALES com promoted_object: {"pixel_id": "<PIXEL_ID>", "custom_event_type": "PURCHASE"} e optimization_goal: OFFSITE_CONVERSIONS), nunca tráfego de cliques (OUTCOME_TRAFFIC / LINK_CLICKS).OUTCOME_SALES sem orçamento a nível de campanha (ABO), envie explicitamente is_adset_budget_sharing_enabled=false.bid_strategy=LOWEST_COST_WITHOUT_CAP para evitar a exigência de bid_amount.regional_regulated_categories=["BRAZIL_REGULATION","VOLUNTARY_VERIFICATION"]regional_regulation_identities={"universal_beneficiary":"<BM_ID>","universal_payer":"<BM_ID>"}update_ad) em tokens de usuário sofrem throttle de 1 requisição a cada 30 segundos. Para operações manuais, respeite um delay de 31s entre chamadas ou utilize endpoints em lote (batch).[CAMPANHA].[SUB]_[CRIATIVO]_[AUDIENCE]_[DATA]). Consulte references/naming_conventions_and_briefing_standards.md.status="PAUSED" para validação do gestor antes de ativar a veiculação.references/naming_conventions_and_briefing_standards.md para a taxonomia e metodologia de teste:
[TAG] {NUM} [{OBJETIVO}] {ESTRUTURA}_{ORCAMENTO}_[{OFERTA}] – {DATA} (ex: [START] 001 [ENG-MSG] 1-1-1_CBO_[ONETIME] – 16.06.26){CAMPANHA}.{SUB}_[{POS}]_({GENERO}_{IDADE})_{INTERESSES}_{GEO}_{DATA} (ex: 001.01_[AUTO]_H-M_20-55_Devs-Software_BR_08.09.26 ou 001.02_[IG]_H_25-45_Marketing-Ecom_SP_16.06.26)Ad{NUM} - {HEADLINE} | {PREÇO} | {COR/VARIAÇÃO} (ex: Ad01 - WhatsApp API Oficial | R$ 14,90 | Amarelo e Ad02 - WhatsApp API Oficial | R$ 14,90 | Azul / V2). Prefixo colado sem espaço (Ad01, Ad02, Ad03...); numeração estritamente única e sequencial para todos os anúncios, sem repetir o prefixo (a versão 2 do Ad01 vira Ad02); extrair headline do criativo/vídeo, preço e cor/variação de forma legível e objetiva. Apresentar proposta antes de alterar na API.[AUTO], [FB/IG], [IG], [FB]), Gênero/Idade (H-M_20-55, H_25-50), Máximo 2 interesses no nome para manter clareza, Localização (BR, SP, POA, etc.) e Data.references/visual_creative_framework.md para a estrutura completa de criativos B2B/SaaS no padrão Cliente falando ➔ IA processando ➔ Empresa faturando ($) renderizados via Chrome Headless / Playwright (1080x1080).references/funnel_and_conversion_troubleshooting.md para auditoria de gargalos de conversão (aba incorreta em /auth, fricção de CPF/CNPJ, cadastro embutido on-page e templates de relatórios PAPI WhatsApp).adcreative com link_data, certifique-se de que link e call_to_action.value.link apontem para a URL exata do destino externo (site/landing page), evitando que a Meta reclame de inconsistência ou formato de payload.is_prepay_account: true), o Graph API rejeita qualquer alteração de spend_cap (POST /act_<ID> {"spend_cap": ...}). O limite de veiculação é o próprio saldo pré-pago recarregado. Para desbloquear/aumentar entregas, oriente o usuário a recarregar saldo via PIX/Cartão diretamente pelo Billing Hub (https://adsmanager.facebook.com/billing_hub/payment_settings?act=<ID>).
rejeições em conjuntos com otimização LINK_CLICKS.is_prepay_account: true via PIX/Boleto/Crédito pré-pago), a API rejeita alterações manuais no campo spend_cap com o erro "Alteração inválida para uma conta pré-paga" (OAuthException 100 / subcode 1487840). O limite máximo de veiculação é rigorosamente vinculado ao saldo de fundos adicionados (funding_source_details). Para liberar veiculação adicional, os fundos devem ser recarregados no Gerenciador de Cobrança / Billing Hub da Meta.adcreatives e adicione novos ads ativos dentro do mesmo conjunto de anúncios (ABO) em vez de sobrescrever o criativo original imediatamente. Isso permite que o algoritmo da Meta distribua impressões para a melhor copy sem perder o histórico do aprendizado.references/page_identity_and_branding.md — CONFIRME a page_id com o usuário antes de gerar criativos (nunca aceite a Page default da API).references/funnel_checkout_optimization.md para diretrizes de redução de fricção pós-clique, adaptação dinâmica de formulários por DDI internacional e deep linking direto na aba de cadastro (signup).references/funnel_audit_and_billing_troubleshooting.md para resolução do erro de restrição em contas pré-pagas (saldo R$ 0,00), diagnóstico de conversão pós-clique e critérios de expansão LATAM.references/meta_api_compliance_and_billing.md para resolver erros de compliance_section / anunciante ausente (passando regional_regulation_identities com universal_beneficiary e universal_payer numéricos) e tratar falsos positivos de restrição em contas pré-pagas com saldo zerado.references/auth_and_api_troubleshooting.md (Seção 3) quando o app mobile travar na tela "Restrição da conta de anúncio" — em contas pré-pagas com saldo zerado, a Meta bloqueia recargas in-app; a solução é enviar o link web direto de cobrança (/billing_hub/payment_settings?act=<id>).references/asset_provenance_audit.md. NUNCA deduza a origem de um ativo desconhecido — varra a Graph API em todas as contas do token via scripts/meta_asset_provenance_sweep.py E faça grep nos outputs/prompts do cron.references/meta_ads_audit_and_lp_monitoring.md e references/unanswered_leads_triaging_patterns.md para o protocolo de inspeção periódica de métricas (last_7d), verificação de Account Spend Cap (teto da conta), diagnóstico de Delivery Skew (vício de entrega entre anúncios), regras de stop-loss (+30% CPA/CPC), teste HTTP/latência de landing pages, triagem/priorização de conversas inbound no CRM (GHL) e formatação executiva (≤3.000 caracteres) para Telegram.references/creative_url_swapping_and_pricing_strategy.md para o procedimento de contornar a imutabilidade de adcreative na Graph API e governança de descontos conversacionais (1-on-1 no WhatsApp) para produtos low-ticket.adcreative com object_story_spec vinculando a uma Facebook Page, o Meta Ads valida automaticamente permissões de posicionamento no Instagram. Se a conta de anúncios não tiver acesso direto à conta de Instagram vinculada à página ou omitir instagram_user_id, a API retornará OAuthException code 200 (error_subcode 1815199: "A conta de anúncios não tem acesso à conta do Instagram"). Para solucionar:
GET /act_<AD_ACCOUNT_ID>/instagram_accounts.instagram_user_id correspondente (ou utilize o PBIA / Page-Backed Instagram Account com GET /<PAGE_ID>/page_backed_instagram_accounts) dentro do object_story_spec para autorizar a entrega multiplataforma.references/landing_page_traffic_readiness.md — antes de direcionar tráfego pago, valide o alinhamento mensagem/preço (message match), prova interativa (demos de voz/chat), parâmetros de checkout (/auth?plan=...) e presença do Meta Pixel ativo.references/landing_page_conversion_protocol.md — NUNCA alterar ou publicar modificações em Landing Pages sem apresentar o diagnóstico, cópia e componentes para validação prévia explícita do usuário. Garanta alinhamento de mensagem (Message Match) entre o gancho do anúncio (ex: IA de Voz a R$ 49,90) e a 1ª dobra da LP (players de áudio interativos e precificação visível).me/accounts + BM/owned_pages, os limites do System User token (rename/foto/bio de Page = erro #283/#3, sempre trabalho manual do usuário), o kit de entrega (avatar 800x800 + capa 1640x924 + tabela de campos + bio copiável) e como trocar a identidade de anúncios já criados sem recriar a campanha. Templates: templates/fb_page_avatar.html, templates/fb_page_cover.html.references/meta_pixel_and_billing_management.md para o ciclo completo de criação do Pixel via API, injeção em SPAs (React/Vite/Next.js), auditoria de saldo pré-pago e resolução da armadilha do limite de gastos (Spend Cap).PAUSED para revisão visual e conferência de ativos antes da ativação.fields em mcp_meta_ads_get_ad_account (Erro 100 business_management) e Verificação de Spend Cap:
mcp_meta_ads_get_ad_account sem o parâmetro fields requisita campos padrão que exigem permissão de administrador de negócios ((#100) Requires business_management permission to access the field).fields="id,name,account_status,amount_spent,spend_cap,balance,currency,disable_reason,min_daily_budget".amount_spent >= spend_cap ou margem restante < R$ 50,00): Quando o gasto acumulado atinge o teto da conta (spend_cap), o Meta Ads cessa silenciosamente a entrega de todos os anúncios da conta, mantendo o status ACTIVE mas com 0 impressões novas. Calcule a margem restante (spend_cap - amount_spent); se a margem for baixa (ex: < R$ 50,00) ou esgotada, reporte como alerta de severidade máxima no topo do relatório para evitar interrupção iminente de tráfego./ads no Ad Account vs Campaign): Ao consultar anúncios via chamadas diretas REST na Graph API v21.0, a rota GET /{campaign_id}/ads pode retornar {"data": []} em determinadas configurações de conta/token. Utilize sempre a rota da conta de anúncios GET /act_{AD_ACCOUNT_ID}/ads?fields=id,name,status,effective_status,adset_id,campaign_id,creative... ou o endpoint MCP mcp_meta_ads_list_ads com ad_account_id para mapeamento confiável de todos os anúncios.Campo is_adset_budget_sharing_enabled (ABO vs CBO):
Campo is_adset_budget_sharing_enabled (ABO vs CBO):
is_adset_budget_sharing_enabled: False (ou True). Caso omitido, a API retorna erro OAuthException code 100 (error_subcode 4834011).Flag targeting_automation e advantage_audience:
targeting_automation: {'advantage_audience': 1} (ou 0).advantage_audience: 1 estiver habilitado, o campo age_max NÃO pode ser menor que 65 anos (retorna erro subcode 1870189). Defina apenas age_min ou mantenha age_max: 65.bid_amount Obrigatório em Otimização de Cliques/Tráfego:
optimization_goal: 'LINK_CLICKS', forneça bid_amount em centavos (ex: 150 para R$ 1,50) para evitar o erro subcode 2490487.Anúncios Híbridos: Site vs WhatsApp Direto (wa.me):
call_to_action: {'type': 'LEARN_MORE', 'value': {'link': 'https://...'}}.call_to_action: {'type': 'CONTACT_US', 'value': {'link': 'https://wa.me/55...?'}} com texto codificado em URL (?text=...) para pré-carregar a mensagem do lead. consolidar 100% da verba em 1 único conjunto de anúncios forte rodando 2 a 3 criativos em paralelo por 5 a 7 dias.Exclusão de Dados no GHL ou Meta: É estritamente PROIBIDO deletar campanhas, contatos ou dados sem validação humana manual prévia.
Resiliência e Fallback de Ferramentas: Em caso de oscilação ou manutenção no MCP, utilizar queries diretas ou rotas alternativas conforme diretrizes de fallback.
Gestão de Token e Processos MCP:
OAuthException 190 / subcode 463 indica token expirado.~/.hermes/.env (hermes config set META_ACCESS_TOKEN <token>) e ~/.hermes/config.yaml em mcp_servers.meta-ads.env.META_ACCESS_TOKEN.pkill -f mcp-meta-ads para encerrar workers antigos e permitir que o Hermes instancie processos com o novo token.OAuthException 190 ou erro de autenticação, emitir alerta de necessidade de renovação de credencial.TTP e GHL). Não travar a execução.Execução Segura em Cron Jobs: Em execuções via Cron, evitar comandos com pipes para interpretadores (cat | python3) ou execute_code (bloqueado sem aprovação interativa). Utilize scripts auxiliares gravados em arquivo ou comandos diretos.
mcp_meta_ads_get_ad_account passando fields="id,name,account_status,amount_spent,spend_cap,balance,currency,disable_reason,min_daily_budget" para evitar erro de permissão business_management do default) e limites (mcp_meta_ads_get_ads_volume) para verificar status da conta, spend cap, saldo disponível e limite de anúncios ativos.mcp_meta_ads_list_campaigns).mcp_meta_ads_list_ads), mapeando a hierarquia (Campanha -> Conjunto de Anúncios -> Anúncio).WITH_ISSUES de código 1870250).mcp_meta_ads_list_creatives.link_data.link, website_url) e links embutidos em formato de texto no campo body (como URLs de WhatsApp, YouTube ou encurtadores/afiliados).curl -sIL -o /dev/null -w "%{http_code} %{url_effective}\n" <URL>mcp_meta_ads_get_campaign_insights e mcp_meta_ads_get_ad_insights nos últimos 7 dias (last_7d). Nota: Mesmo quando amount_spent >= spend_cap, consulte o período (last_7d) para auditar o desempenho prévio e identificar Delivery Skew / CTR dos criativos.{"data": []} em campanhas pausadas sem histórico recente como ausência de gasto.mcp_meta_ads_update_ad).meta-ads-copywriter para criar 3 variações novas.ghl_client.py --action notify_manager.ghl-integration), executar ghl_client.py --action unanswered para obter leads sem resposta.id = Conversation ID, NÃO Contact ID. Para obter o contactId (necessário para send_msg, movimentação de pipeline, etc.), é preciso fazer uma chamada raw à API GHL /conversations/search e extrair o campo contactId de cada conversa. Veja pitfall #1 do ghl-integration.references/unanswered_leads_triaging_patterns.md do ghl-integration.Bloqueio de Python Scripts (execute_code) no Cron:
Quando executado como cron job agendado, a ferramenta execute_code é desabilitada por motivos de segurança. Nunca use scripts Python para fazer query ou chamadas em lote nas APIs; utilize chamadas diretas aos endpoints do MCP correspondentes.
Erros de Validação da API do Meta (HTTP 400 / Código 3907143 e 1991005):
Ao tentar atualizar anúncios antigos ou com erros no criativo/mídia (por exemplo, erros do tipo "Sua mídia é inválida" - Código 3907143, ou "A edição de posts turbinados somente é permitida no app do Instagram" - Código 1991005 / HTTP 400 Code 10), a API do Meta pode rejeitar a alteração de status (PAUSED/ACTIVE) no nível do anúncio ou adset.
campaign) correspondente.mcp_meta_ads_update_campaign.Erros de Configuração de Público / Direcionamento Detalhado Descontinuado (Código 1870250):
effective_status: WITH_ISSUES e error_code: 1870250 ("Este conjunto de anúncios não está sendo veiculado porque usa opções de direcionamento detalhado que foram combinadas. Edite seu público...").Insights Vazios para Campanhas Inativas:
mcp_meta_ads_get_campaign_insights, se a campanha permaneceu pausada no período (e.g. last_7d), o retorno de insights será {"data": []}. Tratar isso como ausência de veiculação/gasto e não como erro de API.Extração e Verificação de Destinos (Landing Pages/WhatsApp):
asset_feed_spec.link_urls (chave website_url) ou varrendo o texto do body para URLs (como YouTube, links de afiliados ou APIs do WhatsApp).
jq:jq -r '.result | fromjson | .data[] | [.id, .name, .body, (.object_story_spec.link_data.link? // .asset_feed_spec.link_urls[0].website_url? // .object_story_spec.video_data.call_to_action.value.link?)] | @tsv' /tmp/hermes-results/<CALL_ID>.txt
jq:jq -r '.result | fromjson | .data[] | select(.id == "ID_1" or .id == "ID_2")' /tmp/hermes-results/<CALL_ID>.txt
Filename dinâmico:
/tmp/hermes-results/<CALL_ID>.txtmuda a cada chamada — use o path retornado pelo tool result.
curl -sIL -o /dev/null -w "%{http_code} %{url_effective}\n" <URL>
references/landing_page_audit.md.Processamento de Retornos Grandes de Criativos (JSON volumoso):
mcp_meta_ads_list_creatives pode retornar dados enormes (100KB+), fazendo com que o agente salve o resultado em /tmp/hermes-results/xxxx.txt.jq via terminal para extrair de forma cirúrgica e performática os atributos necessários (como id, name, body, asset_feed_spec.link_urls[].website_url).body: Criativos com links de afiliados ou YouTube costumam ter o URL embutido no campo body (texto livre) ao invés do campo estruturado. Varra o campo body via jq para não deixar passar destinos indiretos:
jq -r '.result | fromjson | .data[] | select(.body != null) | [.id, .name, .body] | @tsv' /tmp/hermes-results/<CALL_ID>.txt
link_data e asset_feed_spec, anúncios de vídeo expõem a URL de destino sob object_story_spec.video_data.call_to_action.value.link. Incluir esse caminho no jq de extração:
jq -r '.result | fromjson | .data[] | {id, name, link: (.object_story_spec.link_data.link // .asset_feed_spec.link_urls[0].website_url // .object_story_spec.video_data.call_to_action.value.link), body: (.body // .object_story_spec.link_data.message // .object_story_spec.video_data.message)}' /tmp/hermes-results/<CALL_ID>.txt
/tmp/hermes-results/call_NNNNN.txt) muda a cada invocação MCP. Use o path retornado pelo tool result ao invés de hardcodar o nome do arquivo.Teste de Landing Pages em Lote (curl multi-URL):
curl -sIL aceita múltiplas URLs em sequência na mesma chamada de terminal. Use para testar vários destinos de uma vez:
curl -sIL -o /dev/null -w "%{http_code} %{url_effective}\n" "https://url1" "https://url2" "https://url3"
anrdoezrs.net, kqzyfj.com) são legítimos se o destino final retorna 200. Documentar o domínio final na auditoria para referência.Diagnóstico de Painel Web/Dashboard e Conexão de Gateway:
http://<server-ip>/metaads.html). Para HTTPS, utilize o domínio configurado (https://xvix.com.br).papi_disconnected / instância inativa). A solução exige releitura do QR Code no painel Papi.