Skip to content

Button and List messages do not render on consumer WhatsApp — only Carousel works (v0.7.1) #59

@asoftdb

Description

@asoftdb

Welcome!

  • Yes, I have searched for similar issues on GitHub and found none.

What did you do?

Tested every interactive send endpoint of evolution-go against a personal (non-Business) consumer WhatsApp recipient, using the Evolution GO Manager's per-instance lab modal ("Testar botões, lista e carrossel"), which constructs the official canonical payloads for each variant.

Specifically I ran:

  • /send/text — plain text (control)
  • /send/button — Reply × 1, Reply × 3 (server max), CTA Copy, CTA URL, CTA Call, PIX alone, CTAs grouped (copy + url + call) → 7 variants
  • /send/list — single sections list → 1 variant
  • /send/carousel — 4 cards REPLY, 4 cards URL, 3 cards CALL, 4 cards COPY → 4 variants

Same sender instance, same recipient phone, runs spread over ~5 minutes.

Reproduction

  1. Pair an instance with a personal WhatsApp number (not Business / WABA).
  2. Open the Manager → Instances page → click the "Testar botões, lista e carrossel" lab icon on the instance.
  3. Enter a personal phone number (not on WABA / Cloud API).
  4. Run each of the 9 button + list modes one after another.
  5. Re-run with each of the 4 carousel modes.
  6. Watch what the recipient phone actually displays.

What did you expect?

I expected all variants to render on the recipient's WhatsApp because:

  1. The API returned 200 OK with IsFromMe: true and a real WhatsApp message ID for every single send (so the sender's session successfully emitted the frame to WhatsApp's servers).
  2. The Manager UI's lab modal explicitly bills itself as a delivery test tool for these endpoints — if these payloads weren't expected to work, they shouldn't be in the lab.
  3. The plain-text /send/text control delivered cleanly to the same recipient, so the device + recipient pair is healthy.

What did you observe instead of what you expected?

Only /send/carousel actually delivers usable content to consumer WhatsApp. Every /send/button variant arrives as a placeholder asking the recipient to update WhatsApp, and /send/list does not arrive at all.

Endpoint Variant (from Manager UI lab) API response Receiver result
/send/text plain text 200 OK ✅ Rendered cleanly
/send/button Reply × 1 200 OK ❌ "Update WhatsApp…" placeholder
/send/button Reply × 3 (server max) 200 OK ❌ "Update WhatsApp…" placeholder
/send/button CTA Copy 200 OK ❌ "Update WhatsApp…" placeholder
/send/button CTA URL 200 OK ❌ "Update WhatsApp…" placeholder
/send/button CTA Call 200 OK ❌ "Update WhatsApp…" placeholder
/send/button PIX alone 200 OK ❌ "Update WhatsApp…" placeholder
/send/button CTAs grouped (copy + url + call) 200 OK ❌ "Update WhatsApp…" placeholder
/send/list Single sections list 200 OK ❌ Not delivered at all
/send/carousel 4 cards REPLY + image headers 200 OK ✅ Renders, all buttons work
/send/carousel 4 cards URL 200 OK ✅ Renders (URL button serialization is its own issue, see #51)
/send/carousel 3 cards CALL 200 OK ✅ Renders
/send/carousel 4 cards COPY 200 OK ✅ Renders

In every case the API returns 200 with a real message ID — the difference is entirely on the WhatsApp client side.

If this is by design (WhatsApp restricting these frame types for unofficial-API sessions), it would help operators a lot if the README / changelog said so explicitly. Right now the lab modal happily ships these payloads as if they were expected to work for any recipient.

Screenshots/Videos

No response

Which version are you using?

evolution-go v0.7.1 (Docker)

What is your environment?

Docker

If applicable, paste the log output

No response

Additional Notes

Sender / recipient setup

  • Sender: personal WhatsApp number connected via QR (not Business)
  • Recipient: personal WhatsApp number on Android, current app version, not on Business / WABA / Cloud API
  • evolution-go reachable on a public host
  • Same sender → same recipient pair for ALL tests in the matrix

Related

Questions for maintainers

  1. Is the button/list non-delivery to consumer WhatsApp a known WhatsApp protocol restriction (e.g. they only accept those frame types from Business-API sessions)?
  2. If yes — would you consider documenting this in the README and/or returning a warning header on the response (e.g. X-Whatsapp-Delivery-Risk: high) so callers can surface it to their users?
  3. If no — is there a server log or whatsmeow debug toggle I can enable to capture the WhatsApp ack / rejection for these messages? Happy to run a follow-up test.

Thanks for the project — carousel works reliably and is genuinely useful for our use case.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions