MARK_READ - Marcar Mensagem Como Lida
O que é este Node?
O MARK_READ é o node responsável por marcar mensagens como lidas via WhatsApp Business API.
Por que este Node existe?
Status de leitura melhora UX. O MARK_READ existe para:
- Feedback visual: Mostrar ao usuário que mensagem foi vista
- Organização: Gerenciar status de mensagens recebidas
- Automação: Marcar automaticamente mensagens processadas
- Profissionalismo: Indicar que mensagem está sendo tratada
- Analytics: Rastrear mensagens lidas vs não lidas
Como funciona internamente?
Quando o MARK_READ é executado, o sistema:
- Requer messageId: ID da mensagem a marcar (do webhook)
- Envia requisição: POST para marcar como lida
- Atualiza status: WhatsApp exibe checkmarks azuis
- Erro se incompleto: Implementação requer parâmetro messageId
- Confirma sucesso: Retorna status da operação
Código interno (whatsapp-meta-executor.service.ts:640-644):
private async markAsRead(data: WhatsAppMetaNodeData): Promise<any> {
// This would require a message ID to be passed
// Implementation depends on specific requirements
throw new Error('markAsRead operation not fully implemented - requires message ID parameter');
}
Status de Implementação
⚠️ IMPLEMENTAÇÃO PARCIAL: Esta operação requer parâmetro messageId adicional que não está totalmente implementado no código base atual.
Para usar esta funcionalidade:
- Adicione campo
messageIdaos parâmetros - Implemente POST para endpoint de marcar como lida
- Retorne confirmação de sucesso
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "mark_read" |
| accessToken | string | Sim | Token de acesso da WhatsApp Business API |
| phoneNumberId | string | Sim | ID do número WhatsApp Business |
| messageId | string | Sim | ID da mensagem a marcar ⚠️ Requer implementação |
Exemplo de Implementação Completa
private async markAsRead(data: WhatsAppMetaNodeData): Promise<any> {
if (!data.messageId) {
throw new Error('messageId is required for markAsRead operation');
}
const payload = {
messaging_product: 'whatsapp',
status: 'read',
message_id: data.messageId
};
const response: AxiosResponse = await axios.post(
`${this.WHATSAPP_API_BASE}/${data.phoneNumberId}/messages`,
payload,
{
headers: {
'Authorization': `Bearer ${data.accessToken}`,
'Content-Type': 'application/json'
}
}
);
return {
success: true,
messageId: data.messageId,
status: 'read'
};
}
Exemplo de Flow (Conceitual)
{
"name": "Marcar Como Lida - MARK_READ",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "MessageId do Webhook",
"parameters": {
"variableName": "webhook",
"value": {
"messageId": "wamid.HBgNNTUxMTk5OTk5OTk5OQ=="
}
}
}
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Marcar Lida",
"parameters": {
"operation": "mark_read",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"messageId": "{{webhook.messageId}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Log",
"parameters": {
"message": "✅ Mensagem marcada como lida"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Como Obter messageId
O messageId vem do webhook quando usuário envia mensagem:
{
"object": "whatsapp_business_account",
"entry": [{
"changes": [{
"value": {
"messages": [{
"id": "wamid.HBgNNTUxMTk5OTk5OTk5OQ==",
"from": "5511999999999",
"timestamp": "1234567890",
"text": {
"body": "Olá!"
}
}]
}
}]
}]
}
Resposta Esperada
{
"success": true,
"messageId": "wamid.HBgNNTUxMTk5OTk5OTk5OQ==",
"status": "read"
}
Caso de Uso: Auto-marcar Mensagens Processadas
{
"name": "Auto-marcar Processadas",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Webhook Recebido" }
},
{
"id": "whatsapp_mark",
"type": "whatsapp_meta",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Marcar Lida",
"parameters": {
"operation": "mark_read",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"messageId": "{{webhook.message.id}}"
}
}
},
{
"id": "process_1",
"type": "ai",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Processar Mensagem",
"parameters": {
"prompt": "Analisar: {{webhook.message.text}}"
}
}
},
{
"id": "whatsapp_reply",
"type": "whatsapp_meta",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Responder",
"parameters": {
"operation": "send_message",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "{{webhook.message.from}}",
"messageText": "{{ai.response}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "whatsapp_mark" },
{ "source": "whatsapp_mark", "target": "process_1" },
{ "source": "process_1", "target": "whatsapp_reply" },
{ "source": "whatsapp_reply", "target": "end_1" }
]
}
Boas Práticas
✅ SIM: - Marque mensagens assim que forem processadas - Use em automações para indicar recebimento - Implemente antes de processar mensagem - Combine com typing indicator para melhor UX - Marque mesmo se resposta for demorar
❌ NÃO: - Não marque mensagens que ainda não foram vistas/processadas - Não use excessivamente (apenas quando necessário) - Não ignore erros de marcação - Não dependa apenas disso para confirmação de leitura
Dicas
💡 Webhook: Configure webhook para receber messageId de cada mensagem 💡 Timing: Marque como lida imediatamente após receber webhook 💡 UX: Combine com typing indicator para experiência natural 💡 Erro handling: Trate erros se messageId inválido ou expirado 💡 Analytics: Registre mensagens marcadas para métricas
Próximo Node
→ SEND_MESSAGE - Enviar mensagem → GET_MEDIA - Baixar mídia recebida