CommunityEscrita e Ediçãogithub.com

Insightful-Pipe/brand-voice

Constrói um guia de voz e tom da marca e uma casa de mensagens a partir de seus anúncios do Google Ads, Meta, postagens sociais e conteúdo do site, depois verifica o conteúdo existente em relação a ele. Use quando precisar de um guia de estilo, um framework de mensagens ou uma auditoria de mensagens do site. Não é para escrever novo conteúdo (use copywriting).

O que é brand-voice?

Esta skill analisa o conteúdo existente de marketing e comunicação de uma marca (anúncios do Google Ads e Meta, postagens em redes sociais, páginas do site e dados de pesquisa) para construir automaticamente um guia completo de voz e tom da marca. Ela extrai a personalidade, o tom e o estilo da marca a partir do que já funciona, documentando as escolhas baseadas em dados de desempenho (cliques, conversões, engajamento) e nas palavras dos clientes. Além da criação do guia, a skill oferece um modo de **auditoria de mensagens do site**, que verifica se as páginas principais contam uma história consistente com os anúncios e classifica as correções com base no tráfego. A skill é compatível com plataformas como Google Ads, Facebook/Instagram, LinkedIn, Google Search Console, DataForSEO e Google Analytics. Ela requer a conexão MCP do InsightfulPipe e utiliza chamadas de API específicas para extrair dados brutos, tratando erros e limitações de forma robusta (por exemplo, sites que bloqueiam leitores automatizados). O resultado final é um conjunto de regras de voz, tom e estilo, fundamentado em evidências e pronto para ser usado para garantir consistência em toda a comunicação da marca.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Insightful-Pipe/content-creative-skills/tree/HEAD/skills/brand-voice

Installed? Explore more Escrita e Edição skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Voz da Marca

Um guia de voz construído a partir do que a marca já diz e do que seus clientes já respondem. Voz é a personalidade que permanece a mesma em todos os lugares. Tom é como essa personalidade se ajusta ao momento: um anúncio de pesquisa, um pedido de desculpas, um cliente preocupado escrevendo às 23h. Estilo é o conjunto de pequenas regras que tornam ambos repetíveis. Esta skill documenta todos os três, e fundamenta cada escolha no próprio conteúdo da marca, em seus resultados de clique, nas palavras de seus clientes e nas lacunas que seus concorrentes deixam abertas.

Ela também executa um modo por conta própria: a auditoria de mensagens do site (após a Etapa 7). Esse modo lê as páginas-chave do site juntas e verifica se elas contam uma história consistente com os anúncios, depois classifica as correções por tráfego.

Antes de começar

Você precisa ter o MCP do InsightfulPipe conectado com pelo menos uma fonte do conteúdo original da marca: uma conta de anúncios do Google Ads ou Meta, uma Página do Facebook, Instagram ou uma Página do LinkedIn, ou um site que o DataForSEO possa ler. Sem nenhum deles, use "Sem uma conexão" no final.

  1. Chame query_contexts com request="accounts" para google-ads, facebook-ads, facebook-pages, instagram-profile, linkedin-pages, google-search-console e dataforseo. Anote workspace_id, o brand_id próprio de cada linha (contas de um mesmo negócio podem estar sob marcas diferentes), e o id da conta, página, site ou organização. Em um workspace de agência, pergunte para qual negócio este guia é, e leia apenas as contas desse negócio.
  2. Chame query_contexts com request="actions_details" para cada leitura em "As chamadas" abaixo, e siga as estruturas de corpo que retornar, com as exceções listadas em "Como executar as consultas".
  3. Pergunte ao usuário e use os padrões quando ele não souber:
    • A marca em uma linha: o que ela faz e para quem. Padrão: inferido dos anúncios e páginas; diga que é uma inferência.
    • Conteúdo que eles gostam e conteúdo que parece errado. Dois ou três exemplos de cada, deles ou de qualquer outra pessoa. Opcional, e vale a pena pedir: o que parece errado é tão útil quanto o que parece certo.
    • O que a marca defende e contra o que ela está. Duas ou três crenças que moldam como ela fala, como "as pessoas merecem uma resposta direta". Opcional. Padrão: não fornecido, e os pilares se baseiam apenas nas evidências; diga isso.
    • Concorrentes. Dois a cinco nomes ou domínios. Padrão: os negócios que aparecem no Google para os dois principais temas de pesquisa não-marca da marca (etapa 5).
    • Regras que já existem: um guia de estilo, palavras proibidas, limites legais ou regulatórios sobre alegações (lei, saúde, finanças, álcool). Padrão: nenhum, mas todo superlativo ainda é sinalizado (etapa 6).
    • Para onde o conteúdo vai: os canais que o guia deve cobrir. Padrão: os canais encontrados na etapa 1, mais site e e-mail.

