Files
4ventures-client-portal/docs/OPERATOR.md
4Ventures b4d86e1e28 Enable in-place pipeline edits with calendar sync and timed publish cron.
Agency can edit title/copy on existing cards (optional RRSS sync); Dokploy runs pipeline-publish every 10 minutes with daily-sync as backup.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-06 18:33:10 +02:00

4.2 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.sql aplicado en prod; RLS activo en tablas de negocio (incl. agent_runs, verificado 2026-09-21)
  • Re-aplicar RLS agent_runs si hace falta: sql/agent_runs_rls.sql (idempotente)
  • Biblioteca de activos (archivos): sql/asset_files.sql + bucket privado tenant-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_SECRET en 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

  1. Abre https://app.4ventures.es/login
  2. Email: marketing@4ventures.es
  3. 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_KEY en 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_SECRET obligatorio — 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:

  1. Define CRON_SECRET (string largo aleatorio).
  2. 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/pipeline-publish — piezas aprobado + scheduled_at vencida → 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_at de hoy en ficha