> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.messageblue.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.messageblue.ai/_mcp/server.

# Messages

Route `/chat`

Find it Left rail → Messages

Who can open it Admins and team members

Messages is a three-pane inbox: the **conversation list** on the left, the **conversation** in the middle, and an optional **contact panel** on the right. Everything updates live over a socket connection, so inbound messages appear without a refresh.

![MessageBlue Messages inbox showing a customer asking about meetings and the AI agent replying, each reply badged Agent](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/adaffd210170456430ea0c9883011d446866af2de4c00ae6e8cf5fc4f42e1b80/docs/assets/frontend/messages.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIA6KXJSKKNFOCF7G4B%2F20260916%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260916T201314Z&X-Amz-Expires=604800&X-Amz-Signature=573ec61538266601ec23c0554c6cef19cfc8ed6290280135b19ec94de147b135&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

## The conversation list

Conversations are ordered by recent activity, each row showing the contact, a preview of the last message, its time, an unread count, and a green dot when the contact's number is online.

### Search and filters

The search box matches on contact name and number. The funnel icon opens filters, which stack — the app spells this out: *"All selected filters apply together."*

| Filter          | Options                         | Notes                                                                     |
| --------------- | ------------------------------- | ------------------------------------------------------------------------- |
| **Status**      | Unresponded, Pinned             | *Unresponded* means the last message in the thread came from the customer |
| **Tags**        | Untagged, plus every tag in use | Tags are applied per contact in the contact panel                         |
| **Assigned to** | Any team member                 | Assignment is also set in the contact panel                               |

![Filter contacts popover showing Status with Unresponded and Pinned, a Tags list, and an Assigned to list of team members](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/a5bbf85395bb5215e2660d253aa7853361bdd2b4661970be5310e2da7ad0ad1b/docs/assets/frontend/messages-filters.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIA6KXJSKKNFOCF7G4B%2F20260916%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260916T201314Z&X-Amz-Expires=604800&X-Amz-Signature=0d6c440e0b25c04b7da9a3af3b17de107f08b637d2dcaec8e8f009f060b272b0&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

The **Tags** and **Assigned to** lists are built from your own data — every tag applied to any contact, and every member of the app. **Untagged** sits alongside them so you can find contacts nobody has categorised yet.

Active filters appear as removable chips beneath the search box, and **Clear** resets them all. If a filter combination matches nothing you get *"No contacts match these filters"* with a **Clear filters** shortcut rather than an empty void.

### Pinning

Pinning a conversation keeps it at the top of the list. The pin control is on each row and also in the conversation header.

## Reading a conversation

Messages are grouped under date dividers. Older history loads as you scroll up — a *"Loading earlier messages…"* pill appears while it fetches, and a *"Scroll up for earlier messages"* hint shows when more history exists.

![A conversation scrolled back into older history, with earlier messages loaded above the latest exchange](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/f28f3d95c7422ddaded6d76d0c38f2d6dabfe50d3e06f24afb976b5c956eb258/docs/assets/frontend/messages-scrollback.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIA6KXJSKKNFOCF7G4B%2F20260916%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260916T201314Z&X-Amz-Expires=604800&X-Amz-Signature=4895a45feeb8ea646e4812450532a4d27594128c4d665dae764aade812512cfc&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

A long-running conversation is not fully in the browser when you open it. If you are looking for something specific from months ago, scrolling is the only way to reach it — there is no in-conversation search.

### What a bubble tells you

Outbound bubbles carry a delivery status, and several badges add context:

| Marker        | Meaning                                                                            |
| ------------- | ---------------------------------------------------------------------------------- |
| **Sent**      | Handed to Apple                                                                    |
| **Delivered** | Confirmed delivered to the recipient                                               |
| **Failed**    | Delivery failed — shown in red as *Failed to send*                                 |
| **SMS**       | *Delivered via SMS fallback* — went out as a green-bubble SMS rather than iMessage |
| **AI Agent**  | The message was written and sent by your [AI agent](/ai-agent-studio)              |
| **API**       | *Sent via API* — your own server sent it, not a person in this UI                  |

Attachments render inline. Images open full-size in a lightbox when clicked. Voice notes get an inline player with play/pause, a progress bar, a duration readout and a download button.

### The conversation header

The header carries the contact's name, their number, their online state — and four controls on the right. They are easy to miss, and two of them do nothing yet.

| Control              | What it does                                                                                           |
| -------------------- | ------------------------------------------------------------------------------------------------------ |
| **Voice call**       | Nothing yet — shows a notice asking you to contact the team                                            |
| **Video call**       | Nothing — explicitly labelled *coming soon* and disabled                                               |
| **Pin conversation** | Pins the thread to the top of the list. Highlighted blue when active — the same pin as on the list row |
| **Contact info**     | Opens the [contact drawer](#the-contact-drawer) on the right. Highlighted while open                   |

Selecting either call button is harmless; calling is simply not enabled:

![A conversation with a toast reading Voice calls — Please reach out to the team to enable this feature for you](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/68f80b8c2a477ec4f263b28e09fa61e3c35876766b8b0d1cf2f25dd3aaa9fbf4/docs/assets/frontend/messages-voice-call.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIA6KXJSKKNFOCF7G4B%2F20260916%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260916T201314Z&X-Amz-Expires=604800&X-Amz-Signature=33570d4cc2f49eb3e0d6c5e32cebf18607daead02e0b0be134a3c1072d3732a5&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

Voice calling is not a self-service feature in this release; the notice is the product telling you to talk to the team. Video calling has no notice at all — the button is disabled outright.

## Sending

The composer sits at the bottom: an attach button, a **Type a message...** field, and send. Attachments upload first and appear as thumbnails above the field with a progress overlay; sending before they finish shows *"Attachments are still uploading..."*.

### Starting a new conversation

**New conversation** — the **+** beside the filter icon — asks for a recipient number, explaining: *"Enter a recipient phone number. The chat appears in your list after the first message is sent or received."*

![New conversation dialog with a phone number field placeholder plus15550109988, and Cancel and Start chat buttons](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/0e6b5c33d47c0ea8c1792f3a3f8007cae75a997253a764850dd2f14ea84d7875/docs/assets/frontend/messages-new-conversation.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIA6KXJSKKNFOCF7G4B%2F20260916%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260916T201314Z&X-Amz-Expires=604800&X-Amz-Signature=a2f7ad11d60be653abcf78fd5036eed9b1a039994d0c6eb74ebb644ac1a47766&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

Phone numbers must be entered in **E.164 format** — a leading `+`, the country code, then the national number, with no spaces, dashes or brackets. For example `+15550109988`. The app rejects anything else before it reaches the gateway.

Note the phrasing: the thread does not appear in your list the moment you press **Start chat**. It appears once a message has actually been sent or received on it.

Four things can stop a new conversation before it starts:

#### No phone number associated

The app has no number of its own to send *from*. Request one from the [Phone numbers](/dashboard#phone-numbers) section first.

#### Invalid phone number

The number is not in E.164 format. The app shows the expected shape: `+15550109988`.

#### Cannot create conversation

*"This is not an iMessage capable number and cannot create a conversation with a non-iMessage number."* The recipient cannot receive iMessages, so no thread can be opened.

#### Sending number is offline

The Mac agent behind your number is not currently connected. The message is not sent; try again once it reconnects. Device connectivity is visible in [Analytics → Agents](/analytics#agents-and-devices).

### The consecutive-message guard

Sending many messages to someone who never replies is how numbers get flagged as spam, so the app pushes back:

> You have sent more than 5 consecutive messages in a day to this contact without a reply.

You can proceed with **Send anyway**, but treat the warning as real — this protection exists to keep your numbers healthy.

## The contact drawer

**Contact info** in the header opens a drawer down the right-hand side. This is where a conversation becomes a managed relationship rather than just a thread, and it holds more than fits on one screen — scroll it.

Working top to bottom:

### Identity and copy

The contact's avatar, display name and number, with a **pencil** to edit and **copy** buttons beside both **Phone** and **Agent number**.

| Field            | What it is                                     |
| ---------------- | ---------------------------------------------- |
| **Phone**        | The contact's number                           |
| **Agent number** | *Your* number that talks to them — the mapping |

Editing the name splits into **First name** and **Last name** fields. Worth doing: iMessage often gives you nothing but a bare number, and the name you set here is what shows in the conversation list and in [Analytics](/analytics).

![Contact info drawer showing the contact name and number, agent number, a Remap agent selector, and Activity tiles](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/6728116ce5a21b62dca0caaf98de67880e716824341abc2ffebf8c0a4c2d00d6/docs/assets/frontend/messages-contact-panel.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIA6KXJSKKNFOCF7G4B%2F20260916%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260916T201314Z&X-Amz-Expires=604800&X-Amz-Signature=bc2bb808b4e29faaaed4a3147f3c03e67a3155eadec40878b0f401f470f4ccd1&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

### Remapping the agent

**Remap agent** moves a contact to a different one of your numbers. Pick from **Select an agent…** and press **Remap**. Use it when retiring a device or rebalancing load. The drawer shows which agent number is current before you confirm.

### Activity

Six read-only tiles: **Total inbound**, **Total outbound**, **First messaged**, **Last received** and **Last responded**. A quick read on whether a relationship is alive, one-sided, or has gone quiet.

### Notes

Free-text notes, each attributed to whoever wrote it and timestamped. **Add a note…** plus **Add note** to save.

Deleting a note is permanent — *"This permanently removes the note. A deletion log is saved with who deleted it."* The note itself is gone; only the fact of its deletion, and who did it, survives.

### Assignment and tags

**Assigned to** lists every member of the app with a checkbox, with the account owner marked *(owner)*. **Tags** are free-form: type into **Add a tag…** and press **+**; existing tags carry an **✕** to remove.

Both feed straight into the [conversation-list filters](#search-and-filters) — that is their whole purpose, so they are worth keeping tidy.

### Blocking

At the bottom, and deliberately blunt about what it does:

> Blocking makes the AI agent stop replying to this contact — silently. The contact is never told.

![Contact drawer scrolled down showing Notes with two entries, Assigned to checkboxes, a Tags field and the Block contact section with a reason field](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/67bfdd92b939dc8610fedc6b228fc90f3b8e5d04e554a6e0a2df370f5c91dc49/docs/assets/frontend/messages-contact-block.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIA6KXJSKKNFOCF7G4B%2F20260916%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260916T201314Z&X-Amz-Expires=604800&X-Amz-Signature=f711150e207da53ab7daf37bd313f6c53d7ccd190d7afc34d9adbbe452f6e369&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

A **reason is required** in both directions, and **History** expands a log of every block and unblock with its reason and who did it.

Two things to be clear about:

* Blocking stops **the AI agent** only. You can still message the contact by hand from the composer.
* The contact is never notified, so from their side the agent simply stops answering.

Blocked contacts are also listed centrally in [Analytics → Blocked contacts](/analytics#blocked-contacts), which is the better place to audit them.