> ## Documentation Index
> Fetch the complete documentation index at: https://docs.1club.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Inbox

> One conversation-style list for every outbound and inbound message, with thread roll-ups, draft chips, and a detail pane.

The inbox is the main view of the **Messages** section. The left pane lists conversations; the right pane shows the selected thread or compose form. On mobile the right pane slides up as a sheet over the list.

## How the list is built

The list queries `/v1/messages` filtered to top-level rows (no `replyToMessageId`). Each row is a conversation, not an individual message: outbound sends with their replies, inbound submissions with your responses, drafts not yet sent.

Rows are sorted by `createdAt` descending and paginated 25 at a time. **Load more** at the bottom extends the page size.

## What a row shows

Each row is built around the recipients of the conversation:

* A **single contact** shows that contact's avatar and full name.
* A **pair of contacts** shows two stacked avatars and "Firstname, Firstname".
* A **group of 3+** shows the first contact's avatar with a `+N` badge and "Firstname + N others".

To the right of the name you may see:

* A **Draft** status chip when the message has not been sent yet.
* The relative time of the latest message (`sentAt` if sent, `createdAt` if draft).
* A **thread counter** badge (the small number bubble) showing how many messages are in the conversation, including the original.

Below the name is a snippet: the subject if there is one, otherwise the first 80 characters of the body with HTML stripped.

## Selecting a row

Clicking a row updates the URL to `/messages/<id>` and renders the right pane:

* If the message is a **draft**, the compose pane opens so you can finish writing.
* Otherwise, the **thread view** renders: the original message at the top, replies underneath in order, and an inline reply box at the bottom.

When you click **Reply** the URL becomes `/messages/<id>/reply` and the compose pane takes over the right side with the original sender pre-selected as the recipient and the subject pre-filled with `Re: <subject>`.

## Real-time updates

The inbox subscribes to the notification WebSocket. Every time a message event for the current organization arrives, the list and the open thread refetch. New inbound replies appear without a manual refresh.

## Status and engagement signals

The inbox does not surface per-recipient delivery state directly in the list, but the underlying records track it. Each `message_recipient` has a `deliveryStatus` that can be `queued`, `sent`, `processed`, `delivered`, `deferred`, `bounced`, `dropped`, `failed`, `spam`, `unsubscribed`, or `skipped`, plus an `engagementStatus` of `open`, `click`, `unsubscribe`, or `spamreport`, and timestamps for each transition. Webhook handlers from SendGrid and Twilio update these fields as events come in.

The message-level `status` is simpler: just `draft` or `sent`. The inbox uses that to decide whether selecting a row opens compose or the thread view.

## Audience filters and admin vs instructor view

Admins and managers see the organization-wide inbox: every message attached to the org. The right-pane **Compose** button is enabled and the audience filters and template picker are available.

Instructors see a club-scoped slice: conversations involving members at the clubs they teach at. The compose button hides the audience filter and template picker; replies to existing inbound messages still work.

## Permissions

Reading the inbox requires `messages.read.own`. Composing or replying requires `messages.create.own`. Audience filters and access to organization-wide custom templates require admin or manager scope.

## Related

* [Compose](/messaging/compose) - The send and reply flow that the right pane drives.
* [Templates](/messaging/templates) - Templates the compose pane reads from.
* [Messaging overview](/messaging/overview) - How the inbox fits with automations and AI replies.
