# 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: ```json { "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: ```bash 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` — piezas `aprobado` + `scheduled_at` vencida → Meta IG/FB (cada ~10 min; script: `python3 scripts/dokploy_ensure_pipeline_publish_cron.py`) ```bash 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