Troubleshooting
Diagnose missing devices, failed sends, rejected credentials, and missing opens.
Each section starts from what you are seeing rather than from a code. If you already have a code, the error reference and the provider table at the bottom are faster.
My device does not appear
Sent but never received
My credential is rejected
My open rates look wrong
Provider codes, verbatim
Where a provider gives a reason, the trace carries that code. Transient failures are retried
while the delivery remains queued and retry attempts remain. Once it is marked failed,
no further automatic retry is pending.
| Code | Meaning | What to do |
|---|---|---|
Unregistered | APNs reports that the token is no longer valid | Nothing. The device returns if the app is reinstalled |
BadDeviceToken | Apple does not recognise this token for this app | Check the build's environment against the device's |
BadEnvironmentKeyToken | Sandbox token sent to production, or the reverse | Open the app so it re-registers |
DeviceTokenNotForTopic | The token does not belong to the Bundle ID on the credential | Fix the Bundle ID on the credential |
TopicDisallowed | The App ID is not registered for push notifications | Enable the capability in your Apple developer account |
MissingTopic | No app identifier was named | Add the Bundle ID to the APNs credential |
PayloadTooLarge | Over Apple's 4096-byte limit | Shorten the payload; send a resource ID instead of its full contents |
InvalidProviderToken | The .p8, Key ID and Team ID do not agree | Re-check all three, or generate a new key |
ExpiredProviderToken | Our signing token was stale when Apple read it | Not retried for this error; contact support if it persists |
TooManyRequests | Apple is throttling this token or topic | Retried automatically. Lower delivery_rate if it persists |
Shutdown | Apple closed the connection for routine maintenance | Nothing. Retried automatically |
UNREGISTERED | Firebase no longer knows this token | Nothing. The device returns if the app is reinstalled |
SENDER_ID_MISMATCH | The token belongs to another Firebase project | Match google-services.json to the service account |
QUOTA_EXCEEDED | Your own Firebase project hit its sending quota | Raise it in the Google Cloud console |
INVALID_ARGUMENT | Firebase refused the message as malformed | Check the token, and that custom data holds only text |
THIRD_PARTY_AUTH_ERROR | Firebase could not reach Apple with your APNs key | Fix the APNs key in the Firebase console |
UNAVAILABLE | The provider answered with a failure of its own | Nothing. Retried automatically |
Carillon error codes
Carillon also records these delivery errors. None of them comes from a provider: each names a send that stopped before, or instead of, Apple or Google answering.
| Code | Meaning |
|---|---|
NoCredential | The app has no credential for that provider |
NoTeamId | The APNs credential has no Team ID, and Apple will not accept a notification signed without one |
NoTopic | Nothing named the app this notification was for |
Canceled | The campaign was cancelled before this delivery was handed over |
NotificationExpired | The payload's ttl ran out before an attempt could be made, after scheduling, pacing or retries; the provider was not contacted |
Abandoned | The delivery stayed queued for 24 hours without ever being handed to a provider and was written off by maintenance. It never reached Apple or Google and can be sent again |
OutcomeUnknown | An interrupted send left no confirmed provider outcome; it is not resent |
Related pages
Need more help?
You can contact support with the app, campaign or delivery ID and a description of what happened. The support guide lists useful context to include.