← story.propek
STORY 20.4
Criação Automática de Campanha via Meta Marketing API
PENDING
ACCEPTANCE CRITERIA (23/23)
Script `squads/traffic-ads/scripts/create-campaign.js` criado
Zero dependências externas (Node.js stdlib only — padrão Epic 18/20)
Cria campanha com objetivo `OUTCOME_ENGAGEMENT` (Click-to-WhatsApp — per @architect contract)
Nome da campanha gerado automaticamente: `{produto}_{data}_{objetivo}` (ex: `ProPreto_2026-03-30_WA`)
Status inicial: `PAUSED` (não ativa automaticamente — requer aprovação manual)
Cria ad set com targeting: broad audience, idades 22-55, Brasil
Ativa Advantage+ Audience se disponível na API
Define budget diário recebido via configuração JSON
Bid strategy: `LOWEST_COST_WITHOUT_CAP` (padrão Advantage+)
Cria ads com criativos fornecidos (imagem ou video + copy)
Aceita múltiplos criativos (max 5) para teste A/B
Link do ad aponta para WhatsApp Business (`wa.me/55{numero}`)
Script aceita arquivo de configuração `--config caminho/para/config.json`
Schema da configuração documentado em `squads/traffic-ads/data/contracts/create-campaign-schema.md`
Campos obrigatórios: `produto`, `budget_diario`, `criativos[]`, `copy`
Flag `--dry-run` mostra o payload JSON que seria enviado à API sem criar nada
Dry-run valida o schema da configuração e reporta erros
Testes com mock da API Meta em `squads/traffic-ads/tests/create-campaign.test.js`
Cobrir: criação bem-sucedida, dry-run, erro de API, configuração inválida
@cyber-chief security review PASS (2026-03-31, Score 92/100, 0 CRITICAL/HIGH)
Access token lido exclusivamente de `.env` (nunca hardcoded)
Resposta da API (com IDs de campanhas) logada apenas em modo verbose
Credentials não aparecem em stack traces ou logs de erro
TIMELINE
31/03/2026
feat: Epic 20 — Traffic Manager Autonomo, 7 stories, 393+ testes, 4 security gates [Epic 20] [Story 6.1-sales-intelligence-bot]
7a8b92d
ARQUIVOS (3)
squads/traffic-ads/scripts/create-campaign.js Created
squads/traffic-ads/tests/create-campaign.test.js Created
squads/traffic-ads/data/contracts/create-campaign-schema.md Exists