Skip to content

WhatsApp Cloud — Production Readiness Audit

FieldValue
Date2026-08-22
StatusGo — post-MVP polish (1.1–1.3) engineering residuals closed; complete ops pre-flight + Phase 1–3 staging smoke before production opt-in traffic
ScopeBillable Marketplace module whatsapp-cloud catalog 1.3.0 (CRM) + Automation catalog 1.1.0 (WA trigger/action)
Branchfeature/whatsapp-cloud-post-mvp-polish
CompanionWhatsApp Cloud deployment · Developer guide · User guide · API · Automation

PRs: Backend #141 · Frontend #134 · Docs #161


Executive summary

WhatsApp Cloud remains a billable CRM Marketplace SKU ($29/mo, $290/yr), not default-included.

CatalogVersionSurface
whatsapp-cloud1.3.0MVP inbox + Lead Source (1.1) + Automation hooks (1.2) + media (1.3)
automation1.1.0whatsapp.message_received trigger + send_whatsapp_template action

Go / No-Go: Go for merge after CI green. Ops must still complete migrations through media bump, Forge queues (whatsapp-inbound, whatsapp-outbound, automations), Meta credentials with META_HTTP_FAKE unset, and staging smoke for Phases 1–3 before customer traffic.

GateResult
Catalog migrate-only bumps to WA 1.3.0 / automation 1.1.0Pass
CatalogSeeder seed versions align with migrate bumpsPass
Lead Source opt-in (auto_create_leads default false)Pass
Automation via IntegrationEventDispatcherPass
Media attachments + soft Storage quotaPass
Inbound MIME allowlist + declared-size quota check before Graph downloadPass
Attachment download scoped to conversation (IDOR denied)Pass
Webhook verify + HMAC; CSRF exempt webhooks/whatsapp/*Pass
Encrypted tenant tokens; OAuth soft-delete restorePass
META_HTTP_FAKE never active in productionPass
Pest WhatsApp suite (module + media + automation)Pass (30+)
Playwright WhatsApp shared session + Automation WA triggerPass
Docs hubs + this readiness page current for 1.3.0Pass

Locked-decision matrix

DecisionBackendFrontendDocs
Packaging billable whatsapp-cloudPassPassPass
Soft Lead link (no hard module dep)PassPassPass
Keep wa.me Communication Templates fallbackPassPassPass
Opt-in Lead Source auto-create (default off)PassPassPass
Automation WA trigger + template actionPassPassPass
Media image/document/audio/videoPassPassPass
Interactive buttons/lists / alternate BSPs / AI WADeferredDeferredDeferred

Catalog version path

MigrationEffect
2026_08_16_100005 / 100006Register WA 1.0.0 + permissions
2026_08_21_234243auto_create_leads, default_lead_source
2026_08_21_234245WA 1.0.0 → 1.1.0
2026_08_21_235205Automation 1.0.0 → 1.1.0, WA 1.1.0 → 1.2.0
2026_08_21_235553whatsapp_message_attachments
2026_08_21_235556WA 1.2.0 → 1.3.0

Production: migrate only. CatalogSeeder now seeds WA 1.3.0 / automation 1.1.0 for local fresh seeds.


Findings (2026-08-22 audit remediations)

IDSeverityFindingResolution
D1HighReadiness/deploy docs claimed 1.0.0 + Deferred polishDocs refreshed
D2MediumDeveloper guide listed polish as deferredCorrected
F12HighSoft-deleted connection blocked OAuth reconnectwithTrashed + restore; Pest
E1LowInbound MIME / download-before-quotaWhatsAppMediaRules allowlist; declared file_size + max 16 MiB checked before Graph binary download
E2LowThin IDOR/quota/Automation WA UI coveragePest IDOR + mime + quota; Playwright Automation WA trigger selectable
E3LowCatalogSeeder WA version driftSeeder → WA 1.3.0, automation 1.1.0

Ops (not code blockers)

IDSeverityFindingOwner
O1MediumCompanion CI Quality Gates on polish PRsEng
O2MediumForge: whatsapp-inbound, whatsapp-outbound, automationsOps
O3MediumMeta App Review + production URLs; META_HTTP_FAKE unsetOps

Deploy order

  1. Backend — migrate through 2026_08_21_235556; workers include WhatsApp + automations queues
  2. Frontend — SPA with Lead Source settings + media attach
  3. Docs — this readiness page + deploy/user/dev/API
  4. Staging smoke (Phases 1–3) before production traffic

Suggested merge order: Backend → Frontend → Docs.


Pre-flight checklist

#CheckOwnerPass?
1Migrations through 2026_08_21_235556 (attachments + catalog 1.3.0)Ops
2Catalog whatsapp-cloud = 1.3.0; automation = 1.1.0 where WA Automation is usedOps
3Queue workers: whatsapp-inbound, whatsapp-outbound, automationsOps
4Meta WhatsApp product; webhook {APP_URL}/webhooks/whatsapp/cloud; OAuth {APP_URL}/api/oauth/whatsapp/cloud/callbackOps
5Central/env Meta secrets; META_HTTP_FAKE unset; stable APP_KEY; FRONTEND_URL matches SPA originOps
6Marketplace purchase → pending → payment/activate before inbox entitlementsOps
7Pest WhatsApp directory greenEng
8Playwright test:e2e:whatsapp-cloud + Automation WA trigger case greenQA
9Storage entitled for media workspaces; Leads entitled for Lead Source / soft-linkOps

Staging smoke (human)

MVP baseline

  1. Marketplace → install WhatsApp Cloud
  2. Staff with view+send sees inbox when connected
  3. Admin Connect → OAuth → select WABA → select phone
  4. Inbound → reply inside 24h; template outside 24h
  5. Soft-link / unlink Lead; Lead detail Inbox filter; wa.me when Comm Templates entitled
  6. needs_reauth banner + notification
  7. Disconnect → history retained; phone id reclaimable

Phase 1 — Lead Source (1.1.0)

  1. Enable Auto-create leads; save default source label; inbound from unknown number creates/links Lead
  2. Disable auto-create → no Lead write

Phase 2 — Automation (1.2.0 / automation 1.1.0)

  1. Workflow: trigger whatsapp.message_received → observe run
  2. Action send_whatsapp_template resolves conversation; blocked if WhatsApp not entitled

Phase 3 — Media (1.3.0)

  1. Inbound image/document → DownloadWhatsAppMediaJob → downloadable in inbox
  2. Outbound attach inside 24h; outside 24h media rejected
  3. Disallowed MIME / over-quota inbound does not store attachment
  4. Storage used bytes include WhatsApp attachments

Rollback

LayerAction
FrontendRedeploy previous SPA
Backend codeRedeploy previous release; keep additive migrations
Module disableMarketplace uninstall / cancel
SchemaDo not roll back WhatsApp migrations without a data plan

Monitoring

  • Queues: whatsapp-inbound (webhook + media download), whatsapp-outbound, automationsphp artisan queue:failed
  • Connection status / last_error / phone health
  • Notification types: whatsapp.inbound, whatsapp.send_failed, whatsapp.needs_reauth
  • Storage usage / soft quota denials on media
  • Meta Graph 4xx/5xx in application logs

Sign-off

RoleNameDateDecision
Eng☐ Ready
QA☐ Ready
Ops☐ Ready

Release decision: Go — merge companions after CI green; complete staging smoke (Phases 1–3) and Forge queue/Meta setup before production opt-in traffic.

Official documentation for the EloSync SaaS Platform.