Register a WhatsApp Business phone number and verify it is active via the Cloud API (Meta) or an approved BSP
Submit a message template for approval via POST to /v{version}/{whatsapp-business-account-id}/message_templates with category set to UTILITY and the template components body
Once the template status is APPROVED, send an outbound notification via POST to /{phone-number-id}/messages with type:template, the approved template name, language code, and component parameters
Configure a webhook endpoint in Meta App Dashboard to receive inbound message events (messages.type=text) from customers who reply
Within the 24-hour customer service window opened by the reply, send free-form service messages via POST to /{phone-number-id}/messages with type:text — no template required
After window expiry, re-engage only with an approved template message; track window state by recording the timestamp of the customer's last inbound message
Known gotchas
Meta moved to per-message billing on July 1, 2025 — pricing is no longer per 24-hour conversation session; monitor message-level costs rather than session counts to avoid budget surprises
Template approval can be rejected or require revision without a clear explanation; build a fallback flow that can re-submit a corrected template and track approval status via GET on the template ID
The 24-hour service window clock resets on each inbound customer message, not on your outbound replies — failing to track the true last-inbound timestamp can cause free-form messages to be rejected as outside the window
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp