# Encuesta de satisfacción desde tu sistema

> Cuando tu sistema marca un pedido como entregado, arranca una automatización que pregunta cómo le fue al cliente y te devuelve la respuesta.

Tu sistema marca el pedido #1042 como entregado y, a los pocos segundos, la clienta recibe por WhatsApp: _“¡Hola Sofía! Tu pedido #1042 ya fue entregado. ¿Nos cuentas cómo te fue?”_, con un botón. Si lo toca, una automatización le pregunta cómo fue la experiencia, guarda la respuesta, te la manda a tu sistema y, si algo salió mal, le pasa la conversación a tu equipo.

A diferencia de mandar un mensaje con [`POST /messages`](/api-reference/mensajes/enviar), acá **tu sistema solo avisa qué pasó**. Qué se le dice al cliente, qué se pregunta y a quién se deriva lo cambia tu equipo desde el editor de automatizaciones, sin tocar código.

```mermaid
sequenceDiagram
    participant S as Tu sistema
    participant E as eltick
    participant C as Cliente
    S->>E: POST /automations/{id}/runs (pedido entregado)
    E->>C: Plantilla con botón “Calificar mi compra”
    C->>E: Toca el botón
    E->>C: ¿Cómo fue tu experiencia? (Excelente / Bien / Mal)
    C->>E: “Mal”
    E->>S: Solicitud HTTP firmada con la calificación
    E->>C: Lo sentimos, te escribe alguien del equipo
```

<Note>
  Necesitas el plan **Escala** o **Enterprise** (por la API) y una [clave de API](/api/autenticacion).
</Note>

## Por qué son dos automatizaciones

Cuando tu sistema arranca la automatización, la clienta no te escribió hace poco: la [ventana de 24 horas](/conceptos/ventana-24-horas) está cerrada. Con la ventana cerrada, WhatsApp solo deja mandar **plantillas aprobadas**, y una **Pregunta** fallaría.

Por eso se arma en dos partes:

1. **Pedido entregado**: la arranca tu sistema. Guarda el número de pedido en el contacto y manda una plantilla con un botón.
2. **Encuesta**: arranca cuando la clienta toca el botón. Como acaba de escribir, la ventana está abierta y se le puede preguntar.

## 1. Prepara la plantilla y el campo

- En **Contactos › Campos**, crea un [campo](/guias/contactos/campos) de texto con la clave `ultimo_pedido`.
- En **Plantillas**, crea una de categoría **Utilidad** con un botón de respuesta rápida **Calificar mi compra**:

  > ¡Hola [nombre]! Tu pedido [pedido] ya fue entregado. ¿Nos cuentas cómo te fue? Son 10 segundos 🙌

## 2. Arma la automatización “Pedido entregado”

| Paso | Configuración |
| --- | --- |
| **Disparador** | **Inicio manual** |
| **Acción** | **Guardar un dato**: campo `ultimo_pedido` = `{var.webhook.pedido}` |
| **Mensaje** | **Plantilla** del paso 1, con `nombre` = `{nombre}` y `pedido` = `#{var.webhook.pedido}` |

Publícala. El id de la automatización lo necesitas para la llamada; lo ves en la URL de **Ver URL y token** si le agregas un disparador **Webhook entrante**, o en la dirección del editor.

## 3. Arma la automatización “Encuesta”

| Paso | Configuración |
| --- | --- |
| **Disparador** | **Palabra clave**, **Es exactamente**: `Calificar mi compra`, canal WhatsApp |
| **Pregunta** | _“¿Cómo fue tu experiencia con el pedido \{ultimo_pedido\}?”_ Tipo **Opciones**: `Excelente`, `Bien`, `Mal`. **Guardar en la variable**: `calificacion`. |
| **Solicitud HTTP** | `POST https://tu-sistema.com/eltick/encuestas`, **Firmar la solicitud**, con el cuerpo de abajo |
| **Condición** | **Variable** `calificacion` **es** `Mal` |
| **Sí** → **Mensaje** + **Pasar a una persona** | _“Lamentamos que no haya salido bien. En un rato te escribe alguien del equipo para ayudarte.”_ |
| **No** → **Mensaje** | _“¡Gracias, \{nombre\}! Nos ayuda muchísimo 💚”_ |

Conecta las dos salidas de la solicitud HTTP (**Éxito** y **Error**) a la condición: si tu sistema no responde, la clienta igual recibe su respuesta.

```json Cuerpo de la solicitud HTTP
{
  "pedido": "{ultimo_pedido}",
  "calificacion": "{var.calificacion}",
  "telefono": "{telefono}"
}
```

Pruébala con **Probar con un contacto** en tu propio número antes de publicar. Mira [Probar y seguir las ejecuciones](/guias/automatizaciones/probar).

## 4. Arranca la automatización desde tu sistema

