> 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.

# Analytics

Route `/analytics`

Find it Left rail → Analytics

Who can open it Admins and team members (device revocation is admin-only)

Analytics answers two separate questions: *what is this costing me?* and *is my infrastructure healthy?* Each panel loads independently, so one slow section never blocks the rest, and **Refresh** re-pulls everything.

## Token usage

The headline numbers for the current month, broken into four totals:

The page describes its own scope precisely: *"AI tokens consumed by this account, by model — overall and this month. Thinking tokens are a subset of output."*

| Metric              | What it counts                                                                                                                                 |
| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **Input tokens**    | Everything sent to the model — prompt, history, retrieved knowledge                                                                            |
| **Output tokens**   | What the model wrote back                                                                                                                      |
| **Thinking tokens** | Internal reasoning — **already counted inside output**, shown separately so you can see how much of the output was reasoning rather than reply |
| **Total tokens**    | Input + output                                                                                                                                 |

Thinking tokens are a **subset** of output, not an addition to it. Adding the four figures together double-counts. If a reasoning model shows a large thinking count, that reasoning is already inside the output number.

![Analytics token usage panel showing input, output, thinking and total tokens with a per-model breakdown table](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/fca3f1f686884e5816942b7a6adf9413cd172bbdb919b000abe669831303c959/docs/assets/frontend/analytics.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=20260916T211829Z&X-Amz-Expires=604800&X-Amz-Signature=55502e601e2fcdc57766677663a113f0b3591f224ad65fed2f26e1549e6e5a84&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

Underneath, a per-model table repeats the breakdown with a **Replies** column, so you can see both what each model cost and how much work it actually did. This is the screen to check after switching models — a cheaper model that needs more turns is not always cheaper.

A new app shows *"No AI token usage recorded yet. Deploy an agent and exchange a few messages."*

## Contacts per day

A daily chart of contacts **Created** versus **Used**, with four summary tiles: *Created today*, *Used today*, *Created (7d)* and *Used (7d)*.

*Created* counts contacts new to your app that day; *Used* counts contacts that exchanged a message. Comparing them tells you whether you are growing an audience or re-engaging the same one.

## Sender activity

Who is doing the sending — and it answers that per *person*, not per number. Team members appear by name and email, alongside two synthetic senders: **Bot** (badged `BOT`) for the AI agent, and **Unknown** for traffic that could not be attributed.

Set the window with **From**, **To** and **Apply**.

![Sender activity table listing team members, a Bot row badged BOT and an Unknown row, with messages sent, contacts messaged, total contacts, assigned and unresponded columns](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/cfac7f9a590288e6f6b217e3ddad0fb0a34e9fed7b4f459e26e32d120e34a898/docs/assets/frontend/analytics-senders.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=20260916T211829Z&X-Amz-Expires=604800&X-Amz-Signature=f2779968a5a1bb0311155474e7bfbc77a9a24d22e357caa865f2563abb5e4d99&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

| Column                | Respects the date range?                   |
| --------------------- | ------------------------------------------ |
| **Messages sent**     | Yes                                        |
| **Contacts messaged** | Yes                                        |
| **Total contacts**    | **No — overall**                           |
| **Assigned**          | **No — overall**                           |
| **Unresponded**       | **No — overall** (among contacts messaged) |

Only the first two columns follow the date range. **Total contacts**, **Assigned** and **Unresponded** are lifetime figures regardless of what you set — the panel says so, but it is easy to miss and easy to misread as a sudden spike when you narrow the window.

The **Bot** row is the one to watch: it tells you how much of your outbound volume the agent is carrying versus your team.

Empty until you send something: *"No outbound messages attributed to senders yet."*

## Mapped contacts

A summary of **Total contacts**, **Assigned** and **Unresponded**, where *unresponded* means the customer spoke last and nobody has answered — the closest thing to an unanswered-queue depth.

**Detailed view** opens a searchable, paginated table of every mapped contact:

| Column                       | Meaning                                              |
| ---------------------------- | ---------------------------------------------------- |
| Contact / Phone              | Who they are                                         |
| Mapped at                    | When they were first attached to one of your numbers |
| Last inbound / Last outbound | Most recent message each way                         |
| Inbound / Outbound           | Lifetime message counts                              |
| Status                       | Active, or **Deleted**                               |

## Blocked contacts

Every contact the agent is refusing to answer:

> Contacts the AI agent is not replying to (manually blocked or auto-blocked as bots). Unblocking resumes replies.

Two things land contacts here — a person blocking them from the [contact drawer](/messages#blocking), and MessageBlue auto-blocking something it identified as a bot. Each entry shows its reason and when it was blocked.

Unblocking **requires a reason** and confirms with *"The agent can reply to them again."*

Check this list when a customer complains the agent went quiet on them. An auto-block for suspected bot activity is silent by design — the contact is never told — so a false positive looks exactly like the agent ignoring someone.

## Agents and devices

**Agents** lists *"all numbers registered for this app."* Each entry shows the agent's name (**Unnamed agent** if none was set), its number, an **Active** badge, and the **device ID** of the Mac backing it. Selecting one loads **Number stats** beside the list.

![Blocked contacts empty state above an Agents list showing one active agent with its device ID, and a Number stats panel showing status online](https://fdr-prod-docs-files-public.s3.us-east-1.amazonaws.com/message-blue.docs.buildwithfern.com/8c66fcee58c84086b4b03fa1c061d7d74b7615fcc2c5d11f261e4fc39df6a6b1/docs/assets/frontend/analytics-agents.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=20260916T211829Z&X-Amz-Expires=604800&X-Amz-Signature=ded636d6dee2598cbaf5f5df02659c2833304f33158aa7062f8f426e3a3884d3&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

| Stat                                   | What it tells you                                                                                   |
| -------------------------------------- | --------------------------------------------------------------------------------------------------- |
| **Status**                             | `online` or offline — the same signal as the green dot on the [dashboard](/dashboard#phone-numbers) |
| **Blocked**                            | Whether the number itself has been blocked                                                          |
| **Total Mappings**                     | How many contacts are attached to this number                                                       |
| **Mappings Today**                     | New contacts attached today                                                                         |
| **Outbound Today** / **Inbound Today** | Message volume each way today                                                                       |

This is where you confirm a Mac agent is actually online — the same connectivity that produces *"Sending number is offline"* in [Messages](/messages).

### Revoking device access

**Revoke access** is admin-only and disruptive. The confirmation is blunt about it:

> Removing a device can make any numbers mapped to that device unavailable. Inbound and outbound messages from that particular device can fail until you re-enroll.

Revoking removes the device's ID and secret; the Mac agent re-enrols the next time it connects. Account ownership of the number is kept, so you are not giving up the number itself — only that device's ability to act for it.

Use it when a Mac is lost, decommissioned, or you suspect its credentials leaked. For routine moves of a single contact between numbers, [remap the agent](/messages#remapping-the-agent) instead.