WhatsApp

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, while outcome_unknown means no response was confirmed. 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
outcome_unknownNo confirmed response to the submissionWait for reconciliation and read the language again
pendingThe language is under reviewWait for a verdict

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 with outcome_unknown?

Read the language again while Bird reconciles the submission with Meta. Do not create another submission from that status alone.

The request may already have reached Meta. Bird keeps the language in flight because changing it would act on an unconfirmed outcome.

The lock prevents changes while the language's outcome is unresolved. Writes, deletion and reversion remain blocked with E15020 while the language is in flight. Wait for a settled state before making those changes.

If Meta holds matching content, Bird adopts its recorded state. The language can become approved, rejected or pending, depending on Meta's decision.

If Bird confirms the submission did not land, it records submit_failed. When it cannot establish either result, it keeps the language in flight.

Contact support with the template identifier if the outcome stays unresolved. Repeated submissions do not resolve whether Meta accepted 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, while outcome_unknown needs reconciliation before another attempt.

  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 an unknown outcome.

    Meta may already hold the submission. Read the language again and contact support if the uncertainty persists.

  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.

Your next idea.
Ready to connect.