Add WooCommerce health monitoring, 60d cohort CAC in CRM and portfolio, incremental GHL upsert, Shopify orders→deals, and daily health-alert cron. Co-authored-by: Cursor <cursoragent@cursor.com>
92 lines
4.6 KiB
Markdown
92 lines
4.6 KiB
Markdown
# 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/ghl-sync` — GoHighLevel upsert (diario 05:20 UTC)
|
|
- `/api/cron/shopify-sync` — pedidos paid Shopify → deals (diario 05:25 UTC)
|
|
- `/api/cron/health-alerts` — alertas sync atrasado / caída ecommerce (diario 07:00 UTC)
|
|
- `/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
|