# Agent Metrics — Queries estándar

Queries reutilizables para ver el funnel diario de cualquier agente. Adaptar los valores marcados con `-- ⚙`.

---

## 1. Funnel diario: convos → booking link → call booked

```sql
-- ⚙ Reemplazar: agent_id, booking_url_fragment, call_booked_keyword
SELECT
  DATE(c.created_at) as dia,
  COUNT(DISTINCT c.id) as convos,

  -- Booking link enviado (adaptar fragment por agente)
  COUNT(DISTINCT CASE WHEN EXISTS (
    SELECT 1 FROM messages m
    WHERE m.conversation_id = c.id AND m.direction = 'OUTBOUND'
    AND m.content ILIKE '%admision.avaperu.pe%'  -- ⚙ URL del booking link
  ) THEN c.id END) as booking_link,

  -- % booking / convos
  ROUND(
    COUNT(DISTINCT CASE WHEN EXISTS (
      SELECT 1 FROM messages m
      WHERE m.conversation_id = c.id AND m.direction = 'OUTBOUND'
      AND m.content ILIKE '%admision.avaperu.pe%'  -- ⚙ mismo fragment
    ) THEN c.id END)::numeric / NULLIF(COUNT(DISTINCT c.id), 0) * 100, 1
  ) as pct_booking,

  -- Call booked (si aplica — dejar en 0 si no hay integración)
  COUNT(DISTINCT CASE WHEN EXISTS (
    SELECT 1 FROM schedules s WHERE s.contact_id = c.contact_id
    AND DATE(s.created_at) = DATE(c.created_at)
  ) THEN c.id END) as call_booked

FROM conversations c
WHERE c.agent_id = 'AGENT_ID_AQUI'  -- ⚙
  AND c.created_at >= NOW() - INTERVAL '14 days'
GROUP BY dia
ORDER BY dia DESC;
```

**Variante para agentes sin URL de booking** (CTA conversacional, ej. neuro.educarte):
```sql
-- Reemplazar los keywords por los que usa el agente para proponer la llamada
AND m.content ILIKE '%google meet%'   -- ⚙ o 'agendar', 'diagnóstico', 'llamada', etc.
```

---

## 2. Follow-ups: convos únicas alcanzadas por workflow

```sql
-- ⚙ Reemplazar: influencer_id
SELECT
  DATE(wr."createdAt") as dia,
  w.name as workflow,
  COUNT(DISTINCT wr.conversation_id) as convos_unicas,
  COUNT(*) as runs_totales,
  ROUND(COUNT(*)::numeric / NULLIF(COUNT(DISTINCT wr.conversation_id), 0), 1) as runs_por_conv
FROM workflow_runs wr
JOIN workflows w ON w.id = wr.workflow_id
WHERE w.influencer_id = 'INFLUENCER_ID_AQUI'  -- ⚙
  AND wr."createdAt" >= NOW() - INTERVAL '14 days'
GROUP BY dia, w.name
ORDER BY dia DESC, w.name;
```

Si `runs_por_conv` > 2 en apertura/follow-up de intervalo corto → candidato a activar **only run once** / track state.

---

## 3. Tabla resumen completa (combina 1 + 2)

Resultado esperado por día:

| Día | Convos | Booking link | % | Call booked | Apertura | Avancemos | Otros FU |
|-----|--------|-------------|---|-------------|----------|-----------|----------|
| ... | ... | ... | ...% | ... | ... | ... | ... |

---

## Referencia por agente

| Agente | Booking URL / CTA keyword | Call booked |
|--------|--------------------------|-------------|
| avaperu (IG/Messenger) | `admision.avaperu.pe/session` | tabla `schedules` |
| fityso.latam | `fitysoacademy.com/estudios-diagnostico` | tabla `schedules` |
| neuro.educarte | `google meet`, `diagnóstico`, `entrevista` | no (Google Calendar externo) |
| estudiantando | *(pendiente confirmar URL)* | tabla `schedules` |
| lic.juanmahuss | *(pendiente confirmar URL)* | tabla `schedules` |

---

## Notas

- `convos` = conversaciones iniciadas ese día (no activas totales).
- `booking_link` cuenta convos distintas, no mensajes — una conv con 3 intentos de envío cuenta como 1.
- Si el agente no tiene URL de booking, usar keywords del CTA conversacional; la métrica es una aproximación (sobreestima si el agente menciona la palabra sin ofrecer el link).
- `call_booked` via tabla `schedules` solo funciona si la plataforma tiene integración de calendario; si el operador agenda manualmente, no aparece.
