Why was my WhatsApp template rejected?

Meta rejected the template's content, or its submission failed before approval; the submitted language's status and reason identify which happened.

A template can look active while a replacement language has failed review. Investigate the version you submitted so an earlier approval does not hide the unsuccessful change.

Which status identifies the problem?

A rejected status means Meta refused the content. submit_failed means submission did not complete. pending means no result is settled yet. Read status on the submitted version's language before choosing a fix.

The language record distinguishes these outcomes:

StatusWhat happenedNext action
rejectedMeta refused the contentInspect the rejection reason and correct a new draft
submit_failedSubmission did not completeInspect the error and address its cause
pendingNo verdict yetWait for a verdict and read the language again

For a content refusal, compare the stated reason with the template guidelines. A submission error can instead concern credentials, media or request delivery.

Message wording is only one possible cause. Credentials, media and request delivery can also fail.

Why did submission fail before approval?

The request could not complete because of a local preparation problem, Meta's refusal or exhausted delivery attempts.

Read error.description to identify the recorded cause. Examples include an unusable account credential, a conflicting derived template name or media that cannot be prepared.

For media, check the stated URL, size or format problem. Changing message wording does not repair an inaccessible or unsuitable asset.

A meta_error_code identifies a refusal recorded from Meta. Bird omits it for its own failures. Meta can also omit a code from its refusal.

Use the description with the status before deciding who must act. Keep the recorded code when asking support to investigate a Meta refusal.

When delivery retries run out, Bird checks whether Meta holds the submitted content before resolving the result. Follow the recorded outcome instead of assuming that a timeout proves nothing arrived.

Why is there no rejection object?

Bird omits rejection when Meta supplies no rejection reason, even if the language's status is rejected.

Branch on status rather than the presence of that object. A missing reason does not make the language approved or sendable.

When present, rejection.reason carries Meta's reason. A recommendation can accompany it, but not every refusal includes one.

Keep the submitted template identifier, version and language when seeking support for a refusal without details. Those identify the review that needs investigation.

What should I do while a language is pending?

Read the language again until its status changes. Do not create another submission from that status alone.

A pending language is not yet approved or rejected. Writes, deletion and reversion are blocked with E15020 until it settles, so no change can overtake the verdict on the content you submitted.

The language's whatsapp_manager_url opens it in WhatsApp Manager. The link can take a minute after submitting to appear.

Contact support with the template identifier if the language stays pending. Another submission does not settle the original.

How do I correct the template and confirm the retry?

For rejected, fix the cause through a fresh draft. For submit_failed, do so after Bird confirms the request did not land. Submit the corrected language. Then check the language state to confirm the retry settled.

Bird keeps submitted versions immutable. Open a new draft rather than trying to overwrite the version whose review failed.

If the account is also restricted or banned, Meta controls that account decision.

Run validation before submitting. A clean validation result checks Bird's content rules but does not predict Meta's approval.

After submission, inspect that version with bird whatsapp templates versions languages get. The template's aggregate status can still describe an earlier live version.

An earlier active template therefore does not prove the replacement passed. Confirm the submitted language's verdict before using its changed content.

In short

  1. Start with the submitted language's status.

    rejected is a content verdict. submit_failed means submission failed. pending means no result is settled yet.

  2. Use the matching reason field.

    Read rejection for a content refusal and error for a submission failure. Missing reason details do not change the status.

  3. Do not resubmit a pending language.

    Meta may already hold the submission. Read the language again and contact support if it stays pending.

  4. Correct content in a fresh draft.

    A submitted version is immutable. Follow the new version's language after resubmitting, rather than the template's earlier live state.

Build on the same network.

A test API key is yours immediately. Production unlocks when you add a payment method and verify a sender.

Start building with Bird in minutes.