Error 132000 is a template send failure. The API rejects the request because the number of variable values you supplied does not match the number of variables in the approved template. The documented description reads: "The number of variable parameter values included in the request did not match the number of variable parameters defined in the template". The failure is reported with HTTP status 400 Meta's public error-code reference could not be retrieved when this article was last checked, so the wording above is quoted from BSP documentation rather than from Meta. Confirm the current text against Meta's own reference before you build error handling on it.
Most guides answer 132000 with one instruction: count your variables. That works eventually, but it skips the fastest step. The error string names the component that failed and prints both numbers, so the response tells you where to look before you open the template editor.
Working through a batch of send failures rather than this one code? The wider map is in our reference on WhatsApp Business API error codes.
What error 132000 means
The request was well-formed but arithmetically wrong. Here is a payload seen in production, quoted in full:
The two halves do different jobs. The half before the dash is the generic title, identical on every 132000 regardless of what broke, and on its own it says almost nothing.
The half after the dash is the diagnostic. It names the component (body), states what you sent (0 localizable params, meaning zero variable values), and states what the template defines (1). "Localizable params" is the older internal name for template variables, the placeholders written as {{1}} and {{2}}. So this failure says: the body has one placeholder, and you sent it nothing.
The numbers give the direction of the fix. Fewer than expected means a value is missing. More than expected means the template is simpler than your code assumes, usually because someone shortened it.
Read the error before you read the template
Read the response first, because it localises the fault to one component in one line. Counting braces in Business Manager is slower, and on a template with a header, a body and two buttons it is easier to get wrong. Work through the string in this order:
- Find the dash. The word after it is the component:
body,headerorbutton. - Read the first bracketed number. That is the count your request supplied.
- Read the second. That is the count the template defines.
- Fix only that component. A 132000 that says
– body:tells you nothing about your header.
This matters most in bulk sends, where one broken template produces thousands of identical failures. Grouping error logs by component name and the two counts collapses that noise into a few distinct problems, which pairs well with the throughput planning in our guide to sending bulk WhatsApp messages.
Where parameters hide
Variables are not only in the body. A template can carry them in three places, and a request has to satisfy all three.
Component |
| What creates a variable | Why it gets missed |
|---|---|---|---|
Body |
| Each | Usually counted correctly, because it is visible in the preview |
Header |
| A placeholder in a text header, or the media object in a media header | Headers are short, so a single placeholder is easy to overlook |
Button |
| A dynamic segment in a URL button's link | The variable sits inside the URL, not in any visible message text |
The rule: a component with no variables needs no entry in components, but a component with even one needs an entry holding exactly that many entries in its parameters array. Two values out of three fails identically to none.
Optional-looking variables are the usual trap. A placeholder that renders as an empty string in the preview is still a variable and still needs a value. With no data for it, send an empty value; dropping the entry changes the count.
For how variables are declared at submission, see our explainer on the WhatsApp message template and the walkthrough of WhatsApp message templates.
Worked examples
A template send is a POST to https://graph.facebook.com/v<VERSION>/<PHONE_NUMBER_ID>/messages with an Authorization: Bearer <TOKEN> header. These examples show structure and counts only; the value inside each parameter entry is omitted so the arithmetic stays visible.
Body-only template, one variable. One placeholder, one entry in parameters:
{
"messaging_product": "whatsapp",
"to": "<RECIPIENT_WA_ID>",
"type": "template",
"template": {
"name": "order_confirmation",
"language": { "code": "en" },
"components": [
{
"type": "body",
"parameters": [
{ "type": "text" }
]
}
]
}
}Template with a header variable. The header is its own component with its own count. One header placeholder plus two body placeholders means two entries, not one combined list:
{
"messaging_product": "whatsapp",
"to": "<RECIPIENT_WA_ID>",
"type": "template",
"template": {
"name": "delivery_update",
"language": { "code": "en" },
"components": [
{
"type": "header",
"parameters": [
{ "type": "text" }
]
},
{
"type": "body",
"parameters": [
{ "type": "text" },
{ "type": "text" }
]
}
]
}
}The failing request. This produces the error quoted at the top. The body component is present but its parameters array is empty, so the API counts zero against an expected one:
{
"messaging_product": "whatsapp",
"to": "<RECIPIENT_WA_ID>",
"type": "template",
"template": {
"name": "order_confirmation",
"language": { "code": "en" },
"components": [
{ "type": "body", "parameters": [] }
]
}
}The fix is the first example: one entry in parameters for the one placeholder. Getting these payloads right belongs on any WhatsApp API integration checklist.
The edit-and-forget-to-re-sync trap
If 132000 started appearing on a template that worked yesterday, someone edited it. Adding or removing a placeholder changes the expected count immediately, while your code and any cached definition still hold the old one.
Re-sync the template in your sending tool after any edit Many platforms keep a local copy of each approved template to render previews and build payloads, and that copy does not update itself. Until it refreshes, the tool keeps building requests against a definition that no longer exists.
Two habits stop this recurring. Treat a template edit as a code change, so whoever edits the text tells whoever owns the send path. And when the variable count changes, create a new template rather than editing a live one. Edits that leave placeholders alone carry other consequences, such as the category reassignments in our piece on WhatsApp template categories.
Preventing 132000 in code
Validate the parameter count before the request leaves your service, not after the API rejects it.
- Store the expected counts. Keep the per-component variable count for every template, with its name and language. Refresh it whenever you re-sync.
- Assert before sending. Compare each
parametersarray against the stored count and reject locally if they differ. A local failure traces faster than a 400. - Fail loudly in staging, safely in production. In staging, raise the mismatch. In production, route that message to a dead-letter queue.
- Build
componentsfrom a typed structure, never string concatenation. A missing value then becomes a null your code can catch, not an entry that quietly disappears. - Log the component and both counts as separate fields. Parsing them out at ingestion makes every later query trivial.
These checks belong with your other send-time rejections. For failures that surface after a message is accepted, see our guide to WhatsApp messages not being delivered; for volume ceilings, our reference on WhatsApp API rate limits.
132000 versus the other template send errors
Error 132000 is a counting problem inside a template that exists and is approved. Nearby codes fail for unrelated reasons. Each is named as plain text below because its own article is not yet published.
Code | What it points at | Documented HTTP status | Stage of failure |
|---|---|---|---|
132000 | Parameter count does not match the template definition | 400 (MessageBot) | Rejected at send |
132001 | Template does not exist in the specified language, or is not approved | 404 per MessageBot; not stated by Heltar or WANotifier | Rejected at send |
131049 | Message not delivered to maintain healthy ecosystem engagement | Not published by any source we could reach | Accepted, then not delivered |
131050 | Recipient has stopped marketing messages from your business | Not published by any source we could reach; MessageBot's table gives 400 | Accepted, then not delivered |
The distinction that matters operationally: 132000 and 132001 are your bugs, fixable by changing the request or the template. The 131xxx delivery failures are about the recipient, and no payload change resolves them. Sort error handling along that line rather than by numeric proximity.
Frequently Asked Questions
What causes the parameter mismatch?
A gap between the number of variable values in your request and the number the approved template defines. That happens when a placeholder has no entry in parameters, when a component carrying variables is left out of components, when the template was edited after your code was written, or when a value was dropped upstream. The counts show which way the gap runs.
How do I count parameters correctly?
Count placeholders per component, not per message. Count the {{n}} markers in the body, then in the header, then check whether a URL button carries a dynamic segment. Each component with at least one variable needs its own entry in components, holding exactly that many entries in parameters. Placeholders that render as empty text still count.
What about named parameters?
Some platforms let you reference variables by name rather than by position. Named parameters, where your BSP supports them, do not change what 132000 checks: the count still has to match per component. We could not verify current named-parameter rules against Meta's own reference this run, so confirm what your provider supports first.
Why does it fail after I edited the template?
Editing changes the expected count immediately, while your sending tool may still hold the old definition. Platforms cache approved templates locally to build payloads, and that cache does not refresh itself. Re-sync the template after any edit Where the variable count changes, a new template is safer than an edit.
Does 132000 mean my template was rejected?
No. It means the template exists and is usable, and only your parameter count is wrong. Rejection, deletion and approval problems surface as error 132001, whose documented description covers a template that does not exist in the specified language or has not been approved.
Getting template sends right the first time
Parameter mismatches are cheap to fix once and expensive to keep fixing. If you would rather have template definitions, parameter validation and send-time error handling designed into your messaging stack than patched into it, Helo.ai brings 25 years of enterprise communication experience and an AI-first, India-first approach as a Meta Partner and Google RCS Anchor Partner of the Year. Talk to an expert.




