Blocking Senders
Some inbound conversations are spam, abusive, or just irrelevant. Blocking the sender drops future inbound at the webhook gate before it ever hits your inbox.
How to block
- Open the conversation.
- Click the … menu in the thread header → Block sender.
- Confirm the action — you can include a short reason (kept on
chat_blocked_senders.reasonfor admin review).
The thread immediately moves to the Blocked status filter. The sender stops appearing in your unread count, your push notifications, and your main inbox views.
You need the chat.manage permission to block.
What blocking does
A blocked sender is stored in chat_blocked_senders keyed on (kindergarten_id, channel, provider_user_id). The webhook gate on every channel checks this table on every inbound:
inbound → signature check → blocklist check → persistIf block exists, the inbound is dropped silently — we don't even write the row. From the platform's side, the message was delivered. From your side, it never arrived.
What blocking does NOT do
- It does not block the sender at the platform level. They can still send messages; we just don't show them to you. Some platforms (Telegram, Viber) have a separate API call to "leave the chat" — we don't make that call automatically. To completely cut the channel off, leave/block on the platform's own app.
- It does not delete past messages. The pre-block history stays in the thread (in Blocked status). You can still scroll back to it for context or compliance.
- It does not affect a parent's record. Blocking is per
(channel, provider_user_id). A parent who's blocked on WhatsApp is still reachable on email, and vice versa.
Unblocking
In the Blocked filter, open the conversation → … → Unblock. The chat_blocked_senders row is removed, the conversation flips back to Closed (so it doesn't surge to the top of Open automatically). The sender's next inbound message will move the thread back to Open as usual.
A friendlier auto-behavior: when you unblock, the inbox auto-flips the status filter back to Active so you can see the thread immediately without re-selecting filters.
Block from a fresh conversation
If a brand-new conversation appears and you want to nuke it before reading, you can block from the conversation list (the row's right-click menu has a Block option). The thread instantly disappears from the active view.
Audit trail
Every block / unblock fires an audit_logs entry:
chat_sender_blocked— channel, provider_user_id, reason, who did it.chat_sender_unblocked— same shape.
The same data is on chat_blocked_senders with created_at and created_by — but the audit trail is the canonical "who flipped what when" record.
Why per-(channel, provider_user_id) and not per-parent?
A phone number is the parent's, but a WhatsApp Business send fans out from your number — there's no concept of "block the parent everywhere." Each channel has its own identity space. Blocking per channel is the only correct abstraction.