Webhooks alone miss WooCommerce deals; replace wipe+cap sync with lookback upsert and a dedicated Dokploy cron. Co-authored-by: Cursor <cursoragent@cursor.com>
4.3 KiB
4.3 KiB
Operador marketing@4ventures.es
Estado (2026-09-21)
- Usuario creado en Supabase Auth (
role=admin,tenant_id= 4Ventures Central). - Password local (gitignored):
.ops/marketing-credentials.txt - Login verificado en https://app.4ventures.es/login →
/dashboard/*y/dashboard/agencia sql/creatives.sqlaplicado en prod; RLS activo en tablas de negocio (incl.agent_runs, verificado 2026-09-21)- Re-aplicar RLS
agent_runssi hace falta:sql/agent_runs_rls.sql(idempotente) - Biblioteca de activos (archivos):
sql/asset_files.sql+ bucket privadotenant-assets(máx. 80 MB/archivo). UI:/dashboard/activos. Apply:python3 scripts/dokploy_apply_asset_files.py - Google Drive (agencia):
sql/google_drive.sql. OAuth marketing@ → scopes Drive + Analytics readonly + Search Console. Redirect:https://app.4ventures.es/api/admin/drive/callback. UI: Agencia → Conectar Google. Tras consent: auto-bootstrap (Drive + GA4 + GSC + Google Ads MCC → fichas + sync Orgánico). Repetir: panel 2 → Emparejar todo Google. - Meta (API 4V2030 / system user): pegar token en Agencia → Descubrir ambos. Empareja Meta Ads + páginas Facebook/Instagram a fichas (si el token tiene
pages_show_list/ business). - Cron diario (recomendado): env
CRON_SECRETen Dokploy + schedule:curl -sS -H "Authorization: Bearer $CRON_SECRET" https://app.4ventures.es/api/cron/organic-sync(actualiza últimos 7 días de todos los clientes con GA4/GSC conectados). - Panel control clientes:
sql/agency_control.sql(agency_followed+integrations.enabled). Matriz en Agencia + hub por cliente. - Meta/Google Ads discovery: env
META_ACCESS_TOKEN,GOOGLE_ADS_DEVELOPER_TOKEN,GOOGLE_ADS_REFRESH_TOKEN,GOOGLE_ADS_CLIENT_ID/SECRET. UI: Agencia → Descubrir y emparejar. - Meta App Review: mientras esperas aprobación, usa Solo Google Ads. Cuando tengas el system user token, pégalo en Agencia (se guarda en
agency_oauth, sin redeploy) → Descubrir ambos.
Login
- Abre https://app.4ventures.es/login
- Email:
marketing@4ventures.es - Password: la de
.ops/marketing-credentials.txt(o el gestor de la agencia)
Reset / reprovision (si hace falta)
Studio (Kong) o Admin API con service role:
{
"role": "admin",
"company": "4Ventures",
"slug": "4ventures-hub",
"tenant_id": "0b3c5fc0-6901-4caf-b26a-b6a0201d8541"
}
Rotación de API keys (recomendado)
Settings → API → Regenerate anon y service_role.
Actualizar en Dokploy → Web4Ventures → client-portal → Environment (API application.update).
Nunca pegar keys en PDFs ni .env.example.
Pendiente ops
ANTHROPIC_API_KEYen Dokploy env si se quiere el asistente LLM- OAuth live Meta; Google Ads via env; GA4/GSC vía OAuth marketing@ (reconectar Google en Agencia + sync orgánico)
- IP allowlist Traefik: mantener IPs oficina actuales en
middleware-hardening.yml CLIENTIFY_WEBHOOK_SECRETobligatorio — sin él el webhook responde 503- Cron diario (obligatorio en prod) — ver sección Cron
Cron diario (datos siempre frescos para vistas cliente)
En Dokploy → Environment del client-portal:
- Define
CRON_SECRET(string largo aleatorio). - Schedule diario ~06:00 UTC:
curl -sS -H "Authorization: Bearer $CRON_SECRET" \
"https://app.4ventures.es/api/cron/daily-sync?days=7"
Endpoints individuales (mismo secret):
/api/cron/organic-sync— GA4 + GSC →organic_daily/api/cron/ads-sync— Meta + Google Ads →ad_daily(API v22)/api/cron/superhuman-sync— Seguimiento / Google Docs/api/cron/clientify-sync— reconciliación CRM Clientify (upsert 60d; diario 05:15 UTC) (script:python3 scripts/dokploy_ensure_clientify_sync_cron.py)/api/cron/pipeline-publish— piezasaprobado+scheduled_atvencida → Meta IG/FB (cada ~10 min; script:python3 scripts/dokploy_ensure_pipeline_publish_cron.py)
curl -sS -H "Authorization: Bearer $CRON_SECRET" \
"https://app.4ventures.es/api/cron/pipeline-publish"
last_sync_at solo se actualiza tras escribir filas reales (no al emparejar).
Verificación
- Rol
admin→ ve/dashboard/agencia - Rol
client→ redirigido fuera de agencia - Chat/simulate solo con sesión
- Health:
serviceRoleConfigured: true - Tras cron: Orgánico / Ads / Seguimiento con
last_sync_atde hoy en ficha