> ## Documentation Index
> Fetch the complete documentation index at: https://help.treble.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# fact_conversations

> Una fila por cada conversación atendida por un agente.

# fact\_conversations

Cada fila representa una conversación en la plataforma de agentes. Incluye información del agente que la atendió, el equipo, el estado final y datos del flujo de conversación asociado.

## ¿Qué preguntas responde?

* ¿Cuántas conversaciones se atendieron en un período?
* ¿Qué agente atendió cada conversación?
* ¿Cuánto tiempo tomó resolver una conversación?
* ¿Cuántas conversaciones fueron inbound vs outbound?
* ¿Cuántas transferencias tuvo cada conversación?
* ¿Cuál fue la calificación (rating) del usuario?

## Columnas

| Columna                  | Tipo       | Descripción                                                                                          |
| ------------------------ | ---------- | ---------------------------------------------------------------------------------------------------- |
| `conversation_id`        | Int32      | Identificador único de la conversación                                                               |
| `company_id`             | Int32      | Identificador de la empresa (filtrado automáticamente)                                               |
| `survey_user_id`         | Int64      | Identificador del flujo de conversación asociado. `0` si no tiene flujo vinculado                    |
| `contact_id`             | Int32      | Identificador del contacto en la plataforma de agentes                                               |
| `created_at`             | DateTime64 | Fecha y hora de creación de la conversación                                                          |
| `finished_at`            | DateTime64 | Fecha y hora de cierre. `NULL` si sigue abierta                                                      |
| `assigned_at`            | DateTime64 | Fecha y hora de asignación al agente. `NULL` si no fue asignada                                      |
| `status`                 | String     | Estado actual: `OPEN`, `CLOSED`, `PENDING`, etc.                                                     |
| `finish_type`            | String     | Cómo se cerró: `AGENT`, `SYSTEM`, `TIMEOUT`, etc.                                                    |
| `rating`                 | Int32      | Calificación del usuario (1-5). `0` si no calificó                                                   |
| `is_redirected`          | Bool       | `true` si la conversación fue transferida al menos una vez                                           |
| `agent_id`               | Int32      | Identificador del agente que atendió. `0` si no fue asignada                                         |
| `agent_name`             | String     | Nombre completo del agente                                                                           |
| `tag_id`                 | Int32      | Identificador del tag/cola asignado                                                                  |
| `tag_name`               | String     | Nombre del tag/cola                                                                                  |
| `team_id`                | Int32      | Identificador del equipo                                                                             |
| `team_name`              | String     | Nombre del equipo                                                                                    |
| `channel_id`             | Int32      | Identificador del canal (línea de WhatsApp)                                                          |
| `inbound_outbound`       | String     | `inbound` si el usuario inició la conversación, `outbound` si fue iniciada por campaña               |
| `campaign_name`          | String     | Nombre de la campaña asociada                                                                        |
| `transfer_count`         | UInt32     | Número de transferencias que tuvo la conversación                                                    |
| `first_agent_message_at` | DateTime64 | Fecha del primer mensaje del agente. `NULL` si el agente no respondió                                |
| `first_response_sec`     | Int32      | Segundos entre la creación de la conversación y el primer mensaje del agente. `NULL` si no respondió |
| `helpdesk_contact_id`    | String     | Identificador del contacto en el CRM externo (si existe integración)                                 |
| `contact_wa_id`          | String     | Número de WhatsApp del contacto                                                                      |

## Consultas de ejemplo

### Conversaciones por agente en los últimos 30 días

```sql theme={null}
SELECT
    agent_name,
    count() AS total_conversaciones,
    countIf(status = 'CLOSED') AS cerradas,
    round(avg(if(finished_at IS NOT NULL,
        dateDiff('minute', created_at, finished_at), NULL)), 1) AS tiempo_resolucion_min_promedio
FROM client_analytics.fact_conversations
WHERE created_at >= now() - INTERVAL 30 DAY
GROUP BY agent_name
ORDER BY total_conversaciones DESC
```

### Nivel de servicio por equipo (SLA personalizable)

```sql theme={null}
SELECT
    team_name,
    count() AS conversaciones,
    -- Puedes cambiar 120 por el umbral que necesites (en segundos)
    round(countIf(first_response_sec <= 120) * 100.0 / count(), 1) AS sla_120s_pct,
    round(countIf(first_response_sec <= 60) * 100.0 / count(), 1) AS sla_60s_pct,
    round(avg(first_response_sec), 0) AS promedio_respuesta_seg
FROM client_analytics.fact_conversations
WHERE created_at >= now() - INTERVAL 7 DAY
  AND first_response_sec IS NOT NULL
GROUP BY team_name
ORDER BY sla_120s_pct DESC
```

### Conversaciones inbound vs outbound por día

```sql theme={null}
SELECT
    toDate(created_at) AS dia,
    inbound_outbound,
    count() AS total
FROM client_analytics.fact_conversations
WHERE created_at >= now() - INTERVAL 30 DAY
GROUP BY dia, inbound_outbound
ORDER BY dia DESC
```
