Status codes
PingLoom shows what FCM accepted and what the app reported. Provider acceptance is not proof that a phone showed the alert.
HTTP codes
| Code | Meaning |
|---|---|
| 200 | Status read. |
| 202 | Accepted and stored. Sending to devices happens after this response. |
| 400 | The request could not be read. |
| 401 | The API key is missing or not valid. |
| 403 | The key lacks the scope. |
| 404 | The event does not exist for this key's project. |
| 409 | Conflict: idempotency or archived project. |
| 413 | Body too large. |
| 415 | Wrong content type. |
| 422 | A field failed validation. |
| 429 | Rate limit or monthly quota. |
| 500 | A failure on our side. |
Event status
| Status | Shown as | Meaning |
|---|---|---|
| accepted | Event accepted | PingLoom stored the event. Nothing has been sent yet. |
| queued | Queued | The event is waiting for the worker to send it. |
| provider_accepted | Sent to FCM | FCM accepted the send for at least one device. This is not proof that a phone showed it. |
| simulated_accepted | Simulated (test mode) | A simulated provider accepted the send. No real push was made. Local and test setups only. |
| retrying | Retrying | A send failed in a way that can recover. PingLoom tries again with a growing delay. |
| failed | Failed to reach FCM | FCM could not take the send after all attempts. |
| no_devices | Accepted, no active device | The event is stored and visible in the inbox, but no active device follows the channel. |
Reading is tracked per person ("Seen on a device"). Acknowledging is one shared state per event: the first person to acknowledge it acknowledges it for the team.
Delivery state
| State | Shown as | Meaning |
|---|---|---|
| pending | Waiting to send | The send for this device has not started. |
| provider_accepted | Sent to FCM | FCM accepted the send for this device. |
| simulated_accepted | Simulated (test mode) | A simulated provider accepted it. No real push was made. |
| retrying | Retrying, attempt n of N | The last try failed in a way that can recover. |
| failed | Failed to reach FCM | All attempts failed, or the device token was rejected and the device was disabled. |
| skipped | Skipped | The device or member was no longer active when the send ran. |
Provider errors
When a send fails, the dashboard shows one of these normalized codes with a plain explanation.
| Code | What it means |
|---|---|
| UNREGISTERED | The app was uninstalled or its token expired. The device was disabled. |
| INVALID_TOKEN | Firebase rejected this device's token. The device was disabled. |
| SENDER_ID_MISMATCH | Firebase rejected this device's token. The device was disabled. |
| UNAVAILABLE | FCM was unreachable. PingLoom retries automatically. |
| INTERNAL | FCM was unreachable. PingLoom retries automatically. |
| TIMEOUT | FCM was unreachable. PingLoom retries automatically. |
| QUOTA_EXCEEDED | FCM throttled sending. PingLoom retries after the delay FCM asks for. |
| AUTH_ERROR | The server's Firebase credentials were rejected. Check the FCM configuration. |
| INVALID_ARGUMENT | FCM rejected the message. |
| DEVICE_DISABLED | Skipped: the device or member is no longer active. |
| SESSION_ENDED | Skipped: the device or member is no longer active. |
| NOT_MEMBER | Skipped: the device or member is no longer active. |