Pular para o conteúdo principal
Toda mensagem enviada gera eventos de acompanhamento. Eles chegam no mesmo field das mensagens recebidas, messages, mas com a lista statuses no lugar de messages. A forma de saber qual é qual é verificar qual lista veio no value:

A sequência normal

Para cada mensagem enviada com sucesso chegam três eventos, em momentos diferentes: Todos usam o mesmo id, que é o wamid devolvido no envio. É por ele que você liga o status à mensagem no seu banco de dados:
O objeto conversation aparece no sent e no delivered, e informa a categoria da conversa e quando a janela de 24 horas expira. O pricing indica se a conversa é cobrada e em qual categoria.
O read só chega se o cliente tiver a confirmação de leitura ativada no aparelho. A ausência dele não significa que a mensagem não foi lida.

Quando a mensagem falha

No lugar da sequência normal, chega um único evento com status: "failed" e o array errors, que explica o motivo:
O campo error_data.details é o que explica a causa em texto; o title é genérico. Registre o code junto da mensagem para conseguir agrupar as falhas depois.

Falhas mais comuns

A lista completa está na referência de códigos de erro da Meta.

Mensagens de template

Templates seguem exatamente o mesmo caminho: sent, delivered e read, ou failed com o motivo. A diferença aparece em conversation.origin.type, que indica a categoria cobrada — marketing, utility ou authentication. Os eventos que tratam do template em si, como aprovação e qualidade, são outros e estão em Templates.