# Conectar Twilio

Conecta Twilio con EspoCRM para los mensajes (SMS/MMS) y, si Twilio es tu sistema telefónico, para las llamadas con un softphone o el teléfono del navegador.

Los mensajes siempre pasan por Twilio. Las llamadas también pueden pasar por Twilio si no usas [3CX](https://docs.sapiensandmachines.com/es/espocrm-voip/conectar-3cx).
En las direcciones de abajo, cambia `https://crm.example.com` por tu **URL del sitio**. Las pantallas de Twilio se
indican con sus nombres en inglés.

## Conecta la cuenta

:::steps
1. Abre **Administración → Integraciones → S+M EspoCRM VOIP · Twilio** y marca la casilla para activarla.
2. Completa **Account SID de Twilio** y **Auth Token de Twilio** (consola de Twilio → Account → API keys & tokens), y
   el **Código de país predeterminado** (`1` para Estados Unidos y Canadá).
3. Guarda. Tus números de Twilio se agregan en **Administración → S+M EspoCRM VOIP → Números de Twilio**.
:::

## Mensajes (SMS/MMS)

### Elige quién usa cada número

Abre **Números de Twilio**. Los números se agregan solos al guardar la configuración de Twilio y una vez al día; nada
de lo que configures se sobrescribe. Para cada número:

- **Estado**: *Inactivo* para un número que este CRM no debe usar (sus mensajes se ignoran y nadie puede enviar desde
  él).
- **Número predeterminado para mensajes nuevos**.
- **Usuarios que pueden enviar mensajes** y **Equipos que pueden enviar mensajes**. Los administradores siempre pueden
  enviar. Todos los que pueden ver un Contacto, Cliente potencial o Cuenta pueden leer sus mensajes.
- **Avisar primero (sin usuario asignado)** y **Avisar también en cada mensaje** (consulta
  [Uso diario](uso-diario.md#a-quién-se-avisa)).
- **SID del Messaging Service de Twilio** (opcional, `MG…`): envía los mensajes de este número por ese servicio.

> [!IMPORTANT]
> Quien puede enviar desde un número ve todas las conversaciones de ese número, también con personas que no están en
> el CRM. Elige los usuarios y equipos de cada número teniéndolo en cuenta.

### Dirige el número a EspoCRM

:::steps
1. En la consola de Twilio, abre **Phone Numbers → Manage → Active numbers → tu número → Messaging configuration**.
   Anota adónde van hoy sus mensajes: un número envía sus mensajes a un solo lugar.
2. En **A message comes in**, elige **Webhook** `https://crm.example.com/api/v1/SmVoip/twilio/sms`, HTTP POST.
   Guarda.
:::

Los informes de entrega no necesitan nada más: EspoCRM envía su dirección con cada mensaje.

### Bajas

Cuando alguien responde **STOP** (o STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE, OPTOUT), Twilio le contesta y
EspoCRM marca el número como **Dado de baja**: no se le pueden enviar mensajes hasta que responda **START** (o YES,
UNSTOP). Twilio contesta HELP e INFO.

### Mensajes desde flujos de trabajo

En **Administración → SMS**, elige el proveedor de SMS **S+M EspoCRM VOIP (Twilio)** para que los flujos de trabajo de
EspoCRM puedan enviar mensajes, desde el número predeterminado.

## Llamadas por Twilio

Sáltate esta parte si tus llamadas pasan por 3CX.

### 1. Un dominio SIP para los softphones

:::steps
1. En la consola de Twilio, **Voice → SIP domains → Credential lists**: crea una lista (por ejemplo
   `Telefonos empresa`) con un usuario y una contraseña segura para cada persona, por ejemplo `jperez`.
2. **SIP domains → Create SIP Domain**, por ejemplo `tuempresa.sip.twilio.com`:
   - *Voice Authentication → Credential lists*: tu lista.
   - *SIP Registration*: **Enabled**, con la misma lista.
   - *A call comes in*: el flujo de Studio de salida (paso 3), cuando exista.
   - *Call status changes*: `https://crm.example.com/api/v1/SmVoip/twilio/status`, POST.
3. Si el 911 debe funcionar desde los softphones, configura una dirección de emergencia en Twilio.
:::

En la configuración de Twilio en EspoCRM, completa **Dominio SIP** e **Identificador de llamada para el botón Llamar**
(tu número de Twilio, por ejemplo `+18885551234`) y, si quieres, **Grabar las llamadas hechas con el botón Llamar**. En
cada Usuario, completa **SIP Username** con su usuario del dominio SIP (`jperez`).

### 2. Llamadas entrantes: un flujo de Studio

En **Studio → Flows**, crea un flujo (por ejemplo `Entrantes`) desde cero. Desde la salida **Incoming Call** del
disparador:

:::steps
1. **Make HTTP Request** `crm_ringing`: POST, *Form URL Encoded*, URL
   `https://crm.example.com/api/v1/SmVoip/twilio/ringing`, con los parámetros `CallSid` = `{{trigger.call.CallSid}}`,
   `From` = `{{trigger.call.From}}`, `To` = `{{trigger.call.To}}` y `SipUser` = `jperez`. Conecta *Success* y *Fail*
   al siguiente widget, para que las llamadas sigan sonando aunque el CRM no responda.
2. **Connect Call To** `ring_user`: **SIP Endpoint** `sip:jperez@tuempresa.sip.twilio.com` (usuario y contraseña
   vacíos), Caller ID `{{trigger.call.From}}`, un tiempo de espera como 30 segundos y **Record Call** activado si
   quieres grabaciones.
3. **Split Based On** `answered`, desde *Connected Call Ended*, sobre `{{widgets.ring_user.DialCallStatus}}`: si es
   *Equal To* `completed`, un **Say/Play** de despedida; si no, un **Say/Play** de saludo y luego **Record Voicemail**
   (duración máxima de 120 segundos).
4. **Publish**.
:::

Después, en la **Voice configuration** del número: *A call comes in* → **Studio Flow** → tu flujo, y *Call status
changes* → `https://crm.example.com/api/v1/SmVoip/twilio/status`, HTTP POST.

### 3. Llamadas salientes: un segundo flujo de Studio

Crea un flujo (por ejemplo `Salientes`). Desde la salida **Incoming Call** del disparador (una llamada desde un
softphone llega al dominio SIP como llamada entrante):

:::steps
1. **Make HTTP Request** como `crm_ringing`, sin `SipUser`. *Success* y *Fail* → siguiente.
2. **Connect Call To**: **Single Number** con el valor de abajo y tu número de Twilio como Caller ID.
3. **Publish**, y elige este flujo como *A call comes in* del dominio SIP.
:::

```text
{{trigger.call.To | remove: "sip:" | split: "@" | first}}
```

Marca desde el softphone como `+1XXXXXXXXXX`. El registro de llamadas de Twilio muestra dos filas por llamada;
EspoCRM registra una sola Llamada.

### 4. El softphone

En Zoiper (o cualquier softphone SIP), agrega una cuenta SIP: dominio `tuempresa.sip.twilio.com`, el usuario y la
contraseña de la persona, transporte UDP. Debe mostrar **Registered**. En un ordenador, hazlo la app predeterminada
para los enlaces de teléfono.

> [!WARNING]
> En un móvil, usa un softphone con notificaciones push (por ejemplo Zoiper Pro). Las apps gratuitas se duermen en
> segundo plano y las llamadas van directo al buzón de voz.

### 5. El teléfono del navegador (opcional)

Contesta y haz llamadas dentro de EspoCRM con el micrófono del ordenador.

:::steps
1. Consola de Twilio → **Account → API keys & tokens → Create API key** (tipo Standard). Copia el **SID** (`SK…`) y
   el **Secret** (se muestra una sola vez) en **API Key SID (teléfono del navegador)** y **API Key Secret (teléfono
   del navegador)**.
2. **Voice → Manage → TwiML apps → Create**: *Voice Request URL* = la dirección webhook de tu flujo de salida (haz
   clic en el disparador del flujo para verla), POST; *Status callback URL* =
   `https://crm.example.com/api/v1/SmVoip/twilio/status`. Copia su **SID** (`AP…`) en **TwiML App SID (teléfono del
   navegador)**.
3. Para que suenen a la vez el navegador y el softphone: en el flujo de entrada, agrega un widget **TwiML Redirect**,
   POST, URL `https://crm.example.com/api/v1/SmVoip/twilio/dial?user=jperez&timeout=30&record=1&flow=FW…` (`FW…` es el
   SID del flujo; `record=0` para no grabar). Conecta `crm_ringing` a él en lugar de a `ring_user`, conecta su salida
   **Return** al split `answered` y cambia el split a `{{widgets.<nombre del widget>.DialCallStatus}}`. Publica.
:::

Luego cada persona lo activa en EspoCRM: **Llamadas** en la barra superior → **Activar el teléfono del navegador**, y
permite el micrófono.

## Prueba

1. Escribe al número de Twilio desde tu móvil: en segundos aparece *Nuevo mensaje de …*. Responde desde EspoCRM.
2. Responde **STOP**: EspoCRM muestra *Dado de baja*. Responde **START** para deshacerlo.
3. Con llamadas por Twilio: llama al número desde un teléfono que esté en el CRM; suena el softphone y la ventana
   emergente muestra el registro. Cuelga: se registra una "llamada entrante" realizada.

Si no pasa nada, consulta [Solución de problemas](https://docs.sapiensandmachines.com/es/espocrm-voip/solucion-de-problemas#twilio).