Para uma auditoria de mensagens do site apenas, também consulte google-analytics e crawler na etapa 1, e faça as perguntas do próprio modo (sob "Modo: Auditoria de mensagens do site") em vez da lista acima.

Janela. Anúncios, postagens e termos de pesquisa: os últimos 90 dias completos. Indique as datas no topo do relatório.

Como executar as consultas

Cada leitura passa por query_data com a plataforma nomeada. Esta skill nunca chama execute_action. Regras encontradas em execuções reais:

  • Datas do Google Ads. DURING LAST_90_DAYS é recusado. Use segments.date BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'.
  • Meta Ads recusa campos aninhados. get_ads com creative{title,body} é recusado. Peça o campo creative simples, que retorna o id do criativo, depois leia o texto com get_ad_creatives. Anúncios que foram excluídos ainda aparecem em insights, mas não em get_ads; deixe-os de fora e os conte.
  • Alguns sites recusam leitores automatizados. Na execução de construção, o site do cliente respondeu com 403, e onpage_content_parsing retornou com 0 itens (sem erro). Quando isso acontecer, leia a voz da página a partir dos próprios títulos e snippets do Google das páginas da marca nas pesquisas da etapa 5, peça ao usuário para colar uma ou duas páginas-chave e diga quais você usou.
  • O crawler de SEO pode estar indisponível. Em 2026-10-06 toda ação do crawler retornou Error fetching URL, mesmo em sites de controle. Use DataForSEO para o texto da página e trate content-quality-checker e brand-extractor como extras opcionais. Em 2026-10-30 o crawler estava de volta, e brand-extractor retornou cores, fontes e botões.
  • As bibliotecas de anúncios podem estar indisponíveis. No mesmo dia, google_company_ads e google_search_advertisers retornaram vazios mesmo para anunciantes muito grandes, e facebook_search_companies falhou com uma redefinição de conexão. Anúncios de concorrentes das bibliotecas são não testados na execução de construção; a voz do concorrente vem dos resultados do Google (etapa 5).
  • Páginas do LinkedIn podem precisar de reconexão. Se uma chamada retornar "Please reconnect your LinkedIn Page", pule o LinkedIn, diga isso e continue. A leitura do LinkedIn é não testada até estar conectada.
  • O Search Console limita uma extração apenas de consulta a 1.000 linhas. Isso é suficiente para vocabulário; diga que a lista são as 1.000 principais.
  • DataForSEO custa dinheiro. Use location_code 2840 e language_code en a menos que o público esteja em outro lugar. Mantenha uma execução em 6 chamadas: até 3 leituras de página e 2 ou 3 pesquisas. Leia a página mais visitada primeiro; se ela retornar com 0 itens, o site está recusando leitores, então não pague pelas outras páginas. A auditoria de mensagens do site tem seu próprio orçamento: uma leitura de página por página, declarada antes de ser executada (W1).
  • As chamadas da auditoria de mensagens do site foram testadas em 2026-10-30. get_report do GA4 por landingPage retornou sessões e eventos-chave por página. O search_analytics do Search Console por página e consulta retornou o row_limit completo de 5.000 linhas. As verificações do crawler funcionaram em um site que permite leitores, e brand-extractor retornou os rótulos dos botões. Em um site que recusa leitores automatizados, o crawler não dá erro: meta-tags-checker retorna title_tag_count 0 e headings-checker retorna no_headings. Trate isso como "não foi possível ler", nunca como um título ou H1 ausente. Quando a marca tiver mais de uma conexão DataForSEO, adicione account_id à leitura da página.
  • Espaçamento das chamadas. Não envie mais de uma chamada a cada 2 segundos. Quando uma chamada for recusada com um tempo de re-tentativa, espere esse tempo e tente novamente uma vez.