Cuando un pedido pasa a “entregado”, llama a [`POST /automations/{id}/runs`](/api-reference/automatizaciones/iniciar) con el teléfono y los datos del pedido:

```javascript entregas.js
const ELTICK = "https://app.eltick.com/api/v1"
const PEDIDO_ENTREGADO = "01a0d4c2-7b1d-7e3f-9a40-5b6c7d8e9f01" // id de la automatización

export async function avisarEntrega(pedido) {
  for (let intento = 0; intento < 5; intento++) {
    const res = await fetch(`${ELTICK}/automations/${PEDIDO_ENTREGADO}/runs`, {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.ELTICK_API_KEY}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        phone: pedido.cliente.telefono,
        name: pedido.cliente.nombre,
        data: { pedido: String(pedido.numero) },
      }),
    })
    const cuerpo = await res.json()

    if (res.ok) return cuerpo.runId // guárdalo junto al pedido

    // Tope por minuto: espera y reintenta. Cupo mensual (cause.type = "upgrade"): no sirve reintentar.
    if (res.status === 429 && cuerpo.cause?.type !== "upgrade") {
      const espera = Number(res.headers.get("retry-after") ?? 60) * 1000
      await new Promise((r) => setTimeout(r, espera * (intento + 1)))
      continue
    }

    // 409: la automatización está pausada o el cliente ya está en otra automatización
    throw new Error(`No se pudo avisar la entrega del pedido ${pedido.numero}: ${cuerpo.error}`)
  }
  throw new Error("La API sigue respondiendo 429")
}
```

```json 201
{ "runId": "01a0d4c3-1a2b-7c3d-8e4f-5a6b7c8d9e0f" }
```

<Tip>
  Si entregas muchos pedidos juntos (por ejemplo, al cerrar el reparto del día), no los mandes todos a la vez: ve de a uno y deja un pequeño intervalo entre llamadas. Mira [Límites](/api/limites).
</Tip>

## 5. Recibe la calificación

El paso **Solicitud HTTP** de la encuesta le manda a tu sistema un `POST` firmado con el token de la automatización (`ats_…`). Verifica la firma igual que un webhook, pero con ese token:

```javascript encuestas.js
import express from "express"
import { verificarFirma } from "./firma.js" // la función de "Verificar la firma"

const app = express()

app.post("/eltick/encuestas", express.raw({ type: "*/*" }), async (req, res) => {
  const cuerpo = req.body.toString("utf8")
  if (!verificarFirma(cuerpo, req.get("x-eltick-signature") ?? "", process.env.ELTICK_AUTOMATION_TOKEN)) {
    return res.status(401).json({ error: "Firma inválida" })
  }
  const { pedido, calificacion, telefono } = JSON.parse(cuerpo)
  await guardarCalificacion(pedido, calificacion, telefono)
  res.status(201).json({ ok: true }) // responde en menos de 10 segundos
})

app.listen(3000)
```

La función `verificarFirma` está en [Conectar con tu sistema](/guias/automatizaciones/integraciones#verificar-la-firma), en Node y Python.

## 6. Entérate si algo falló

Si la plantilla no se pudo mandar (por ejemplo, el número no tiene WhatsApp o la plantilla dejó de estar aprobada), la ejecución de **Pedido entregado** falla. Suscribe tu webhook al evento [`automation.failed`](/api/webhooks/eventos#automation-failed) y búscala por el `runId` que guardaste:

```javascript
// Dentro de tu receptor de webhooks, después de verificar la firma
if (evento.event === "automation.failed") {
  const { runId, error } = evento.data
  await marcarAvisoFallido(runId, error)
}
```

## Cuida los detalles

<AccordionGroup>
  <Accordion title="Si la clienta está en medio de otra automatización" icon="circle-pause">
    Una conversación tiene una sola automatización en curso a la vez. Si ya hay una, la llamada responde `409` con _“Esta conversación ya tiene una automatización en curso.”_ Reintenta más tarde o deja pasar esa encuesta.
  </Accordion>
  <Accordion title="Si tu equipo está hablando con ella" icon="headset">
    Cuando alguien del equipo responde en el chat, las automatizaciones dejan de responder en esa conversación durante 24 horas, para no interrumpir. Si la clienta toca el botón en ese lapso, la **Encuesta** no arranca: el mensaje le llega a tu equipo en el chat, como cualquier otro.
  </Accordion>
  <Accordion title="No mandes dos veces la misma encuesta" icon="copy-x">
    Guarda el `runId` junto al pedido y no vuelvas a llamar si ya tienes uno. La API no deduplica por ti.
  </Accordion>
  <Accordion title="Mide cómo funciona" icon="chart-column">
    Sobre el lienzo de cada automatización ves cuántas ejecuciones pasaron por cada paso: cuántas encuestas arrancaron, cuántas llegaron a la pregunta y cuántas por cada respuesta.
  </Accordion>
</AccordionGroup>
