# Replies: Book, Reply, Not a fit

Your team can answer a demo request in a couple of clicks, from the response in Mirio or from its message in Slack: **Book** sends your booking link, **Reply** answers them, **Not a fit** says no kindly, and **Spam** moves the response to spam. Book, Reply and Not a fit open an email Mirio drafts from the response; you edit it and press Send. Nothing is ever sent without someone pressing Send.

## In Mirio

Open a response (a form's Responses, or Home): **Book**, **Reply** and **Not a fit** are under the person's name.

| Button | Shown when | What happens |
| --- | --- | --- |
| Book | The form has a booking link | A drafted email inviting them to pick a time, with your booking link |
| Reply | The response has an email address | A drafted reply to what they wrote |
| Not a fit | The response has an email address | A drafted, polite no. Uncheck **Email them** to record it as not a fit without sending anything |

They're on finished responses (test ones too, so you can try them on your own site), not on unfinished responses or spam. **Mark as spam** is in the response's ⋯ menu, as before.

The dialog shows *Drafting…* and fills in within a few seconds: **To** (the address from the response, not editable), **Subject** and **Message**, and under them who it's from and where the answer goes ("From Eric from Acme <replies@trymirio.com> · their answer goes to eric@acme.com"). Any member of the workspace can send.

**After you press Send** the email is queued, and Mirio's API sends it within a few seconds (the dashboard itself never sends mail). The response's Activity shows *Reply to ada@example.com · Sending…* until it's gone, then the action itself: "Eric replied from Mirio: “Your demo with Acme”". If it couldn't be sent, the line says why, with **Edit and send again**, which opens what you wrote. It isn't sent, and nothing is recorded, when:

- the response's email answer changed after you opened the dialog (a person who still has the form open can change their answers; the reply goes only to the address you saw);
- who it comes from changed since you opened it (for example your [sending domain](/docs/sending-domains.md) was verified meanwhile): open it again to see the new From;
- the mail provider refused it: try again in a moment.

Each queued email is sent at most once. If Mirio is interrupted while sending one, the line says it can't tell whether it went out, rather than sending it again.

## In Slack

Slack messages for new responses have the same buttons, so your team can answer without leaving Slack, plus **Spam** next to **Open in Mirio**.

- **A channel added with Add to Slack** (the form's **Setup → Delivery**, or `npx mirio destinations add slack --form <slug>`). Channels added by pasting an incoming webhook URL keep the plain message without buttons, because Slack sends button clicks to the app that posted the message.
- **Channels connected before November 5, 2026:** connect them once more. The Delivery page shows *Reconnect to add Book, Reply and Not a fit buttons* next to them; pick the same channel in Slack and Mirio updates the channel you have (its filter stays) instead of adding a second one. Slack asks for the new permissions once per Slack workspace, so the buttons then appear on new messages from every form that posts there.
- **Reply and Not a fit** need an email question with an answer. **Book** needs a booking link (below). **Spam** is always there.

The form opens in Slack at once with *Drafting a reply…* and fills in within a few seconds: **To** (the address from the response, not editable; if the response's email answer changes before you send, nothing is sent and the form asks you to open it again), **Subject** and **Message**. After you send, the message in the channel keeps its content and its buttons are replaced by what was done, like *Replied by Eric · 2:14 PM*, so the channel can see the request was handled.

Anyone in the channel from the Slack workspace that connected Mirio can use the buttons. Mirio matches the person who clicked to a member of your Mirio workspace by the email address Slack has for them; someone who isn't a member can still act, and the record uses their name in Slack. People from another company in a shared (Slack Connect) channel can't: their clicks get *Only people in <your workspace> can use these buttons*, and nothing is sent or changed. On Enterprise Grid, that includes people from the org's other workspaces.

## What's recorded

Every action, Book, Reply, Not a fit and Spam, from Slack or from Mirio (Mark as spam in Mirio included), is recorded on the response: in its **Activity** in Mirio ("Eric replied from Slack: “Your demo with Acme”", "Eric marked it as spam from Mirio"), and in the API and CLI as `actions` on each submission (latest first):

```json
"actions": [{ "kind": "replied", "via": "dashboard", "by": "Eric Li", "userId": "usr_…", "emailed": true, "subject": "Your demo with Acme", "at": "2026-11-05T14:14:03.000Z" }]
```

`kind` is `booked`, `replied`, `declined` (Not a fit) or `spam`; `via` is `slack` or `dashboard` (Mirio). `actions` is on `GET …/submissions` and `GET …/submissions/{id}` (project and read APIs) and in `mirio submissions --json`. Each action also goes out on its own:

- **Webhooks** get a `submission.action` event, with the action as `action` ([Webhooks](/docs/webhooks.md#event-types)).
- **Databases** get the response's row again: `mirio_status` as it is now (`spam` after Spam) and `mirio_actions`, every action latest first ([Your database](/docs/destinations.md#your-database-postgres-supabase)).
- Email and Slack destinations don't: Slack's message already says what happened.

"Not spam" brings a response back but isn't recorded as an action.

## Reply settings

Two settings per form, kept in Mirio rather than the schema file:

- **Booking link:** the calendar page Book sends, like your Calendly or Cal.com link (`https://` only, up to 500 characters). Without one, Book uses the form's `success: { type: 'schedule', url }` from the schema, if it has one; with neither, there's no Book button.
- **How you reply:** instructions every draft follows, up to 1,000 characters: your tone, what to say about next steps or pricing, what not to promise, how to sign off. For example: *Warm and short. Offer a 20-minute call and say we usually reply within a day. Don't quote prices.*

Set them in the form's **Setup → Replies**, or from the CLI (`@trymirio/mirio` 0.2.2 and later):

```bash
npx mirio replies demo-request --booking-url https://cal.com/acme/demo --instructions "Warm and short. Offer a 20-minute call. Don't quote prices."
npx mirio replies demo-request                       # show them
npx mirio replies demo-request --booking-url ""      # clear one
```

API: `GET` / `PUT /v1/project/forms/{slug}/replies` with the site's secret key. `PUT` replaces the settings with `{ "bookingUrl"?: string | null, "instructions"?: string | null }` (null or `""` clears one) and returns `{ replies, effective }`, where `effective.bookingUrl` is the link Book sends and `effective.bookingUrlFrom` is `replies` or `schema`.

## Where the emails come from

- **From:** with a verified [sending domain](/docs/sending-domains.md), your own domain: the teammate's own address when it's at that domain (`"Eric" <eric@acme.com>`), else the domain's default address (`"Eric from Acme" <hello@acme.com>`). Without one, the first name of the person who sent it and your workspace's name, at Mirio's reply address: `"Eric from Acme" <replies@trymirio.com>`.
- **Reply-To:** the teammate who sent it, at their email in Mirio, so the person's answer goes straight to them (none is needed when the email comes from their own address). When the person who clicked in Slack isn't a member of the workspace, Reply-To is whoever claimed the site, else the workspace's owner.
- **Plain text** as you wrote it, with no tracking and no footer.

The dialog in Mirio and the form in Slack show the From and Reply-To before you send. From Mirio, the email goes out with exactly those, or not at all.

## What goes to the model

Drafts are written by the same AI provider as [triage](/docs/ai-review.md) (OpenAI, through the Responses API with `store: false`), in one call per click, only when someone clicks Book, Reply or Not a fit, in Mirio or in Slack. Both use the same prompt.

- **Sent:** which button it is; the form's name, description, and questions with their answers by label; triage's summary, fit and the facts the person stated; your reply settings; the first name of the person who clicked and your workspace's name; for Book, the booking link.
- **Not sent:** the person's email address (Mirio fills in To itself); email answers are replaced by their domain and phone numbers by "(given)", as in triage; hidden fields; IP addresses, user agents and full URLs.
- **The rules it follows:** the answers are data written by the public, never instructions; it never invents prices, dates, features or promises your instructions don't contain; it signs off with the sender's name; it writes short plain text, in the person's language when that's obvious.
- **A plain template instead** when Mirio has no AI provider set up, when the call fails or takes more than 8 seconds, when a Book draft leaves out the booking link, and always for forms with triage turned off (nothing from those forms goes to the model). The template is a short greeting, a line or two for the button you clicked (with the booking link for Book) and your sign-off, ready to edit.