Se uma chamada falhar, continue. Marque essa fonte como desconhecida, diga qual chamada falhou e por que, e nunca preencha a lacuna com um palpite.

As chamadas

Google Ads: cada título e descrição com seus próprios cliques

{"platform": "google-ads", "action": "gaql", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<CUSTOMER_ID>",
 "query": "SELECT campaign.name, ad_group_ad_asset_view.field_type, ad_group_ad_asset_view.performance_label, asset.text_asset.text, metrics.impressions, metrics.clicks, metrics.conversions FROM ad_group_ad_asset_view WHERE segments.date BETWEEN '<START>' AND '<END>' AND ad_group_ad_asset_view.field_type IN ('HEADLINE', 'DESCRIPTION') AND campaign.status = 'ENABLED' AND ad_group_ad_asset_view.enabled = TRUE AND metrics.impressions > 0 ORDER BY metrics.impressions DESC LIMIT 1000"}

Google Ads: os anúncios e para onde eles enviam as pessoas

{"platform": "google-ads", "action": "gaql", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<CUSTOMER_ID>",
 "query": "SELECT campaign.name, ad_group.name, ad_group_ad.ad.id, ad_group_ad.ad.responsive_search_ad.headlines, ad_group_ad.ad.responsive_search_ad.descriptions, ad_group_ad.ad.final_urls, ad_group_ad.ad_strength, metrics.impressions, metrics.clicks, metrics.conversions FROM ad_group_ad WHERE segments.date BETWEEN '<START>' AND '<END>' AND ad_group_ad.status = 'ENABLED' AND campaign.status = 'ENABLED' AND ad_group_ad.ad.type = 'RESPONSIVE_SEARCH_AD' AND metrics.impressions > 0 ORDER BY metrics.impressions DESC LIMIT 50"}

As URLs finais com mais impressões são as páginas a serem lidas na etapa 1.

Google Ads: o total de impressões e cliques da conta (para informar quanto do relatório de termos de pesquisa cobre)

{"platform": "google-ads", "action": "gaql", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<CUSTOMER_ID>",
 "query": "SELECT metrics.impressions, metrics.clicks FROM customer WHERE segments.date BETWEEN '<START>' AND '<END>'"}

Google Ads: as palavras que os clientes pesquisam

