Mise en place — Growth Pipeline completo (CertaDoc demo 28/04)¶
ARQUIVO HISTORICO / LEGADO. Preservado como memoria tecnica; nao descreve o runtime atual e nao deve ser usado como runbook operacional.
Data: 2026-04-25 Demo: 2026-04-28 (Fabiano / CertaDoc) tenant_id CertaDoc: 3cbbe352-8b4e-4195-ab61-10640f6a19b6
Estado atual do tenant_config (CertaDoc)¶
| Campo | Estado |
|---|---|
location_id | Ov0Pu1lmMAajPgBS2uei ✅ |
blog.vercel_url | https://cadencia-blog-certadoc.vercel.app ✅ |
seinfeld_workflow_id | criado no GHL mas ID não salvo ❌ |
newsletter_workflow_id | criado no GHL mas ID não salvo ❌ |
api_key | ausente ❌ |
user_id | ausente ❌ |
linkedin_account_id | ausente ❌ |
pipeline_id | não criado ❌ |
score_field_id | ausente ❌ |
PRÉ-VÔOO — Felipe faz antes de começar (manual no GHL)¶
Tudo que requer acesso ao painel GHL da sub-conta CertaDoc:
PV-1 — Buscar API key da sub-conta CertaDoc¶
No GHL Agency > Settings > Locations > CertaDoc > API Key (ou Private Integrations). Copiar a API key da sub-conta (location token, não o agency token).
PV-2 — Buscar user_id do usuário da sub-conta¶
No GHL: Settings > My Staff > CertaDoc user > copiar o ID da URL ou via API: GET /users/search?locationId=Ov0Pu1lmMAajPgBS2uei
PV-3 — Pegar os IDs dos workflows criados¶
No GHL: Automation > Workflows > Seinfeld Daily + Newsletter Weekly. Abrir cada um e copiar o ID da URL (formato: workflow/{ID}).
PV-4 — Buscar linkedin_account_id¶
No GHL: Marketing > Social Planner > Accounts > LinkedIn conectado. O accountId aparece na URL ou via: GET /social-media-posting/accounts?locationId=Ov0Pu1lmMAajPgBS2uei (se existir)
PV-5 — Criar pipeline de oportunidades no GHL¶
No GHL: CRM > Pipelines > Create Pipeline. Nome: "Nutrição CertaDoc" Stages: "Aquecendo" | "Quente" | "Hot DFY" Salvar e copiar o pipeline_id da URL.
PV-6 — Verificar/criar custom field score_ia no GHL¶
No GHL: Settings > Custom Fields > "score_ia" (tipo: Number). Se não existir, criar. Copiar o field_id.
BATCHES DE IMPLEMENTAÇÃO¶
BATCH 0 — Salvar credenciais GHL no tenant_config (5 min)¶
Depende de: PV-1 a PV-6 concluídos Executor: Claude (código)
Atualizar tenant_config.config.ghl no Supabase via REST API com todos os IDs coletados no pré-vôo.
# Script a executar após Felipe fornecer os IDs
config_patch = {
"ghl": {
"api_key": "<PV-1>",
"location_id": "Ov0Pu1lmMAajPgBS2uei",
"user_id": "<PV-2>",
"seinfeld_workflow_id": "<PV-3a>",
"newsletter_workflow_id": "<PV-3b>",
"linkedin_account_id": "<PV-4>",
"pipeline_id": "<PV-5>",
"score_field_id": "<PV-6>"
}
}
Verificação: Re-ler o tenant_config e confirmar todos os campos preenchidos.
BATCH 1 — Correções no pipeline VPS (30 min)¶
Depende de: BATCH 0 Executor: Claude (VPS via SSH)
1.1 — seinfeld_generate.py: tratar HTTP 422 como sucesso
# Anti-duplicata: se contato já está no workflow → não é erro
if resp_code == 422:
print(f" INFO: contact {cid} already in workflow (422) — treating as success")
ok += 1
continue
1.2 — newsletter_generate.py: anti-duplicata com last_newsletter_date
# Antes de enrolar: checar last_newsletter_date no contato
# Após enrolar com sucesso: gravar today no campo
# 422 → tratar como sucesso
1.3 — Corrigir crontab newsletter: 15 UTC → 18 UTC (15h BRT)
Verificação: Rodar seinfeld_generate.py <tenant_id> --dry-run e confirmar que não quebra.
BATCH 2 — Migration linkedin_scheduled_at (10 min)¶
Depende de: independente Executor: Claude (Supabase Management API)
Verificação: Confirmar coluna no schema via REST API.
BATCH 3 — linkedin_generate.py: agendamento automático (45 min)¶
Depende de: BATCH 0, BATCH 2 Executor: Claude (VPS via SSH)
Implementar find_available_slot(): 1. Âncora no banco (linkedin_scheduled_at mais recente do tenant) 2. Confirmar com GHL via POST /social-media-posting/{locationId}/posts/list 3. Avançar dia útil se slot ocupado (máx 7 tentativas) 4. Salvar linkedin_scheduled_at no banco junto com linkedin_sent=true 5. Passar scheduleDate no body GHL (status "scheduled")
Verificação: Rodar linkedin_generate.py <tenant_id> --dry-run e confirmar scheduleDate calculada corretamente.
BATCH 4 — Teste E2E (30 min)¶
Depende de: BATCH 0, 1, 2, 3 Executor: Felipe (manual) + Claude (monitoramento logs)
- Login CertaDoc →
/app/ideas - Aprovar ideia com todos os canais
- Acompanhar logs VPS: trigger_server + blog_generate
- Verificar
/app→ carrossel gerado ✅ - Verificar
/app/growth/nutricao→ email pendente aparece (seinfeld_sent=false → conteúdo gerado) - Verificar
/app/growth/calendario→ linkedin agendado aparece - Aguardar próximo cron (11h BRT) ou rodar manualmente:
ssh root@72.60.4.71 "python3 /cadencia/pipeline/seinfeld_generate.py 3cbbe352-8b4e-4195-ab61-10640f6a19b6" - Confirmar email enviado no GHL
BATCH 5 — Carrossel → GHL Social Planner (60-90 min)¶
Depende de: BATCH 0 Executor: Claude (VPS growth + workers Coolify VPS Master) Prioridade: pós-demo se apertar o tempo
Ao gerar carrossel, enviar PNGs automaticamente para o Social Planner do Instagram:
- No orchestrator (Coolify VPS Master): após render, chamar
/api/v1/carrossel/schedule-socialpassandodoc_id+tenant_id - No endpoint: download PNGs do Supabase → upload para GHL Media Library (zero-fill nos nomes) → criar post com
accountIds=[instagram_account_id] scheduleDateviafind_available_slot()reutilizando mesma lógica do LinkedIn
⚠️ Atenção: os workers Coolify VPS Master (cadencia-workers/src/) são gerenciados por outro agente. Verificar antes de modificar. (Railway DESLIGADO, DEV-638.)
BATCH 6 — Lead scoring completo (pós-demo)¶
Depende de: BATCH 0 Executor: Claude
- Migration
scoring_eventsno Supabase webhook_handler.py: adicionar endpointsnewsletter-abertaenewsletter-clicadawebhook_handler.py:mover_pipelinemulti-tenant (buscarpipeline_iddotenant_config)inatividade_job.py: adaptar para multi-tenant
ORDEM DE EXECUÇÃO RECOMENDADA¶
Felipe faz PV-1 a PV-6 (manual)
│
▼
BATCH 0 — salvar credenciais (Claude, 5 min)
│
┌────┴────┐
▼ ▼
BATCH 1 BATCH 2
(VPS fix) (migration)
│ │
└────┬────┘
▼
BATCH 3
(linkedin agenda)
│
▼
BATCH 4
(E2E test)
│
▼
BATCH 5 (se sobrar tempo antes da demo)
BATCH 6 (pós-demo)
CHECKLIST PRÉ-DEMO (28/04)¶
- [ ] PV-1 a PV-6 concluídos (Felipe)
- [ ] BATCH 0: tenant_config com todos os IDs GHL
- [ ] BATCH 1: 422 tratado, newsletter anti-duplicata, crontab 18h UTC
- [ ] BATCH 2: coluna
linkedin_scheduled_atcriada - [ ] BATCH 3:
linkedin_generate.pycom agendamento automático - [ ] BATCH 4: E2E testado — carrossel ✅, email gerado ✅, LinkedIn agendado ✅
- [ ]
growth_onboarding_shownresetado para false (para demo mostrar o modal)