CLAUDE.md — benvox-market-intel
Projeto de inteligência de mercado para o Benvox (CRM com agentes de IA + WhatsApp, multi-tenant). Coleta + análise de concorrentes, palavras-chave, ad copies e landing pages para alimentar campanhas de Google Ads e Meta Ads, e redesenhos das landings por vertical.
Estrutura
src/
lib/semrush.js # cliente HTTP + cache + alias de colunas
lib/analyze.js # helpers de filtro/score
scripts/ # CLIs:
balance.js # mostra saldo Semrush
collect-overview.js # domain_ranks de todos concorrentes (~500 units)
collect-vertical.js # uma vertical por vez (~1.5–3.5k units)
collect-all-verticals.js
collect-competitor.js # um concorrente horizontal (~1.5–4k units)
summarize-vertical.js # gera summary.{json,md}
summarize-competitors.js
normalize-existing.js # aplica aliases em raws antigos
config/
verticals.json # 16 verticais + 14 concorrentes horizontais
data/
cache/ # cache HTTP por hash de params
overview.json # snapshot inicial de todos domínios
verticals/<slug>/ # raw.json + summary.json + summary.md
competitors/<dom>/ # raw.json (organic, paid, copies)
web_research/ # JSONs gerados por subagentes web
reports/
competitors/horizontal-summary.md
competitors/competitive-landscape.md
verticals/ # planos de mídia por vertical
strategy/ # plano consolidado + budget + CAC/LTV
docs/ # este arquivo
Como rodar
node src/scripts/balance.js # saldo
node src/scripts/collect-vertical.js clinicas # uma vertical
node src/scripts/summarize-vertical.js clinicas # gera MD/JSON
node src/scripts/collect-competitor.js kommo.com
Custos Semrush (por linha retornada)
| Tipo | Units/linha |
|---|---|
| domain_ranks | 10 |
| domain_organic / domain_adwords | 10 |
| domain_*_competitors | 40 |
| phrase_this / phrase_kdi | 10 |
| phrase_related / phrase_questions / phrase_fullsearch | 40 |
| phrase_organic / phrase_adwords | 10 |
| backlinks_overview | 40 |
Sempre cap-ar com display_limit em chamadas de phrase_*. O cliente cacheia tudo por hash dos params.
Dependência: chave Semrush em .env
SEMRUSH_API_KEY=...
SEMRUSH_DATABASE=br
Regras
- Não duplicar coleta — o cache em disco impede chamadas repetidas. Apague
data/cache/apenas se a estrutura de aliases mudar. - Para reaplicar aliases em raws já gravados use
normalize-existing.js(não custa unidades). - Todos relatórios em
reports/devem ser gerados a partir dedata/(nunca digitando dados Semrush no Markdown).