> ## Documentation Index
> Fetch the complete documentation index at: https://apidoc.bulkneo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Buttons and lists are best-effort

> Why a 200 on an interactive message does not mean the buttons appeared, and what to do instead.

Two message types — [buttons](/api-reference/messages/buttons) and [list menus](/api-reference/messages/list) — are marked **best-effort**. This page explains what that means, because it is the single most likely thing to surprise you.

<Warning>
  A `200` on these endpoints means **the message was accepted for delivery**. It does not mean the recipient's WhatsApp rendered buttons.
</Warning>

## What actually happens

WhatsApp has progressively withdrawn interactive message templates from clients that are not the official Business Platform. Whether one renders depends on the recipient's app build and their account — things neither you nor we can inspect before sending, and cannot inspect afterwards either.

So on any given send, the recipient may see:

* the buttons or menu, working as you designed; or
* a **plain-text fallback** — your title and description as ordinary text, with no tappable anything; or
* nothing useful at all.

The messaging layer reports the send as successful in every one of those cases, because it genuinely sent something.

## How the API tells you

Every successful response from these two endpoints carries two extra fields:

```json theme={null}
{
  "success": true,
  "data": {
    "type": "buttons",
    "status": "sent",
    "message_id": "3EB0C1D2F4A5B6C7D8E9",
    "best_effort": true,
    "note": "Interactive messages are best-effort: many WhatsApp clients no longer render them and may show a plain-text fallback instead. A successful response means the message was accepted for delivery, not that the buttons will appear. Do not depend on it for anything critical — send a text message with clear instructions as a fallback."
  },
  "request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}
```

`best_effort: true` is on the payload every single time, deliberately. A developer reading `"status": "sent"` and nothing else would reasonably conclude their buttons work — and would find out otherwise from their own customers.

## You cannot receive the tap

Even where buttons **do** render, the response goes into the WhatsApp conversation on the phone. There is **no webhook and no endpoint** that delivers it to your system.

So a `row_id` or a reply button `id` is only meaningful to a human reading the chat. It cannot drive your workflow.

<Warning>
  Do not design a flow that depends on receiving a button press. That path does not exist in this API — see [What is not available yet](/guides/not-available-yet).
</Warning>

## What to do instead

<Steps>
  <Step title="Write the message so it works as plain text">
    If the interactive part vanishes, the message must still make sense on its own. Put the instruction in `description`, not only in the button labels.

    Bad: title `Confirm your order`, buttons `Yes` / `No`, nothing else. If the buttons vanish, the customer has no idea what to do.

    Good: title `Confirm your order`, description `Order #2043 — ₹1,299. Reply YES to confirm or NO to cancel.` The buttons become a shortcut, not a requirement.
  </Step>

  <Step title="Use a typed reply as the real mechanism">
    "Reply 1 for morning, 2 for afternoon" works on every WhatsApp client on earth, and — unlike a button press — a person can read it on the phone regardless of how the message rendered.
  </Step>

  <Step title="Use a link for anything important">
    A [`url` button](/api-reference/messages/buttons) is convenient, but put the same link in the text as well. A link in text is tappable on every client.
  </Step>

  <Step title="Never use them for anything critical">
    Payment confirmations, consent, cancellations, medical or legal choices — none of these should depend on a button appearing.
  </Step>
</Steps>

## What IS reliable

| Type                                                                                                                         | Reliability                                                             |
| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| [Text](/api-reference/messages/text)                                                                                         | Renders everywhere.                                                     |
| [Image](/api-reference/messages/image), [video](/api-reference/messages/video), [document](/api-reference/messages/document) | Render everywhere.                                                      |
| [Voice note](/api-reference/messages/audio)                                                                                  | Renders everywhere.                                                     |
| [Location](/api-reference/messages/location), [contact card](/api-reference/messages/contact)                                | Render everywhere.                                                      |
| [Poll](/api-reference/messages/poll)                                                                                         | Renders reliably — but you cannot read the votes back through this API. |
| [Buttons](/api-reference/messages/buttons), [list](/api-reference/messages/list)                                             | **Best-effort.** May fall back to plain text.                           |

<Tip>
  Send one to your own number first and look at it on the handset your customers actually use. That is the only real test — and it tells you about *your* recipients, not about WhatsApp in general.
</Tip>
