# Enviar una plantilla — ejemplos listos para Postman

```
POST  https://graph.facebook.com/v26.0/1238447646026666/messages
Authorization: Bearer {TOKEN}
Content-Type: application/json
```

> **Ojo con el ID.** Aquí va el **Phone Number ID** (`1238447646026666`), no el
> WABA. El WABA solo se usa para crear y listar plantillas.

---

## Ejemplo A — POSITIONAL (`pad_invitacion_grupo`)

Es el caso de 11 de las 12 plantillas. Los parámetros van **sin**
`parameter_name` y **el orden manda**: el primero es `{{1}}`, el segundo `{{2}}`.

```json
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "529513129790",
  "type": "template",
  "template": {
    "name": "pad_invitacion_grupo",
    "language": { "code": "es_MX" },
    "components": [
      {
        "type": "body",
        "parameters": [
          { "type": "text", "text": "Víctor Manuel" },
          { "type": "text", "text": "Grupo A" }
        ]
      }
    ]
  }
}
```

Lo que le llega al destinatario:

```
Hola Víctor Manuel.
Te han invitado a unirte al grupo Grupo A.
Ingresa a la aplicación para revisar la invitación.
```

---

## Ejemplo B — NAMED (`pad_prueba`)

Queda solo como referencia: `pad_prueba` es la única que conserva variables por
nombre. Aquí cada parámetro lleva `parameter_name` y **el orden da igual**.

```json
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "529513129790",
  "type": "template",
  "template": {
    "name": "pad_prueba",
    "language": { "code": "es_MX" },
    "components": [
      {
        "type": "body",
        "parameters": [
          { "type": "text", "parameter_name": "nombre_jugador", "text": "Víctor Manuel" },
          { "type": "text", "parameter_name": "nombre_grupo",   "text": "Grupo A" }
        ]
      }
    ]
  }
}
```

Mandar `parameter_name` en una POSITIONAL —u omitirlo en una NAMED— devuelve
`100 invalid parameter`.

---

## Respuesta esperada

```json
{
  "messaging_product": "whatsapp",
  "contacts": [{ "input": "529513129790", "wa_id": "5219513129790" }],
  "messages": [{ "id": "wamid.HBg...", "message_status": "accepted" }]
}
```

`accepted` significa **encolado en Meta**, no entregado. La entrega real llega
después por webhook, como `statuses`: `sent` → `delivered` → `read`.

---

## Antes de enviar

- **La plantilla debe estar `APPROVED`** en este WABA. Con `PENDING` el envío
  falla. Se consulta con:
  `GET https://graph.facebook.com/v26.0/1581728670124474/message_templates?fields=name,status`
- **El `language.code` debe ser exacto**: `es_MX`, no `es`. Si no coincide con el
  de la plantilla creada, Meta responde que no existe.
- **El número de parámetros debe coincidir** con el de la plantilla. De más o de
  menos, la rechaza.
- **No aplica la ventana de 24 h.** Ése es el punto de las plantillas: se pueden
  enviar sin que el destinatario haya escrito antes. El texto libre sí la
  requiere.

## Cuando falla

| Error | Causa |
|---|---|
| `132001` template does not exist | Nombre o `language.code` equivocado, o la plantilla no está en **este** WABA |
| `132000` number of parameters mismatch | Faltan o sobran parámetros respecto al texto |
| `132005` template hydration failed | Un parámetro trae saltos de línea, tabuladores o más de 4 espacios seguidos |
| `131047` re-engagement message | Intentaste texto libre fuera de la ventana de 24 h. Usa plantilla |
| `100` invalid parameter | Mandaste `parameter_name` en una plantilla POSITIONAL, o lo omitiste en una NAMED |
