logo
image
May 27, 2026 - 09:30 AM

How to Build WhatsApp Automation Flows with Templates, Buttons, CTA URLs, and Interactive Lists

WhatsApp automation flows combine templates, button messages, CTA URL buttons, and interactive lists into a single conversation that feels guided. With Wutt’s flow builder, you design the journey once and the runtime sends the right template to the right contact at the right time, with full branching and human handoff. This guide shows the visual flow and the underlying JSON you would post to the WhatsApp Cloud API.

The visual flow (text diagram)

START
  |
  v
[Trigger: contact added to list "Demo request"]
  |
  v
[Wait: 2 minutes]
  |
  v
[Send template: demo_welcome_v1]
  Buttons: [Book a demo] [See pricing] [Talk to sales]
  |
  +-----> Book a demo  -> [Send list: time slots]  -> [Wait for reply]  -> END
  |
  +-----> See pricing  -> [Send template: pricing_v1 with PDF]  -> END
  |
  +-----> Talk to sales  -> [Assign to agent: Sales]  -> END

  (any other inbound reply)
  |
  v
[AI assistant draft] -> [Agent approves] -> END

Step 1 — Create the approved templates

Go to Templates → New and create one Meta-approved template per node. The button payload is what Wutt maps to the next node in the flow.

Step 2 — Create the contact list and tag

Use Contacts → Lists → New list named “Demo request”. The trigger subscribes the contact to this list automatically. Tags (e.g. hot-lead) are useful for filtering and for AI training data.

Step 3 — Build the flow in Wutt

Open Automations → Flows → New flow. Drag these blocks from the right panel:

  • TriggerContact added to list.
  • Delay — 2 minutes.
  • Send templatedemo_welcome_v1.
  • Branch on button — 3 buttons, 3 outgoing edges.
  • Send list — for the “Book a demo” branch.
  • Wait for reply — up to 24 hours.
  • Assign to agent — for the “Talk to sales” branch.
  • AI assistant draft — for unexpected replies.

Step 4 — The same flow in raw WhatsApp Cloud API JSON

If you ever want to send a button template directly via the WhatsApp Cloud API, the JSON looks like this:

{
  "messaging_product": "whatsapp",
  "to": "{{customer_phone}}",
  "type": "template",
  "template": {
    "name": "demo_welcome_v1",
    "language": { "code": "en" },
    "components": [
      {
        "type": "header",
        "parameters": [
          { "type": "image", "image": { "link": "https://wutt.net/img/demo-hero.png" } }
        ]
      },
      {
        "type": "body",
        "parameters": [
          { "type": "text", "text": "{{customer_first_name}}" },
          { "type": "text", "text": "{{company_name}}" }
        ]
      },
      {
        "type": "buttons",
        "buttons": [
          { "type": "url",   "text": "Book a demo",  "url": "https://wutt.net/book/{{customer_id}}" },
          { "type": "url",   "text": "See pricing",  "url": "https://wutt.net/pricing" },
          { "type": "phone_number", "text": "Talk to sales", "phone": "+966500000000" }
        ]
      }
    ]
  }
}

Step 5 — Interactive list message (slot picker)

For the “Book a demo” branch, the list message lets the customer pick a slot without leaving WhatsApp. JSON:

{
  "messaging_product": "whatsapp",
  "to": "{{customer_phone}}",
  "type": "interactive",
  "interactive": {
    "type": "list",
    "header": { "type": "text", "text": "Pick a demo time" },
    "body":  { "type": "text", "text": "Choose a slot this week, we will confirm by reply." },
    "footer": { "type": "text", "text": "Wutt Sales" },
    "action": {
      "button": "See times",
      "sections": [
        {
          "title": "Tomorrow",
          "rows": [
            { "id": "slot-1030", "title": "10:30 AM", "description": "30-min demo with Layla" },
            { "id": "slot-1330", "title": "1:30 PM",  "description": "30-min demo with Omar" }
          ]
        },
        {
          "title": "Friday",
          "rows": [
            { "id": "slot-1500", "title": "3:00 PM", "description": "30-min demo with Sara" }
          ]
        }
      ]
    }
  }
}

Step 6 — CTA URL button on a template

For the “See pricing” branch, use a CTA URL button (one per template):

{
  "messaging_product": "whatsapp",
  "to": "{{customer_phone}}",
  "type": "template",
  "template": {
    "name": "pricing_v1",
    "language": { "code": "en" },
    "components": [
      { "type": "body", "parameters": [
        { "type": "text", "text": "{{customer_first_name}}" }
      ]},
      { "type": "button", "sub_type": "url", "index": 0,
        "parameters": [ { "type": "text", "text": "{{utm_source}}" } ] }
    ]
  }
}

Step 7 — Human handoff

Any reply that is not a recognized button or list id is routed to the AI assistant for a draft, then to a human agent. Wutt logs the handoff so you can review which flows leak into the inbox and improve them.

Step 8 — Test, ship, measure

Use the Preview button to dry-run the flow with a test number. Then click Activate. Open Reports → Flow performance to see send, open, click, and conversion numbers per node.

Best practices

  • One template per message — do not chain multiple templates in the same send window.
  • Always include at least one button so the customer does not have to type.
  • For Arabic campaigns, prepare a parallel _ar version of every template.
  • Use CTA URL buttons for the “primary action” and quick-reply buttons for “yes/no” branching.

Build WhatsApp automation flows without a developer.

Wutt’s flow builder turns templates, buttons, CTA URLs, and lists into revenue-ready conversations.

Add Wutt to your business — start $1 trial