Messages are accepted but not arriving
Every call returns success. Work through this in order — the first four checks do not involve the carrier at all.
Read this article →A failed status always carries a reason. The first question is which layer wrote it — the platform or the provider.
A failure is either the platform refusing the request before it left, or the provider refusing it after. The code tells you which, and therefore who owns the fix.
| Code | Layer | Typical cause |
|---|---|---|
| 40000 | Platform (HTTP 400) | Bad parameter, key bound to no channel, no ACTIVE channel, messageType not recognised |
| 40100 | Platform (HTTP 401) | Key missing or invalid |
| 40400 | Platform (HTTP 404) | messageId not found, or belongs to another tenant |
| 42900 | Platform (HTTP 429) | Submission rate exceeded — back off and retry |
| errorCode + rawStatus | Provider | The provider's own refusal, kept verbatim so you can match it against their documentation |
It is the provider's own wording, so it matches their docs and support answers directly.
A message that unexpectedly jumped encoding can be refused for length. A wide-encoding segment budget is much smaller than a GSM one.
A number the provider has not approved for that route is refused per message, even on an ACTIVE connection.
If only one provider is refusing, the log's channel comparison tells you immediately — and routing can move traffic off it while you investigate.
A 40000 on every call usually means a binding problem rather than a payload problem — most often a key that was never bound to a channel, or a connection that is no longer ACTIVE. Both are console fixes, not code changes.
Every call returns success. Work through this in order — the first four checks do not involve the carrier at all.
Read this article →Almost always this is a client-side timeout followed by a resend. Here is how to confirm it, and how to stop it happening.
Read this article →Telling an account-level failure apart from a bad route, and what failover can and cannot absorb for you.
Read this article →