Free tool
Catch template JSON errors before Meta's API does
Paste your template-create payload and get an instant lint report — missing example values, variable gaps, character limits and button rules, all checked locally in your browser.
Paste the exact payload you send to the message_templates endpoint. Validation runs as you type and everything stays in your browser — nothing is uploaded.
Lint report
Paste a template-create payload on the left, or load the sample to see every check in action.
Checks
Results appear here about a second after you stop typing, or immediately when you press Validate.
How it works
Three steps, no signup
Paste your payload
Drop in the exact JSON you send to the message_templates endpoint, or load the sample to see a payload that passes every check.
Read the lint report
Each rule shows as a pass, warning or error with a plain-English explanation — including the example-values mismatch that causes most silent rejections.
Fix and copy
Correct the errors, watch the report update as you type, then copy the normalised, pretty-printed JSON straight into your API call or dashboard.
Good to know
Why template payloads fail — and how to stop guessing
The template-create endpoint is stricter than its documentation reads, and its error messages are famously unhelpful. The most common failure is also the quietest: a mismatch between the variables in your body text and the sample values in example.body_text. Write three placeholders but supply two samples — or forget the example block entirely — and the submission fails with a generic error that says nothing about examples. Developers then burn time second-guessing the body copy, the category, the buttons, everything except the actual cause. Checking the count locally takes a second and removes the guesswork.
Validating before you submit matters for a second reason: review cycles are a real cost. A rejected submission does not just bounce — repeated failed attempts on the same name can slow you down, and if the payload gets far enough to enter content review, you wait on Meta's queue before you can try again. Structural mistakes are entirely mechanical, which means they are entirely preventable. A local lint pass — sequential variables, no placeholder at the start or end of the body, header text within 60 characters, footer free of variables, button set within the allowed combinations — keeps review cycles reserved for what actually needs human judgement: the content itself.
- Name templates like code, not prose.
order_shipped_utility_v2tells a teammate the purpose, category and revision at a glance; template_final_new2 does not. - Version with a suffix, always. Names are effectively immutable once approved, so a change of copy means a new name. A consistent _v2, _v3 convention keeps old and new versions distinguishable in your dashboard and your code.
- Keep sample values realistic.Reviewers see the filled-in message. “Asha” and “#4821” read like a real notification; “test” and “xxx” invite closer scrutiny.
One caveat worth stating plainly: passing every structural check does not guarantee approval. Meta still reviews the content — category fit, clarity, policy compliance — and no offline tool can predict that outcome. What a linter can do is make sure that when a template is rejected, it is rejected for a reason worth reading, not because a sample value went missing.
FAQ
Frequently asked questions
Why does Meta reject a template that is valid JSON?
Parsing is only the first hurdle. The template-create endpoint enforces structural rules on top of JSON syntax: exactly one BODY component, sequential {{1}}, {{2}} variables, sample values in example.body_text that match the placeholder count, character limits per component and strict button combinations. A payload can be perfectly valid JSON and still fail every one of those checks.
What is the example.body_text field and why does it matter?
If your body text contains variables, Meta requires sample values so reviewers can see the filled-in message. They go in example.body_text as an array containing one inner array with exactly one value per variable. A count mismatch — three placeholders but two samples — is the single most common reason a syntactically correct payload gets rejected, and the API error message rarely makes the cause obvious.
What are the rules for template names?
Names may only contain lowercase letters, digits and underscores, up to 512 characters. They must also be unique per language within your WhatsApp Business Account, and once a template is approved its name cannot be changed. That is why teams suffix names with a version marker like _v2 — a revised template is effectively a new template.
Which button combinations does WhatsApp allow?
A template can carry up to three quick-reply buttons, or a call-to-action set with at most one URL button and one phone-number button (two CTAs total). Quick replies and CTA buttons cannot be freely mixed in the classic components format, button labels are capped at 25 characters, and URL buttons must point to a valid https address.
Does this validator send my JSON anywhere?
No. Everything runs in your browser — the payload is parsed and checked locally and nothing is uploaded to any server. You can safely paste payloads that contain real customer-facing copy, internal URLs or phone numbers.
Still have questions?
Book a demoMore free tools
Keep your stack sharp
Webhook Payload Formatter
Pretty-print and annotate WhatsApp webhook payloads for faster debugging.
Open toolTemplate Variable Checker
Lint {{n}} variables — gaps, duplicates and edge-position mistakes.
Open toolPhone Number Formatter
Convert phone numbers to E.164 — single numbers or whole lists.
Open toolMedia Size Checker
Check images and files against WhatsApp media limits — in your browser.
Open toolSubmit and track templates without touching raw JSON
InfiQ's dashboard and developer API handle template creation, approval tracking and sends on the official WhatsApp Business API — 7-day free trial, no card required.
