How to use interactive buttons on the WhatsApp Business API
Interactive buttons turn a passive WhatsApp message into a tap-to-reply experience: instead of typing "yes", "track my order" or "talk to an agent", your customer taps a labelled button and your flow reacts instantly. On the official WhatsApp Business API there are two distinct button types — quick-reply buttons (up to three, that send a payload back to your webhook) and call-to-action buttons (URL and phone-number buttons that open a link or dial a number). This tutorial walks through building both with InfiQ, an official Meta Business Partner, from template creation to going live — plus the mistakes that most often trigger template rejections or silent button failures.
What you'll do
Create a template with a BUTTONS component (quick-reply or call-to-action), get it approved in the right category, send it, and listen for the button reply on your webhook. InfiQ gives you a no-code template builder and handles the API plumbing, so most teams are live in under an hour.Step 1 — Decide which button type you actually need
Before you build anything, pick the right button type, because the two behave completely differently and mixing them up is the number-one cause of wasted setup time. Quick-reply buttons send a structured payload back to your webhook when tapped, which makes them ideal for menus, confirmations and routing ("Confirm order", "Reschedule", "Talk to support"). Call-to-action (CTA) buttons don't notify your webhook at all — a URL button opens a link (payment page, tracking URL, catalogue) and a phone-number button dials your team. You cannot combine quick-reply and CTA buttons in the same template, and each has its own limits, so decide the interaction first and design the message around it.
- Quick-reply buttons: up to 3 per message, each returns a payload to your webhook — use for choices and automation branches.
- URL button: opens a web link; supports one dynamic variable in the URL for per-customer links (e.g. an order-specific tracking page).
- Phone-number button: dials a fixed number — no variable, no webhook event.
- Rule of thumb: if your bot needs to *know* which button was pressed, use quick-reply; if you just need to send the customer somewhere, use a CTA button.
Step 2 — Build and submit the button template in InfiQ
All buttons attached to business-initiated messages live inside an approved message template, so this is where the real work happens. In the InfiQ dashboard, open Template management and create a new template, then add a BUTTONS component and drop in your buttons. Choose the category honestly — this directly affects both approval and cost, because WhatsApp bills per delivered message by category. A promotional menu is Marketing; an order confirmation or shipping update is Utility; a login or OTP flow is Authentication (and Authentication templates have their own fixed button pattern). Keep button labels short (25 characters or fewer), action-oriented and non-deceptive; a URL button that says "Track order" must actually open a tracking page. Submit for review and InfiQ surfaces Meta's approval status back to you, usually within minutes to a few hours.
- Add the BUTTONS component, then add quick-reply OR call-to-action buttons (not both).
- Pick the category by intent: Marketing, Utility, or Authentication — this drives the per-message rate.
- Label limit is 25 characters; make labels describe exactly what the tap does.
- For a dynamic URL button, add a variable to the URL suffix and provide a sample value so the template passes review.
Step 3 — Send the template message with buttons
Once the template is approved you send it like any other template message — the buttons are already baked into the approved template, so at send time you only supply the variable values (body placeholders and, for a dynamic URL button, the button variable). Business-initiated messages always require an approved template and a valid opt-in; you can only send free-form interactive messages (not requiring a template) when the customer has messaged you within the last 24 hours, inside the free service window. In InfiQ you can trigger the send from a no-code broadcast or automation, or hit the API directly if you're building a custom flow. Every delivered template message is billed by its category — the 24-hour service window itself is free and is not a billing unit, so replies you send inside it don't add per-message template charges of their own.
- Business-initiated (proactive) sends require an approved template plus opt-in — quick-reply and CTA buttons ride inside it.
- Inside the 24-hour service window (customer messaged you last) you can send free-form interactive button messages without a template.
- Provide only the runtime values at send time — button structure is fixed at approval.
- Delivered template messages are billed per message by category (Marketing / Utility / Authentication).
Step 4 — Capture the button tap on your webhook
This is the step teams most often forget, and it's why buttons appear to "do nothing". When a customer taps a quick-reply button, WhatsApp sends an inbound webhook event to your configured endpoint containing the button's payload (the ID you set) and its display text. Your application reads that payload and branches — mark the order confirmed, open a support ticket, or send the next step of the flow. CTA URL and phone buttons do not fire this event, so never rely on a webhook to detect that someone opened a link. If you're using InfiQ's no-code automation, you map each button payload to a next action in the builder; if you're on the API, make sure your webhook is subscribed to message events and that you're parsing the interactive button reply object, not just plain text messages.
- Quick-reply tap → inbound webhook with the button payload/ID and title text.
- Match the incoming payload to the branch or automation you want to run next.
- No-code: map each button to its next action inside InfiQ's flow builder.
- API: subscribe to message webhooks and handle the interactive button-reply object explicitly.
Step 5 — Test end-to-end, then go live and monitor
Test with your own number before you broadcast to anyone. Send the template to yourself, tap each quick-reply button and confirm the correct webhook payload arrives and the right branch runs; open each URL button and check the link resolves (including the dynamic variable if you used one); dial the phone button and confirm it reaches the right team. When it all works, go live gradually rather than blasting your whole list — warm up a new number with lower volume first, because sending high volume from a cold number hurts your quality rating and can throttle delivery. After launch, watch delivery and read status, tap-through on your quick-reply buttons, and your template quality rating in the dashboard so you can fix a wobbly template before Meta pauses it.
- Self-test every button: quick-reply payloads, URL resolution, and phone dial.
- Warm up a new number with gradual volume before high-volume broadcasts.
- Monitor delivery, read receipts, button engagement and template quality rating.
- If a template's quality drops, revise the copy or category and resubmit rather than pushing more volume through it.