Uma notificação push tem duas vidas. Na primeira, o servidor comunica com o Firebase Cloud Messaging (FCM) ou o APNs da Apple. Na segunda, o dispositivo decide se mostrar a notificação. A maior parte das horas perdidas em debug vem de ler a resposta da primeira vida como se descrevesse a segunda.

Erros do FCM (HTTP v1)
UNREGISTERED (404)
O que significa:
O token não vale mais: o app foi desinstalado, cancelou o registro ou o token expirou.
O que fazer:
Apague o token.
INVALID_ARGUMENT (400)
O que significa:
Algum parâmetro é inválido: token malformado, nome de pacote errado, mensagem grande demais, chave de dados reservada, TTL inválido.
O que fazer:
Leia o detalhe do BadRequest. Corrija a mensagem. Só apague o token depois de confirmar que o payload está válido.
SENDER_ID_MISMATCH (403)
O que significa:
O remetente com que você se autenticou não é o remetente para o qual o token foi registrado.
O que fazer:
Confira se a service account é do mesmo projeto Firebase do app. Não apague tokens antes disso.
QUOTA_EXCEEDED (429)
O que significa:
Taxa excedida para o projeto, para um aparelho ou para um tópico.
O que fazer:
Reduza a taxa. O FCM recomenda backoff exponencial com atraso inicial de pelo menos 1 minuto para taxa de mensagens e de tópico.
UNAVAILABLE (503)
O que significa:
O FCM está sobrecarregado.
O que fazer:
Repita a mesma requisição, respeite o Retry-After se vier, use backoff exponencial e jitter.
INTERNAL (500)
O que significa:
Erro interno desconhecido do FCM.
O que fazer:
Repita com backoff; veja a página de status do FCM; se persistir, fale com o suporte do Firebase.
THIRD_PARTY_AUTH_ERROR (401)
O que significa:
O certificado do APNs ou a chave de web push está inválido ou ausente, para uma mensagem a iOS ou a um registro web.
O que fazer:
Corrija as credenciais de APNs ou de web push no console do Firebase.
Erros do APNs
BAD_DEVICE_TOKEN (400)
O que significa:
O token é inválido, ou não bate com o ambiente.
O que fazer:
Primeiro confira sandbox vs produção. Só depois trate como morto.
DEVICE_TOKEN_NOT_FOR_TOPIC (400)
O que significa:
O token não pertence ao topic (bundle ID) que você enviou.
O que fazer:
Corrija o apns-topic. A Apple lista entre os erros que não se repete como está.
TOPIC_DISALLOWED (400)
O que significa:
Enviar para esse topic não é permitido.
O que fazer:
Confira se o topic é permitido para o seu app e a sua chave.
EXPIRED_PROVIDER_TOKEN (403)
O que significa:
O s.