sendButtons on Meta Cloud API channel drops description and footer, no header/footer sent to WhatsApp
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 78/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- typescript
Research direction
Start in src/api/integrations/channel/meta/whatsapp.business.service.ts at buttonMessage(), then trace how sendMessageWithTyping() builds the Meta Graph API request. Compare the buttons path with listMessage() and verify that title, description, and footer reach the expected interactive header, body, and footer fields while existing button handling remains intact.
Written by the indexing model from the issue text.
Description
Describe the bug
On the Meta Cloud API channel (whatsapp.business.service.ts), POST /message/sendButtons/{instance} silently drops the description and footer fields. Only title is forwarded to WhatsApp — as the interactive message's body.text, with no header and no footer at all.
This means a request like:
{
"number": "[email protected]",
"title": "Titulo",
"description": "Hola, elige una opción",
"footer": "Mi empresa",
"buttons": [
{ "type": "reply", "displayText": "opcion a", "id": "reply_1" },
{ "type": "reply", "displayText": "opcion b", "id": "reply_2" }
]
}
is delivered to Meta with description and footer completely discarded, and only "Titulo" showing up on WhatsApp, with no body text and no footer below the buttons.
Root cause
In src/api/integrations/channel/meta/whatsapp.business.service.ts, buttonMessage():
public async buttonMessage(data: SendButtonsDto) {
const embeddedMedia: any = {};
const btnItems = {
text: data.buttons.map((btn) => btn.displayText),
ids: data.buttons.map((btn) => btn.id),
};
if (!arrayUnique(btnItems.text) || !arrayUnique(btnItems.ids)) {
throw new BadRequestException('Button texts cannot be repeated', 'Button IDs cannot be repeated.');
}
return await this.sendMessageWithTyping(
data.number,
{
text: !embeddedMedia?.mediaKey ? data.title : undefined, // only data.title is used
buttons: data.buttons.map((button) => {
return {
type: 'reply',
reply: {
title: button.displayText,
id: button.id,
},
};
}),
[embeddedMedia?.mediaKey]: embeddedMedia?.message,
},
{ ... },
);
}
data.description and data.footer are never read anywhere in this function. Then, in sendMessageWithTyping(), when building the actual Graph API request:
if (message['buttons']) {
content = {
messaging_product: 'whatsapp',
recipient_type: 'individual',
to: number.replace(/\D/g, ''),
type: 'interactive',
interactive: {
type: 'button',
body: {
text: message['text'] || 'Select', // this is data.title
},
action: {
buttons: message['buttons'],
},
// no header, no footer
},
};
...
}
No header and no footer key is ever added to interactive, even though Meta's Cloud API supports both for interactive.type = "button" messages.
For comparison, listMessage() in the same file maps all four fields correctly:
interactive: {
type: 'list',
header: { type: 'text', text: message['listMessage']['title'] },
body: { text: message['listMessage']['description'] },
footer: { text: message['listMessage']['footerText'] },
action: { button: message['listMessage']['buttonText'], sections: message['listMessage']['sections'] },
},
So sendList on this same channel works as documented — this is specifically a gap in the buttons path.
To Reproduce
- Configure an instance with
integration: WHATSAPP-BUSINESS(Meta Cloud API). - Call
POST /message/sendButtons/{instance}withtitle,description,footer, and 1-3replybuttons. - Observe on the recipient's WhatsApp: only the
titletext and the buttons are shown.descriptionandfooternever appear.
Expected behavior
description should populate interactive.body.text and title should populate interactive.header.text (matching how listMessage() handles the equivalent fields), and footer should populate interactive.footer.text, consistent with what Meta's Cloud API supports for interactive.type = "button" messages.
Environment
- Evolution API version:
2.3.7(confirmed present in this exact form in the2.3.7tag; also present on the current default branch) - Channel/integration:
WHATSAPP-BUSINESS(Meta Cloud API) - File:
src/api/integrations/channel/meta/whatsapp.business.service.ts, functionbuttonMessage()
- Dominant language
- TypeScript
- Stars
- 9.7k
- Forks
- 7.3k
- PR merge metrics
- No merged PRs in 30d
Getting set up
- Ships a Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from evolution-foundation/evolution-api
-
Difficulty 1/5 1-3 hours Newbie friendliness 88/100
evolution-foundation/evolution-api#2704 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
evolution-foundation/evolution-api#2702 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 88/100
evolution-foundation/evolution-api#2700 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
evolution-foundation/evolution-api#2675 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 1-3 hours Newbie friendliness 76/100
evolution-foundation/evolution-api#2641 ·
Maintainers usually reply within 1 day
All issues in evolution-foundation/evolution-api
Similar issues
-
refactor
Difficulty 2/5 Half a day Newbie friendliness 84/100
Maintainers usually reply within 5 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
OHDSI/Data2Evidence#3450 ·
Maintainers usually reply within 2 days
-
e2e-failure ready-to-code
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
redhat-developer/rhdh-plugin-export-overlays#4011 · 1 comment ·
Maintainers usually reply within 1 day
-
automation missing-model model-sync provider:ofox
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
anomalyco/models.dev#8421 ·
Maintainers usually reply within 1 day
-
SlackAdapter and TelegramAdapter are not assignable to Adapter under exactOptionalPropertyTypesOpen
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day