Invitations — states
Every state a consumer must render. The fail-closed cases are contract, not decoration — each maps to an HTTP status and error code the UI handles explicitly.
Loading — pending list (aria-busy)
Pending invitations
Empty — no pending invitations
Pending invitations
No invitations pending
Everyone you invited has joined. Use “Invite people” to add someone.
Error — list failed to load
Pending invitations
Couldn't load invitations
Something went wrong on our end.
Channel — WhatsApp (E.164 field)
Delivered via WhatsApp. Full international format, e.g. +447700900123.
Validation — invalid E.164
That's not a valid WhatsApp number. Use digits only in full international format.
Resend — rate-limit cooldown
Fail-closed — token expired / revoked (410)
It expired or was revoked. Ask the organization owner to send a new one.
Fail-closed — identity mismatch (403)
You're signed in as sam@globex.io, but the invite is for jordan@acme.com. Sign in as the invited identity to accept.
Fail-closed — already accepted (409)
This invitation was already accepted. Nothing more to do.
Fail-closed — last owner (409)
You're the only owner, so this change would leave the organization with none. Transfer ownership first, then try again.
Error — invitation couldn't be sent
The invite was saved as a draft but delivery failed. Check the address and resend.
Fail-closed — not allowed to invite (403)
Only admins and owners can invite. Shown in place — never a redirect to sign-in (that's 401 only).