Meta WhatsApp Account Health
The Meta health page in the admin shows the current status of every WhatsApp channel you have connected. The platform polls Meta on a schedule, records each snapshot, and alerts you the moment a snapshot worsens — so you find out about a quality-rating drop within minutes.
When to use it
- You ran a campaign and want to confirm your account didn't take a quality hit.
- You see members reporting they're not getting messages and want to triage from one screen.
- You're about to launch a big broadcast and want to verify you're in the right messaging-limit tier first.
How it works
A background worker (MetaAccountHealthWorker) sweeps every active WhatsApp channel across all tenants and fetches Meta's per-phone health for each. A new MetaAccountHealth row is written each sweep, with these fields:
- Quality rating — Green, Yellow, Red.
- Messaging-limit tier — 250 / 1k / 10k / 100k / unlimited contacts per 24 hours.
- Phone status — Connected, Disconnected.
- Name status — Approved, Pending, Rejected, Flagged.
- Account-review status — Approved, Pending, Restricted.
Snapshots are graded into a numeric severity:
| Severity | Conditions |
|---|---|
| 0 — Healthy | Green quality, all statuses normal. |
| 1 — Warning | Yellow quality, Pending review, or similar mild signals. |
| 2 — Degraded | Red quality, Flagged name, Disconnected phone, Rejected name. |
| 3 — Restricted | Account restricted (no further sending allowed). |
When a snapshot's severity is worse than the previous one for the same channel, a [META-HEALTH-DEGRADED] notification is sent to the platform's ops channel. That's your "act now" signal.
The admin page
Go to Communications → Meta health. The page shows a table of channels with the current snapshot for each. Click a channel for the history view — the last N snapshots over time, colour-coded by severity.
Each row has a Refresh now button (Pages.Communications.MetaHealth.Refresh permission) that triggers a single-channel probe immediately, so you don't have to wait for the next scheduled sweep.
The public endpoint
For external monitoring or demos, a coarse-grained summary is available at:
GET /api/public/meta-health
No authentication. Returns the current per-channel severity (no PII, no Meta tokens). Useful for status pages or uptime monitors.
Step-by-step
Investigate a degraded channel
- Open Communications → Meta health.
- Find the channel showing yellow or red.
- Click for history. Look for the snapshot that triggered the change — what did Meta say (quality drop? template flagged? account review?).
- Cross-reference with your Broadcasts log — what campaign was running at that time?
- Pause the offending campaign or template until you understand the cause.
- Click Refresh now after the next 30 minutes to see if Meta has updated their snapshot.
Set up external alerting
The platform already emits [META-HEALTH-DEGRADED] via the configured ops notifier (typically ntfy). For external alerting (PagerDuty, Slack), point your monitor at /api/public/meta-health and alert on severity ≥ 2.
Limits and gotchas
- Meta's status lags. Meta sometimes takes hours to reflect a degraded snapshot through their API. The platform records what Meta reports — you may see the symptom (delivery failures) before the health page shows the issue.
- Restricted is terminal. Once you're severity 3, only Meta can lift the restriction. The platform stops sending but Meta itself decides when you can resume.
- The worker writes a sentinel row under tenant 1 /
__worker__when the host tick loop wedges, so you can tell "no fresh data" from "no degradation". - Permission:
Pages.Communications.MetaHealth(view) andPages.Communications.MetaHealth.Refresh(manual probe).