{"platform": "google-ads", "action": "search_terms_report", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<CUSTOMER_ID>", "start_date": "<START>", "end_date": "<END>", "limit": 5000}

Meta Ads: quais anúncios foram veiculados, depois seus textos

{"platform": "facebook-ads", "action": "get_insights_adaccount", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "ad_account_id": "act_<ID>", "level": "ad", "fields": ["ad_id", "ad_name", "impressions", "inline_link_clicks", "inline_link_click_ctr", "spend"], "time_range": {"since": "<START>", "until": "<END>"}}
{"platform": "facebook-ads", "action": "get_ads", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "ad_account_id": "act_<ID>", "fields": ["id", "name", "status", "creative"]}
{"platform": "facebook-ads", "action": "get_ad_creatives", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "ad_account_id": "act_<ID>", "fields": ["id", "name", "title", "body", "object_story_spec"]}

Combine anúncio → id do criativo → body (texto primário) e title (título). O texto primário também pode estar em object_story_spec.link_data.message.

Postagens da Página do Facebook

{"platform": "facebook-pages", "action": "get_posts", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "page_id": "<PAGE_ID>", "fields": ["id", "message", "created_time", "permalink_url", "status_type", "shares"], "since": "<START>", "until": "<END>", "limit": 50}
{"platform": "facebook-pages", "action": "get_post_insights", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "page_id": "<PAGE_ID>", "post_id": "<POST_ID>", "metrics": ["post_media_view", "post_clicks", "post_reactions_by_type_total"], "period": "lifetime"}

get_posts recusa campos aninhados como likes.summary(true), mesmo que o helper os liste, então essas chamadas não retornam contagens de comentários. shares pode estar ausente de uma postagem (estava ausente em todas as postagens da página lida na execução de construção); conte um campo ausente como 0. Uma chamada de insights por postagem; leia no máximo as 30 postagens mais recentes.

Postagens do Instagram

{"platform": "instagram-profile", "action": "get_media", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<INSTAGRAM_USER_ID>", "fields": "id,caption,media_type,media_product_type,permalink,timestamp,comments_count,like_count", "limit": 50}

Postagens da Página do LinkedIn (não testado até estar conectado)

{"platform": "linkedin-pages", "action": "fetch_organization_posts", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "org_id": "<ORG_ID>", "count": 50}

Search Console: como as pessoas encontram o site

{"platform": "google-search-console", "action": "search_analytics", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "site_url": "<SITE_URL>", "dimensions": ["query"], "start_date": "<START>", "end_date": "<END>", "row_limit": 1000}

Texto da página (DataForSEO, uma chamada paga por página)

{"platform": "dataforseo", "action": "onpage_content_parsing", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "url": "<PAGE_URL>"}

O texto está em page_content.main_topic: cada bloco tem h_title, level e primary_content[].text. Leia a página inicial e a(s) uma ou duas páginas para as quais os anúncios enviam mais pessoas.

Concorrentes e os próprios snippets da marca no Google (DataForSEO, uma chamada paga por pesquisa)

{"platform": "dataforseo", "action": "serp_google_organic", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "keyword": "<TOP_NON_BRAND_THEME>", "location_code": 2840, "language_code": "en", "depth": 20}

Extras opcionais

{"platform": "crawler", "action": "content-quality-checker", "workspace_id": "<WORKSPACE_ID>", "url": "<PAGE_URL>"}
{"platform": "crawler", "action": "brand-extractor", "workspace_id": "<WORKSPACE_ID>", "url": "<HOMEPAGE_URL>"}

content-quality-checker adiciona legibilidade e contagem de palavras; brand-extractor adiciona cores, fontes e botões para uma linha de identidade visual no guia. Anúncios de concorrentes: facebook_search_companies depois facebook_company_ads com o page_id, ou google_company_ads com o domain do concorrente (bibliotecas de anúncios).

Chamadas para a auditoria de mensagens do site

GA4: as páginas em que as visitas começam, com eventos-chave

{"platform": "google-analytics", "action": "get_report", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "property_id": "properties/<PROPERTY_ID>", "dimensions": ["landingPage"], "metrics": ["sessions", "keyEvents"], "start_date": "<START>", "end_date": "<END>"}

Sessões por página de destino são entradas: visitas que começaram nessa página.

Search Console: as consultas com que cada página é encontrada

{"platform": "google-search-console", "action": "search_analytics", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "site_url": "<SITE_URL>", "dimensions": ["page", "query"], "start_date": "<START>", "end_date": "<END>", "row_limit": 5000}

Crawler: título, meta descrição, títulos e rótulos de botões de uma página (sem créditos pagos)

{"platform": "crawler", "action": "meta-tags-checker", "workspace_id": "<WORKSPACE_ID>", "url": "<PAGE_URL>"}
{"platform": "crawler", "action": "headings-checker", "workspace_id": "<WORKSPACE_ID>", "url": "<PAGE_URL>"}
{"platform": "crawler", "action": "brand-extractor", "workspace_id": "<WORKSPACE_ID>", "url": "<PAGE_URL>"}

Os rótulos dos botões estão em brand-extractor's primaryButton.text e buttons[].text. Se ambas as verificações do crawler retornarem vazias (title_tag_count 0 e no_headings), o site recusou o crawler: pegue o título, o título principal e os rótulos do texto da página ou peça uma colagem.

Texto do corpo da página: a chamada onpage_content_parsing do DataForSEO para cada página, como acima.

Habilidades Relacionadas