> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Troubleshooting: WhatsApp campaign auto-paused on a RED quality rating (WHATSAPP_QUALITY_RED)

> Read an auto-paused WhatsApp campaign marked WHATSAPP_QUALITY_RED, tell Meta's auto-pause from an operator pause, inspect the per-channel quality rating, and recover it in Meta Business Manager.

# Troubleshooting: WhatsApp campaign auto-paused on a RED quality rating

A WhatsApp campaign goes to `paused` the moment you launch it, and the
campaign record says why: `failure_code: WHATSAPP_QUALITY_RED`. That is
Orbit's pre-send quality gate, not a bug in the launch — the launch
refused to queue sends because Meta's quality rating on your WhatsApp
Business phone number is `RED`, and raising the rating is a Meta-side
fix, not an Orbit-side one. This page reads the pause, checks the
rating, and walks the recovery.

<Note>
  The quality rating is Meta's signal, computed from how your recipients
  react to your numbers — blocks, reports, and negative feedback weigh
  against you. Orbit reads the rating Meta reports and enforces a hold
  while it is `RED`; nothing in this page changes the rating itself.
  Recovery happens in Meta Business Manager.
</Note>

## Symptoms

The pause has a specific signature — check the campaign before treating
it like a routine operator pause:

* The campaign goes to `paused` immediately on launch instead of
  sending. The launch request returns a 503 with
  `code: "CHANNEL_UNAVAILABLE"` and message
  `"WhatsApp quality rating is RED — messaging paused by Meta"`.
* The campaign's `metadata` carries the full auto-pause stamp:
  `auto_paused_reason: "whatsapp_quality_red"`,
  `failure_code: "WHATSAPP_QUALITY_RED"`, a human-readable
  `failure_reason`, and a `failure_at` timestamp.
* A `campaign.paused` webhook fires with
  `reason: "whatsapp_quality_red"` in the payload. The envelope is
  deliberately identical to an operator pause — automation that listens
  for campaign pauses sees every pause class — so the deciding field is
  the webhook payload `reason` (or `metadata.failure_code` on the
  campaign record), not the event type.
* The dashboard banner on the campaign-detail page tells you Meta
  paused messaging rather than a teammate clicking Pause.

If `metadata.failure_code` is a different value — a credit cap, a
circuit-break, or anything else — you are on the wrong page. If the
field is absent entirely, someone paused the campaign by hand; check
with your team before you chase a Meta quality issue.

## What the quality rating is

Meta assigns every phone number on your WhatsApp Business account one
of three ratings, reported on the phone-number record in Meta Business
Manager and synced to Orbit through Meta's quality webhooks and the
scheduled WABA health reconcile:

* `GREEN` — normal. Campaign and one-off sends proceed.
* `YELLOW` — degraded recipient feedback. Orbit still sends, but the
  launch log notes the reduced rate, and Meta may throttle the number's
  throughput. Treat it as an early warning.
* `RED` — recipients are blocking or reporting this number heavily.
  Meta itself pauses messaging, and Orbit refuses to queue new campaign
  sends until the rating recovers.

The thresholds and the feedback signals Meta weighs are Meta's own —
see
[Meta's quality rating documentation](https://developers.facebook.com/docs/whatsapp/overview/business-communications/quality-rating).
The rating moves as Meta re-scores your recent recipient feedback; a
recovered rating flows back to Orbit on the next webhook or scheduled
reconcile, and the gate lifts.

## Inspect the rating

Read the per-channel quality posture from the unified Brand Identity
endpoint — the same read-only rollup that backs the dashboard's trust
score:

```bash theme={null}
curl "https://api.orbit.devotel.io/api/v1/brand-identity/status" \
  -H "X-API-Key: $ORBIT_API_KEY"
```

The `channels` array carries a per-channel entry; on WhatsApp that is
the `whatsapp_business` entry with Meta's live posture for your sender
(reads are fail-soft — one unreachable source degrades its own channel
entry, never the whole response). The dashboard renders the same read
under **Settings → Brand Identity**. Cross-check in Meta Business
Manager (WhatsApp Manager → your phone number) if the API read and the
banner disagree — Meta is the source of truth, and the rating in
Orbit's store refreshes on webhook or reconcile cycles.

<Note>
  The quality rating attaches to the **phone number** on your WABA, not
  to a single template. Every WhatsApp campaign routed through that
  number hits the same gate, so auto-paused campaigns queue up in
  parallel — they are all symptoms of the same number-level rating.
  (The per-template `paused` status in Meta's template list is a
  separate signal; both tell you recipients are rejecting the content.)
</Note>

## Recovery

The only way out is through Meta — work this in order:

1. **Fix what recipients are reacting to.** In Meta Business Manager,
   open the phone number's Insights and find which templates earn
   blocks and reports. Rework them so the first line states why the
   recipient is getting the message, and remove anything promotional
   from utility and authentication templates. The
   [template troubleshooting page](/troubleshooting/whatsapp-template)
   walks the content rules; the
   [content policy](/compliance/whatsapp-content-policy) lists what
   Meta rejects.
2. **Wait for the rating to recover.** Meta re-scores on a rolling
   window of recent feedback, so the rating climbs back to `YELLOW` or
   `GREEN` as recipients of later traffic stop blocking and reporting.
   The recovery lands in Orbit on Meta's quality webhook or the
   scheduled health reconcile — no Orbit action is required to notice
   it.
3. **Resume the campaign once the rating is `YELLOW` or `GREEN`.**
   Re-launch the paused campaign (it is still full of the same
   recipients), and sends already stamped with counters continue from
   where the counter record left off.

If the rating stays `RED` across a full feedback window even after the
content fix, treat it as a Meta-side dispute: appeal through Meta
Business Support with the recipient-feedback evidence. The escalation
payload on the
[template page](/troubleshooting/whatsapp-template#escalation-payload)
is a good one-message packet for that appeal too.

## What not to do

* **Do not resume the campaign while the rating is still `RED`.** The
  quality gate re-runs at launch and auto-pauses it again — the same
  `WHATSAPP_QUALITY_RED` stamp, and every launch attempt is counted
  against nothing. Fix the content, wait for `YELLOW` or `GREEN`, then
  resume.
* **Do not disconnect and re-connect the WABA.** The quality rating
  follows the phone number at Meta, not the connection state in Orbit.
  Re-onboarding reads the same `RED` rating, and the next launch
  auto-pauses again.
* **Do not route the campaign through a different phone number on the
  same WABA expecting a cache.** The rating is per phone number, but
  recipient feedback for a shared number family weighs on one another —
  and splitting recipients across numbers to dodge the gate is exactly
  the pattern Meta's enforcement catches. Fix the content.
* **Do not treat the pause as a campaign bug.** The gate fires at
  launch because Meta already reported `RED`; re-creating the campaign
  changes nothing about that.

## See also

* [Troubleshoot WhatsApp templates](/troubleshooting/whatsapp-template) —
  the content-side fix workflow the quality recovery in this page
  depends on.
* [Troubleshoot the WhatsApp connection](/troubleshooting/whatsapp-connection) —
  full account-level states (`WHATSAPP_ACCOUNT_LOCKED`,
  `WHATSAPP_CONNECTION_INVALID`) the quality gate is one member of.
* [Brand identity and trust score](/concepts/brand-identity-trust-score) —
  the per-channel rollup the inspect step here reads.
* [WhatsApp billing issue](/troubleshooting/whatsapp-billing-issue) —
  the parallel Meta-side block (131042 payment hold) that also
  auto-pauses sends but is a billing, not a quality, problem.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.