What's New in v8.8.0
🚀 Minor Release: Chatwoot Evolution-API Parity, Session-Aware Webhooks, Honest 463 Handling & Media URL Fixes
This release lands a major Chatwoot integration overhaul (auto-provisioning, edits/deletes, conversation reopen, a durable retry queue, and device-scoped routing), adds session correlation to webhooks plus JIDs to app responses, stops masking WhatsApp's server-side 463 reach-out timelock behind a futile client retry, and fixes downloaded-media URLs and chat-list name fallbacks.
✨ New Features
Chatwoot Evolution-API Parity
- Auto-provisions (or reuses) an API-channel inbox on startup and resolves its id automatically (
CHATWOOT_AUTO_CREATE,CHATWOOT_INBOX_NAME,CHATWOOT_WEBHOOK_URL) - Forwards message edits, revokes, and deletes to Chatwoot as threaded notes, with bidirectional WhatsApp↔Chatwoot markdown and reply/reaction threading via the
WAID:source-id convention - Reopens/reuses a conversation for returning contacts across both the REST and direct-DB import paths (
CHATWOOT_REOPEN_CONVERSATION,CHATWOOT_CONVERSATION_PENDING), plus aCHATWOOT_IGNORE_JIDSignore list - Routes agent replies back through the resolved device (no cross-account mis-delivery in multi-device deployments) and replays transient WhatsApp→Chatwoot failures from a durable retry queue
- Adds agent signature support (
CHATWOOT_SIGN_MSG/CHATWOOT_SIGN_DELIMITER), degrades to text when an inbound media download fails instead of dropping the message, and expands unit coverage (chatwoot 22%→58%, pgimport 28%→74%)
Saved WhatsApp Contact Name in Chatwoot (#714)
- Resolves the saved address-book name (
FullName→PushName→BusinessName) from the local WhatsApp contact store for 1:1 chats, instead of surfacing the bare phone number - Prefers it over the event pushname for both incoming and outgoing 1:1 chats, falling back to pushname then the phone identifier (fixes #688)
Session ID in Webhooks & JID in App Responses (#717)
- Webhook payloads now include
session_id, resolved from the device JID at the single forward chokepoint, so multi-tenant events can be correlated back to the session registered viaPOST /devices(closes #578) GET /app/statusandGET /app/devicesnow return the WhatsAppjidalongsidedevice_iddevice_idstays the JID for backward compatibility;session_idis omitted when the JID isn't mapped- Documented in
openapi.yamland the webhook payload docs
🐛 Bug Fixes
Honest WhatsApp Error 463 Handling (#708)
- Removes the client-side pre-warm + token-wait + one-shot retry around error 463 (
NackCallerReachoutTimelocked), which re-sent without a usable token and simply 463'd again, adding latency and a second reach-out attempt - Error 463 is WhatsApp's server-side reach-out timelock: the trusted-contact token can only arrive from the recipient (inbound message, privacy-token notification, or history sync), so whatsmeow's built-in tctoken lifecycle is the only correct path
- Keeps the 463→429 mapping and rewrites
WA_REACHOUT_TIMELOCKguidance to describe the restriction and its real remedies
Public URL for Downloaded Media (#716)
- Media download responses now return the public URL for the saved file
- Aligns the media-download device context in the REST path
Chat-List Name Fallback (#715)
ListChatsandGetChatMessagesnow fall back to a JID-derived label when the stored chat name is empty (phone number for 1:1,Group <id>/Newsletter <id>, andStatusforstatus@broadcast)- Fixes blank names for chats persisted before a pushname/group subject was known (fixes #675)
Chatwoot pgimport UUID Cast (#724)
- Drops the
::textcast ongen_random_uuid()for the uuid-typedconversations.uuidcolumn - Fixes the INSERT failing with
column "uuid" is of type uuid but expression is of type texton strict/default Chatwoot schemas, which had dropped every chat whose contact was newly created
🔧 Technical Improvements
Documentation & Tooling
- Refreshed the
AGENTS.mdhierarchy for the current branch, runtime paths, Chatwoot conventions, and release workflow - Added an
update-release-noteagent skill
Dependency Updates
go.mau.fi/whatsmeow: refreshed to latest across several updates- Related Go dependency checksums refreshed through
go.mod/go.sum
What's Changed
- fix(chatwoot): use saved WhatsApp contact name instead of phone number (#688) by @aldinokemal in #714
- fix(chatwoot): trim whitespace from API token and URL (#674) by @aldinokemal in #713
- fix(chat): fall back chat-list name to phone number when empty (#675) by @aldinokemal in #715
- feat(api): add session_id to webhooks and jid to app responses (#578) by @aldinokemal in #717
- fix(media): return public URL for downloaded media by @aldinokemal in #716
- feat: chatwoot integration updates by @aldinokemal
- fix(send): stop retrying WhatsApp error 463 and surface it honestly by @aldinokemal
- fix(chatwoot): drop ::text cast on conversation uuid in pgimport by @aldinokemal
- chore: update whatsmeow to latest by @aldinokemal
Full Changelog: v8.7.0...v8.8.0