WhatsApp Cloud API — Interactive Messages

WhatsApp Interactive Messages: Reply Buttons, Lists, and CTA URL Buttons

Three interactive message types, three different character-limit tables, and one shared rule that quietly breaks automated flows: none of them can be sent once the 24-hour customer service window has closed.

Reply Buttons

Up to 3 predefined replies attached to a message.

  • Body text: up to 1,024 characters
  • Footer text: up to 60 characters
  • Button label: up to 20 characters, must be unique per message
  • Button ID: up to 256 characters
  • Optional header: text or media
  • Tap fires a button_reply webhook (id + title)

List Messages

A single button that reveals a scrollable menu.

  • Body text: up to 4,096 characters
  • Footer text: up to 60 characters
  • Button label: up to 20 characters, single button only
  • Up to 10 sections, 10 rows total across all sections
  • Section title & row title: up to 24 characters each
  • Row description: up to 72 characters
  • Tap fires a list_reply webhook (id + title + description)

CTA URL Buttons

A single button that opens an external link in the browser.

  • Body text: up to 1,024 characters
  • Footer text: up to 60 characters (required if used)
  • Button label: up to 20 characters
  • Only one URL button per message
  • Header: text, image, video, or document
  • Opens the link directly — not a WhatsApp reply

The shared trap: the 24-hour session window

Reply buttons, list messages, and CTA URL buttons are all service messages under Meta’s customer service window rule. They can only be sent while that window is open — started by an inbound message or call from the user, and reset each time the user messages again. Once the window closes, only a pre-approved message template can go out, and template buttons follow their own, more limited component rules — they are not a drop-in replacement for the free-form interactive object.

1

Match the message type to the decision the user actually needs to make — a binary choice fits reply buttons, a multi-option menu fits a list, and sending someone to an external page fits a CTA URL button.

2

Design copy against the tightest limit in the flow, not the most generous one. A list message’s 24-character row title is the real ceiling, even though the same message body allows up to 4,096 characters.

3

Track the customer service window server-side so a scheduled or SaaS-triggered interactive message never fires after the window has silently closed.

4

Handle both button_reply and list_reply webhook shapes separately — list_reply carries an extra description field that button_reply does not.

Where automated flows break in practice

  • A row or section title over 24 characters gets silently truncated on the client — it will not show up as an error in the API response.
  • An interactive message sent after the customer service window has closed returns a delivery failure that looks like a token or permission problem, not a timing one.
  • Row IDs that collide across sections change which payload a selection actually maps to on the webhook side.
  • Chatbot and scheduler builders that reuse one body/footer string across all three types run into the CTA URL button’s stricter combined limits without noticing until send time.