# Erreur WhatsApp 132000 : nombre de variables incorrect

URL: https://wa.genuka.com/docs/errors/132000
Language: French

> Erreur WhatsApp 132000 (Template Param Count Mismatch) : le nombre de variables envoyées ne correspond pas au template. Comment les compter et les envoyer.

L'erreur WhatsApp 132000 signifie que le nombre de valeurs envoyées pour les variables du template
ne correspond pas au nombre de variables qu'il contient. Meta refuse le message sans l'envoyer.
Recomptez les variables du template approuvé, en-tête et corps, puis envoyez exactement une valeur
par variable, dans le bon ordre.

## Que signifie l'erreur 132000 ?

> « The number of variable parameter values included in the request did not match the number of
> variable parameters defined in the template. »
> — [Meta, codes d'erreur de la Cloud API](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes#other-errors)

Meta demande de vérifier que la requête fournit une valeur pour **chacune** des variables exigées
par le template. Le titre associé au code dans le champ `message` est « Template Param Count
Mismatch » ([liste de 360dialog](https://docs.360dialog.com/docs/support/api-error-message-list)).

Un template déclare ses variables dans un format choisi à sa création
([Meta, Templates, parameter formats](https://developers.facebook.com/documentation/business-messaging/whatsapp/templates/overview)) :

| Format                   | Écriture dans le template                   | Règle à l'envoi                                         |
| ------------------------ | ------------------------------------------- | ------------------------------------------------------- |
| Positionnel (par défaut) | `{{1}}`, `{{2}}`…                           | Les valeurs suivent l'ordre des variables dans le texte |
| Nommé                    | `{{first_name}}` (minuscules et tirets bas) | Les valeurs peuvent arriver dans n'importe quel ordre   |

## Quand l'erreur 132000 apparaît-elle ?

* **Une variable d'en-tête oubliée** : le titre « Commande `{{1}}` expédiée » a sa propre variable,
  qui ne se remplit pas avec celles du corps.
* **Un template modifié après l'intégration** : une variable a été ajoutée au texte, le code envoie
  toujours l'ancien nombre de valeurs.
* **Une campagne aux variables inégales** : certains destinataires ont deux valeurs, d'autres une.
* **Un tableau vide ou absent** parce qu'une donnée manquait côté application (prénom inconnu,
  numéro de commande `null` filtré).

### Où la voir dans Genuka WA ?

| Canal                              | Ce que vous recevez                                                                                                                           |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Réponse de `POST /api/v1/messages` | `400`, `"error": "send_template"`, `meta.code: 132000`, `meta.retryable: false`                                                               |
| Campagne                           | Les destinataires concernés passent `failed` ; si la forme des variables est la même pour tous, **toute** la campagne échoue de la même façon |

Genuka WA classe tout code 132xxx en `template` : l'erreur est dans la requête, la renvoyer telle
quelle échouera toujours.

## Comment corriger l'erreur 132000 ?

1. **Lisez le template tel qu'approuvé** avec `GET /api/v1/templates/{id}` : le champ `components`
   contient le texte de l'en-tête et du corps.

2. **Comptez les variables de chaque composant** : celles de l'en-tête texte d'un côté, celles du
   corps de l'autre.

3. **Placez chaque valeur dans le bon champ** de `template` :

   | Dans le template                   | Dans `POST /api/v1/messages`                                 |
   | ---------------------------------- | ------------------------------------------------------------ |
   | Corps positionnel `{{1}}`, `{{2}}` | `body` (ou son alias `variables`) : un tableau, dans l'ordre |
   | Corps nommé `{{first_name}}`       | `bodyNamed` : un objet `{ "first_name": "Awa" }`             |
   | En-tête texte avec `{{1}}`         | `header: { "text": "CMD-1042" }`                             |
   | En-tête image, vidéo ou document   | `header: { "image": { "assetId": "ast_1" } }`                |
   | Bouton URL dynamique               | `buttons: [{ "type": "url", "text": "1042" }]`               |
   | Template d'authentification        | `otp: "472913"`, qui remplit le corps et le bouton           |

**curl**

```bash
# 1. Le template tel qu'approuvé
curl https://wa.genuka.com/api/v1/templates/tpl_123 \
  -H "Authorization: Bearer $GENUKA_WA_API_KEY"
# "components": [
#   { "type": "HEADER", "format": "TEXT", "text": "Commande {{1}} expédiée" },
#   { "type": "BODY", "text": "Bonjour {{1}}, votre colis arrive {{2}}." }
# ]

# 2. Une valeur pour l'en-tête, deux pour le corps
curl -X POST https://wa.genuka.com/api/v1/messages \
  -H "Authorization: Bearer $GENUKA_WA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "connectionId": "con_1",
    "to": "+237690000001",
    "template": {
      "name": "colis_expedie",
      "language": "fr",
      "header": { "text": "CMD-1042" },
      "body": ["Awa", "demain"]
    }
  }'
```

**Node.js**

```ts
type Component = { type: string; format?: string; text?: string };

const VARIABLE = /\{\{\s*([a-z0-9_]+)\s*\}\}/g;

/** Le nombre de valeurs que le template attend, par composant. */
export function expectedParams(components: Component[]) {
  const count = (type: string) => {
    const component = components.find((c) => c.type.toUpperCase() === type);
    if (!component?.text) return 0;
    if (type === "HEADER" && component.format && component.format.toUpperCase() !== "TEXT") return 0;
    return new Set([...component.text.matchAll(VARIABLE)].map((match) => match[1])).size;
  };
  return { header: count("HEADER"), body: count("BODY") };
}

// Avant l'envoi : refuser localement plutôt que de laisser Meta répondre 132000.
const { data: template } = await fetch("https://wa.genuka.com/api/v1/templates/tpl_123", {
  headers: { Authorization: `Bearer ${process.env.GENUKA_WA_API_KEY}` },
}).then((response) => response.json());

const expected = expectedParams(template.components);
const body = ["Awa", "demain"];
if (body.length !== expected.body) {
  throw new Error(`Le corps attend ${expected.body} valeur(s), ${body.length} fournie(s)`);
}
```

**Python**

```python
import re

VARIABLE = re.compile(r"\{\{\s*([a-z0-9_]+)\s*\}\}")


def expected_params(components: list[dict]) -> dict:
    """Le nombre de valeurs que le template attend, par composant."""

    def count(kind: str) -> int:
        component = next((c for c in components if c.get("type", "").upper() == kind), None)
        if not component or not component.get("text"):
            return 0
        if kind == "HEADER" and component.get("format", "TEXT").upper() != "TEXT":
            return 0
        return len(set(VARIABLE.findall(component["text"])))

    return {"header": count("HEADER"), "body": count("BODY")}
```

## Comment éviter l'erreur 132000 ?

* **Validez avant d'envoyer**, avec un compteur comme ci-dessus, et refusez localement une requête
  incomplète : l'erreur arrive plus tôt et nomme la donnée manquante.
* **Versionnez vos templates** (`colis_expedie_v2`) quand vous changez leurs variables, plutôt que
  de modifier un template déjà utilisé par votre code.
* **Contrôlez chaque destinataire d'une campagne** avant `POST /api/v1/campaigns` : même nombre de
  valeurs pour tous, aucune valeur vide.
* **Vérifiez aussi le format** : un template créé en paramètres nommés se remplit avec
  `bodyNamed`, pas avec un tableau.

## Quels codes sont liés ?

* [132001](https://wa.genuka.com/docs/errors/132001) : le template lui-même est introuvable dans cette langue, ou pas
  approuvé.
* [132015](https://wa.genuka.com/docs/errors/132015) : le template est en pause pour mauvaise qualité.
* [131047](https://wa.genuka.com/docs/errors/131047) : la fenêtre de 24 heures est fermée, d'où le passage au template.

## FAQ

### Les exemples donnés à la création comptent-ils à l'envoi ?

Non. Les exemples servent à l'examen du template par Meta ; à l'envoi, vous fournissez les vraies
valeurs, une par variable.

### L'ordre des valeurs compte-t-il ?

Pour un template positionnel, oui : la première valeur remplit `{{1}}`, la deuxième `{{2}}`. Pour
un template nommé, non : Meta accepte les valeurs dans n'importe quel ordre.

### Pourquoi toute ma campagne échoue-t-elle en 132000 ?

Parce que l'erreur vient de la forme des variables, identique pour tous les destinataires. Genuka
WA ne réessaie pas une erreur de template, et une campagne déjà lancée ne renvoie que ses
destinataires encore `pending` : corrigez les variables, puis créez une nouvelle campagne.

## Sources

* [Meta — Error codes](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes)
* [Meta — Templates overview, parameter formats](https://developers.facebook.com/documentation/business-messaging/whatsapp/templates/overview)
* [360dialog — API error message list](https://docs.360dialog.com/docs/support/api-error-message-list)
