Skip to content

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

1

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.

2

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.

3

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_v2 tells 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 demo

Talk to InfiQ

See what WhatsApp can do for your business

Tell us your volume — we map templates, estimate cost, and get you a sandbox in about 2 hours.

Step 1 of 2
WhatsApp

Protected by invisible spam checks · replies within 1 working day

Meta Business Partner

Submit 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.

7-day free trial Enterprise-grade reliability Live in 2 hours Built for Indian businesses