--- name: wa-badge-mobile-read-gap-2026-05-12 description: "Badge WA fica em 1 quando usuario le no celular mas Baileys nao envia read-receipt; backend conta corretamente, problema esta na sincronizacao" metadata: node_type: memory type: project originSessionId: 3cc4e2da-474d-47ee-96aa-7e15c6fdf186 --- # WA badge stale por leitura mobile sem read-receipt (2026-05-12) **Sintoma**: badge do topbar mostra "1" mensagem mas o usuario afirma nao ter mensagem nova. Diagnostico tipico: usuario ja respondeu pelo CELULAR (WhatsApp app), mas a mensagem original esta `is_read=0` no banco da intranet. **Why**: o webhook do Baileys (`WhatsApp::handleMessageStatusUpdate`) marca `is_read=1` quando recebe evento status='read' do WhatsApp. Mas o Baileys NEM SEMPRE envia esse evento — depende de tipo de msg, timing, e ate version do WhatsApp Business do remetente. Quando o usuario le no celular e o read-receipt nao chega no webhook, a intranet continua achando que ha pendente. **How to apply**: - Se usuario reportar "badge fica em N mas nao tem msg", checar primeiro a contagem real: ```sql SET @sid := (SELECT id FROM whatsapp_sessions WHERE tipo='principal' AND status='connected' LIMIT 1); SELECT 'aguardando', COUNT(DISTINCT c.id) FROM whatsapp_contatos c INNER JOIN whatsapp_messages m ON m.session_id=c.session_id AND m.phone_number COLLATE utf8mb4_unicode_ci = c.phone_number COLLATE utf8mb4_unicode_ci WHERE c.session_id=@sid AND c.assigned_to IS NULL AND c.deleted_at IS NULL AND m.direction='incoming' AND m.is_read=0; ``` - Identificar o contato/mensagens que estao com `is_read=0` - Se for caso "ja li no celular", fazer UPDATE manual: ```sql UPDATE whatsapp_messages SET is_read=1, read_at=NOW() WHERE session_id=? AND phone_number=? AND direction='incoming' AND is_read=0; ``` Badge limpa em ate 5s (polling do `waCheckUnread`). **Confirmado funcionando per-user** apos investigacao: - `aguardando` (contato sem dono com msg incoming `is_read=0`) — soma para TODOS os usuarios - `transferidos` (contato atribuido ao user logado com `whatsapp_unread_counts.unread_count > 0`) — soma so para o user atribuido - `grupos` (group via `whatsapp_group_user_reads.last_read_message_id < max(m.id)`) — soma per-user, abrir grupo limpa so pra quem abriu Ao abrir chat, `marcar-lido` faz `is_read=1` + zera `whatsapp_unread_counts`. Polling de 5s atualiza badge. **Limitacao residual**: nao existe garantia 100% que reads no celular sincronizem com o banco. Solucao definitiva seria pollar Baileys/WhatsApp Web API de "chats unread" periodicamente — overkill para o problema atual. Convivencia OK. Ver tambem [[whatsapp_chat_badge_topbar_fix]] (memo da deteccao do duplo dono do badge em 2026-05-06).