Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

sendButtons on Meta Cloud API channel drops description and footer, no header/footer sent to WhatsApp

Aberta Para iniciantes
#2,723 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
78/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
typescript
Domínio
api, backend

Direção de pesquisa

Comece em src/api/integrations/channel/meta/whatsapp.business.service.ts, em buttonMessage(), e depois acompanhe como sendMessageWithTyping() constrói a requisição para a Meta Graph API. Compare o caminho de botões com listMessage() e verifique se title, description e footer chegam aos campos esperados de header, body e footer interativos, enquanto o tratamento existente de botões permanece intacto.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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

  1. Configure an instance with integration: WHATSAPP-BUSINESS (Meta Cloud API).
  2. Call POST /message/sendButtons/{instance} with title, description, footer, and 1-3 reply buttons.
  3. Observe on the recipient's WhatsApp: only the title text and the buttons are shown. description and footer never 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 the 2.3.7 tag; also present on the current default branch)
  • Channel/integration: WHATSAPP-BUSINESS (Meta Cloud API)
  • File: src/api/integrations/channel/meta/whatsapp.business.service.ts, function buttonMessage()
Linguagem predominante
TypeScript
Estrelas
9.7k
Forks
7.3k
Métricas de merge de PRs
Nenhum PR com merge em 30d

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de evolution-foundation/evolution-api

Todas as issues de evolution-foundation/evolution-api

Issues semelhantes

Mais issues de TypeScript

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.