Customers
The customer directory, what a profile holds and where it comes from, and writing to a customer first.
Every role can edit, delete and reach out to customers. See Roles.
The directory
| Part | Shows |
|---|---|
| Face | Their picture, or their initial |
| Name | Their display name |
| Verified | Your site signed their identity. See Identity |
| Under the name, unless the name is the email | |
| 3 conversations | Their thread count. 50+ conversations at 50 or more |
| Time | When they last sent a message |
| Paper plane | Reach out. Shows on hover |
- The directory lists the most recently seen customers, up to 100. Search customers matches names and emails among those.
- Browsers that share an email address fold into one customer, up to 20 browsers per address.
- The display name is their name, then their email, then Customer #12, then Anonymous visitor.
- Every customer gets a number when they first write in. Type
#12in the command palette to open one.
With nobody yet, the page reads No customers yet.
A profile
The header holds their face, name, Verified badge, number badge such as #12, and email. The number badge shows when the heading is a name or an email.
| Button | Does |
|---|---|
| Reach out | Writes to them first |
| Pencil, Edit customer | Edits their details |
| Trash, Delete customer | Deletes them |
Below the header are Insights, Details and Conversations.
Insights
Median reads a customer's settled conversations and keeps durable facts about them.
| Group | Holds |
|---|---|
| About | Who they are and where they work |
| Setup | What they use, and how it is deployed |
| Plan and billing | Plan, seats, spend |
| Support preferences | How they like to be handled |
| Open commitments | Something your team told them that is still owed, or a problem left open |
| Rule | Detail |
|---|---|
| When | 2 minutes after a thread is resolved. Other settled threads catch up when you open the profile or the thread's details panel |
| Settled | Resolved, archived, or no longer their newest thread |
| Window | Their 10 most recent conversations. Each thread's new messages are read once |
| Size | Up to 24 insights per customer |
| Plan | Standard or Pro. On Explore the page shows "Available on Standard and Pro." See Plans |
The refresh button reads Generate insights on an empty profile and Refresh insights otherwise. It clears the insights and reads the settled threads in the window again.
To remove one insight, hover it and press the cross, Remove insight. It stays gone until a newer conversation or a refresh brings it back. Deleting a conversation removes the insights learned from it.
| Line | Means |
|---|---|
| Reviewing conversation history... | The first read is running |
| Updating insights... | A read is running over existing insights |
| Insights appear as conversations are resolved. | Nothing learned yet |
The agent carries insights into its replies, and treats Open commitments as promises to keep. It only uses insights learned on the same browser, or under the same verified identity. The customer page shows every insight under the email address.
The same Insights section sits in the inbox details panel.
Details
| Field | Comes from |
|---|---|
| Customer since | The month they first wrote in |
| Last seen | When they last sent a message |
| Local time, Language, Browser | The browser, sent by the widget with each message. See Context and diagnostics |
| Your own keys | user.metadata from your site |
| Company, Title, Location | A teammate's edit, or a lookup |
| Profiles | Gravatar and GitHub links found by a lookup |
Name, email and picture come from your site's user, from the customer typing them in chat, from an email's From line, from a teammate's edit, or from a lookup.
Which value wins
- A lookup fills blank fields and updates values an earlier lookup wrote. It never replaces a value from your site, an email, the chat, or a teammate.
- Your site sends
userwith every message. Its name, email and picture replace older values, including a teammate's edit. - When several browsers share an email, the name and picture come from the most recently seen browser that has a name. Company, Title and Location come from the most recently seen browser that has each one. Metadata merges across browsers.
Lookups
Median asks Gravatar and GitHub about each new or changed email address. No setup or key is needed.
| Rule | Detail |
|---|---|
| GitHub match | Only a user profile that lists the exact address |
| Name | GitHub first, then Gravatar |
| Picture | Gravatar first, then GitHub |
| Company, Title, Location | Gravatar first, then GitHub |
| A miss | Asked again after 30 days |
| Older customers | Opening the directory sends up to 10 of them to be looked up |
Metadata from your site
Pass user.metadata on the widget. Each key shows in Details here and in the inbox, and the agent reads it too.
<MedianSupport
apiKey="median_pk_..."
user={{
name: session.user.name,
email: session.user.email,
metadata: { plan: "Scale", seats: "12", signedUpAt: "March 2024" },
}}
/>| Rule | Detail |
|---|---|
| Entries | The first 16 |
| Length | Keys and values are cut at 200 characters |
| Values | Strings only. Format dates and numbers yourself |
| Labels | signed_up_at and signedUpAt both show as Signed up at |
| Updates | Sent with each message. A newer set replaces the older one |
Every widget prop is on Support widget.
Conversations
The profile lists up to 50 of their conversations, newest first. Each row shows the subject, the last message, the thread id, Open, Resolved or Closed, and when it last moved. A row opens the thread in the inbox. With none, the list reads No conversations yet.
Edit a customer
Press the pencil. Edit customer opens.
| Field | Limit |
|---|---|
| Picture | PNG, JPEG, WebP, GIF or AVIF. Up to 4 MB |
| Name | 80 characters |
| 320 characters, a valid address | |
| Company | 120 characters |
| Title | 120 characters |
| Location | 120 characters |
Each field stops accepting text at its limit.
- Save writes every browser that shares their email.
- A new email moves all of them to the new address, and looks it up again.
- Clearing a field removes it.
| Error | Cause |
|---|---|
That does not look like an email address. | The email is invalid |
This customer is no longer here. | Someone deleted them |
We could not upload that picture. Check your connection and try again. | The upload failed |
Reach out
Write to a customer first. The message starts a new thread.
| Start from | Asks who first |
|---|---|
| Reach out on a profile | No |
| The paper plane on a directory row | No |
| The paper plane at the top of the inbox | Yes |
| Reach out to a customer in the command palette | Yes |
Pick who writes
Choose Write it myself, or Ask Median AI to have the agent draft it. The tab shows your agent's name.
Write the message or the brief
Under Write it myself, write the message. Under Ask Median AI, say what it should be about. The agent drafts from your brief, their insights and metadata, and their last 3 conversations. When the message goes by email, a Subject field appears.
Send
Press Send, Cmd+Enter or Ctrl+Enter. A brief comes back as a draft, shown as the customer will see it, after Drafting your message.
Approve the draft
Edit the draft in place, then press Approve. Back returns to the brief.
The dialog closes and opens the new thread.
Where it lands
The line under the dialog's title says where the message goes.
| Line | Delivery |
|---|---|
| "Delivered to the widget on their next visit." | In the widget. No email is on file, or email support is off |
| "Delivered to the widget, with an email copy to jane@example.com if they are away." | In the widget, and by email when they are away. See Email |
| "Delivered by email to jane@example.com." | By email from your support address. They never opened the widget |
| "This customer has no email address or widget session." | Nowhere. Send stays disabled |
Customers who only wrote in by email or Discord cannot receive widget messages. Without an email address, or with email support off, they cannot be reached at all.
Who has the thread after
| Tab | Who has it | Also |
|---|---|---|
| Write it myself | You. The agent is paused, as after a reply | |
| Ask Median AI | The agent, which answers their reply | The brief stays on the thread as an internal note that starts "Asked Median AI to reach out" |
Limits and errors
| Limit | Value |
|---|---|
| Message | 4,000 characters |
| Brief | 1,000 characters. Longer briefs are cut |
| Subject | 80 characters. Empty uses the message's first line |
| Ask Median AI | Standard or Pro |
| Email delivery | Standard or Pro, and email support switched on |
Plans are on Billing.
| Error | Cause |
|---|---|
There is no way to reach them yet. They have not opened the widget and have no email address. | No widget session, and no email address or email support off |
That customer is not one of yours. | The id belongs to another workspace, or they were deleted |
The draft came back empty. Try again. | The agent wrote nothing |
The draft did not come back. Try again in a moment. | Drafting failed |
Reach out from code
median customers reach-out <customer-id> --body "Your export is ready."| Surface | Use |
|---|---|
| REST | POST /v1/customers/{id}/reach-out with body, and optional subject, as ("me" or "agent") and brief. See the management API reference |
| CLI | median customers reach-out. Flags are in the CLI reference |
| Assistant | Ask the assistant to write to someone |
Sending as the agent over the API sends your text as written. No draft step runs.
Delete a customer
Press the trash. The dialog asks Delete Jane Doe? and warns "Permanently delete this customer and all their conversations, messages, and files."
Deleting removes every browser that shares their email, their insights, their picture, and every conversation with its messages and files. A browser that comes back later starts over as a new customer with a new number. There is no undo.