# Confirmación de pedido por WhatsApp

> Cuando entra un pedido en tu tienda online, mándale al cliente una confirmación por WhatsApp.

Tu cliente compra en tu tienda y a los pocos segundos recibe por WhatsApp: _“¡Hola Sofía! Recibimos tu pedido #1042 por $45.900. Te avisamos cuando salga.”_

Sirve con cualquier plataforma que avise de los pedidos nuevos con un webhook: Tiendanube, Shopify, WooCommerce, VTEX, tu propio sistema, etc. El ejemplo usa un servidor Node, pero la idea es la misma en cualquier lenguaje.

```mermaid
flowchart LR
    A[Tu tienda] -- pedido nuevo --> B[Tu servidor]
    B -- POST /contacts --> C[MINDO]
    B -- POST /messages --> C
    C -- plantilla --> D[WhatsApp del cliente]
```

## 1. Crea la plantilla

En MINDO, ve a **Plantillas › Nueva plantilla** y crea una de categoría **Utilidad** con variables para el nombre, el número de pedido y el total. Por ejemplo:

> ¡Hola [nombre]! Recibimos tu pedido [pedido] por [total]. Te avisamos por acá cuando salga. ¡Gracias por comprar en Café Aurora! ☕

<Tip>
  Las confirmaciones de pedido son mensajes de **utilidad**: Meta las cobra más barato que las de marketing y se aprueban más rápido. No agregues promociones en el mismo mensaje, porque Meta puede recategorizarla como marketing. Más en [Categorías y costos](/conceptos/categorias-y-costos).
</Tip>

Cuando Meta la apruebe, busca su `id` y el nombre de sus variables:

```bash
curl https://app.mindo.ar/api/v1/templates -H "Authorization: Bearer $MINDO_API_KEY"
```

```json
{
  "data": [
    {
      "id": "01a0d470-1b2c-7d3e-9f40-5a6b7c8d9e0f",
      "name": "Confirmación de pedido",
      "category": "UTILITY",
      "variables": [
        { "name": "nombre", "label": "nombre" },
        { "name": "pedido", "label": "pedido" },
        { "name": "total", "label": "total" }
      ]
    }
  ]
}
```

## 2. Recibe el pedido y manda el mensaje

```javascript server.js
import express from "express"

const MINDO = "https://app.mindo.ar/api/v1"
const headers = {
  Authorization: `Bearer ${process.env.MINDO_API_KEY}`,
  "Content-Type": "application/json",
}
const PLANTILLA = "01a0d470-1b2c-7d3e-9f40-5a6b7c8d9e0f"

const app = express()
app.use(express.json())

// Tu tienda llama a esta URL cuando entra un pedido
app.post("/pedidos/nuevo", async (req, res) => {
  res.sendStatus(200) // respóndele rápido a la tienda

  const pedido = req.body // adapta los nombres de campo a tu plataforma
  if (!pedido.cliente?.telefono) return

  // 1) Guarda o actualiza el contacto con datos útiles para campañas futuras
  await fetch(`${MINDO}/contacts`, {
    method: "POST",
    headers,
    body: JSON.stringify({
      phone: pedido.cliente.telefono,
      name: pedido.cliente.nombre,
      attributes: {
        ultima_compra: pedido.fecha.slice(0, 10),
        ultimo_pedido: String(pedido.numero),
      },
    }),
  })

  // 2) Manda la confirmación
  const envio = await fetch(`${MINDO}/messages`, {
    method: "POST",
    headers,
    body: JSON.stringify({
      to: pedido.cliente.telefono,
      template: {
        id: PLANTILLA,
        variables: {
          nombre: pedido.cliente.nombre.split(" ")[0],
          pedido: `#${pedido.numero}`,
          total: new Intl.NumberFormat("es-AR", { style: "currency", currency: "ARS" }).format(pedido.total),
        },
      },
    }),
  })
  const mensaje = await envio.json()
  if (!envio.ok) {
    console.error(`No se pudo confirmar el pedido ${pedido.numero}: ${mensaje.error}`)
    return
  }
  // Guarda mensaje.id junto al pedido para seguir su estado
  console.log(`Pedido ${pedido.numero}: mensaje ${mensaje.id}`)
})

app.listen(3000)
```

<Note>
  Formatea el total con la moneda de tu país: `es-MX` y `MXN` para México, `es-CO` y `COP` para Colombia, `es-CL` y `CLP` para Chile, `es-PE` y `PEN` para Perú.
</Note>

## 3. Cuida los detalles

<AccordionGroup>
  <Accordion title="El teléfono tiene que tener código de país" icon="phone">
    Muchas tiendas guardan el teléfono como lo escribió el cliente: `011 15 2345-6789`, `55 1234 5678`, `300 123 4567`. La API necesita el código de país. Si todos tus clientes son de un mismo país, agrégalo tú antes de mandar. Mira [Formato de teléfonos](/conceptos/formato-de-telefonos).

    Si el teléfono no es válido, la API responde `400` y no se manda nada.
  </Accordion>
  <Accordion title="Manda siempre todas las variables" icon="braces">
    Si falta una variable y el contacto no tiene ese dato, sale el ejemplo que cargaste en la plantilla. En una confirmación de pedido, eso sería un número de pedido equivocado.
  </Accordion>
  <Accordion title="No mandes dos veces la misma confirmación" icon="copy-x">
    Las tiendas a veces reenvían el mismo aviso de pedido. Guarda qué pedidos ya confirmaste (por ejemplo, el `id` del mensaje junto al pedido) y no vuelvas a mandar.
  </Accordion>
  <Accordion title="Si el cliente responde" icon="message-circle">
    La respuesta llega al **Chat** de MINDO, donde tu equipo la ve y contesta. Durante 24 horas después de su respuesta puedes escribirle con texto libre. Si quieres enterarte desde tu sistema, usa el webhook [`message.received`](/api/webhooks/eventos#message-received).
  </Accordion>
</AccordionGroup>

## 4. Avísale cuando sale el envío

Crea una segunda plantilla de utilidad, por ejemplo _“¡Tu pedido [pedido] ya salió! Puedes seguirlo acá: [link]”_, y mándala con el mismo código cuando cambies el estado del pedido a “enviado”.

## Siguiente paso

<Card title="Seguir la entrega de cada mensaje" icon="check-check" href="/api/recetas/seguimiento-de-entregas">
  Guarda en tu sistema si la confirmación se entregó, se leyó o falló.
</Card>
