[BUG] 2.4.0-rc2: incoming text replies flattened to 'conversation' — contextInfo (stanzaId/quotedMessage/mentionedJid) lost in webhook and storage
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 48/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- typescript
Research direction
Start at the MESSAGES_UPSERT webhook handling and the normalization path that produces messageType and the Message table payload; compare 2.4.0-rc2 with the reported 2.3.x behavior. Reproduce a text reply and a media reply, then verify that text replies retain extendedTextMessage.contextInfo, including stanzaId and mentionedJid, in both the webhook and storage.
Written by the indexing model from the issue text.
Description
Describe the bug
On 2.4.0-rc2, incoming text replies (quoted messages) are delivered to webhooks flattened: the message arrives as messageType: "conversation" with only the text and messageSecret — the extendedTextMessage wrapper and its contextInfo (stanzaId, participant, quotedMessage) are destroyed before reaching the webhook consumer. The quote relationship is unrecoverable downstream.
The same flattening happens in Evolution's own storage: our production Message table contains zero rows with messageType = 'extendedTextMessage' (2,164 conversation rows in the last 2 days alone).
Notably, replies with media still work: when a reply is an image/audio/video/document quoting another message, contextInfo is preserved inside the media wrapper (imageMessage.contextInfo, etc.). Only text replies lose the quote.
Sending works fine: POST /message/sendText with quoted: { key: { id }, message: { conversation } } delivers a proper native reply on the device (even though the sent message is also stored flattened as plain conversation — storage-side symptom of the same normalization).
Actual webhook payload (captured, credentials redacted)
The sender replied on his phone (long-press → Reply) to a text message in a group. WhatsApp on both devices shows the quote card. The messages.upsert webhook delivered:
{
"event": "messages.upsert",
"instance": "...",
"data": {
"key": {
"remoteJid": "[email protected]",
"fromMe": false,
"id": "2A7E3A15419D180DE3B4",
"participant": "2581376053441@lid",
"participantAlt": "[email protected]",
"addressingMode": "lid"
},
"pushName": "...",
"message": {
"messageContextInfo": {
"threadId": [],
"messageSecret": { "0": 221, "1": 251, "...": "..." }
},
"conversation": "Teste"
},
"messageType": "conversation",
"messageTimestamp": 1787780498,
"source": "unknown",
"status": "DELIVERY_ACK",
"contextInfo": { "threadId": [], "messageSecret": { "...": "..." } }
}
}
Expected behavior
A text reply should be delivered as it comes from Baileys:
{
"messageType": "extendedTextMessage",
"message": {
"extendedTextMessage": {
"text": "Teste",
"contextInfo": {
"stanzaId": "<quoted message id>",
"participant": "<quoted author jid>",
"quotedMessage": { "conversation": "..." }
}
}
}
}
This worked on v2.3.x (we have integrations built on contextInfo.stanzaId and contextInfo.mentionedJid that were functional before upgrading).
Steps to reproduce
- Run
evoapicloud/evolution-api:2.4.0-rc2(Docker, Postgres provider). - Webhook enabled with
MESSAGES_UPSERT. - From a phone that participates in a group (group using
addressingMode: "lid"in our case), long-press any text message → Reply → send a text reply. - Observe the webhook payload:
messageTypeisconversation, nocontextInfo.stanzaId/quotedMessage. - Also check the
Messagetable: the row is stored as{"conversation": "..."}only. - Counter-test: reply with a photo quoting a message →
imageMessage.contextInfoarrives intact.
Side effect of the same (or related) regression: mentionedJid for text mentions is also lost, since it lives in the same discarded contextInfo.
Environment
- Evolution API: 2.4.0-rc2 (
evoapicloud/evolution-api:2.4.0-rc2) - Deploy: Docker Compose (evolution + postgres:15 + redis)
- Provider: Baileys (WhatsApp Web), single instance, group with
addressingMode: "lid" - Downgrade to 2.3.7 is not viable for us: instances stopped working there after WhatsApp's LID migration (which motivated the upgrade to rc2).
Happy to provide more captured payloads or test a patched build.
- 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 2/5 1-3 hours Newbie friendliness 78/100
evolution-foundation/evolution-api#2723 ·
Maintainers usually reply within 1 day
-
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
All issues in evolution-foundation/evolution-api
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
rohitg00/agentmemory#1428 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
boxlite-ai/boxlite#1729 ·
Maintainers usually reply within 1 day
-
detectors enhancement good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
SM260845/readme-gen#1 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
angular/angularfire#3774 ·
Maintainers usually reply within 2 days