# Mass message performance

Judge how mass messages did, compare them fairly, and suggest what to try next.

## Calls

| Step | MCP tool | REST route |
| --- | --- | --- |
| Mass messages with results | `mass_message_performance` | `GET /v1/accounts/{accountId}/mass-messages` |
| Account revenue for context | `revenue_summary` | `GET /v1/accounts/{accountId}/revenue` |
| Media for a new send | `list_vault` | `GET /v1/accounts/{accountId}/vault` |

## Steps

1. Call `list_accounts` and pick the account.
2. Call `mass_message_performance` with `from` and `to` for the period the user asked about (default the last 30 days) and `sort=recent`. Use `sort=revenue` to find the best earners. Page with `cursor` while `hasMore` is true and you need more.
3. For each mass message, work out these numbers. Skip a rate when its count is null and say it is not known.

   | Number | How |
   | --- | --- |
   | Buy rate | `purchasedCount` / `sentCount` |
   | View rate | `viewedCount` / `sentCount` |
   | Gross per recipient | `revenue.gross.amount` / `sentCount`, in cents |
   | Net | `revenue.net` |

4. Compare like with like. Group by price (free, under $10, $10 to $25, over $25), by media type, and by day of week and hour of `sentAt`. A free message and a $30 message do different jobs.
5. Flag messages with `state` set to `unsent`. The creator took them back, so their numbers stop early.
6. Recommend one or two things to try, each tied to a number, such as "the $12 to $15 sets sold at twice the rate of the $25 ones".
7. If the user wants to send one, write the text, pick media with `list_vault`, and choose the audience by fan list (`list_fan_lists`). Show the plan, then call `send_mass_message` only when asked. It returns an approval link and `estimatedRecipients`. Nothing is sent until an owner or admin approves it.

## Output

```text
Last 30 days, @jessrivers, 9 mass messages
Best earner   "Sunday set" $15.00, 1,204 sent, 5.1% bought, $915.00 gross ($0.76 per recipient)
Weakest       "Gym pics" $25.00, 1,190 sent, 0.8% bought, $238.00 gross
Pattern       $12 to $15 sold at twice the rate of $25. Evening sends did better than morning ones.
Try next      A $14 set on Sunday evening to the Favorites list.
```

The numbers above are an example of the layout, not real data.

## Pitfalls

- A mass message's `revenue` is the total of every copy. The same sales also show as single paid messages in fan chats and in transactions. Never add them together.
- Revenue keeps coming in for days after a send. Say how old each message is, and do not judge one sent in the last day or two against older ones.
- `viewedCount` and `purchasedCount` can be null. Null means unknown, not zero.
- Buy rate on a small send swings a lot. Say how many were sent next to every rate.
