Docs
After submitReplies from Slack: Book, Reply, Not a fit
View as Markdown(opens in a new tab)

Replies from Slack: Book, Reply, Not a fit

Slack messages for new responses have buttons, so your team can answer a demo request without leaving 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 a form in Slack with an email Mirio drafts from the response; you edit it and press Send. Nothing is ever sent without someone pressing Send.

What you need

  • 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, next to Open in Mirio.

The buttons

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
Spam Always The response moves to spam, the same as Mark as spam in Mirio ("Not spam" there brings it back). No email

The form opens 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 can use these buttons, and nothing is sent or changed. On Enterprise Grid, that includes people from the org's other workspaces.

Every action is recorded on the response: in its Activity in Mirio ("Eric replied from Slack: “Your demo with Acme”"), and in the API and CLI as actions on each submission (latest first):

"actions": [{ "kind": "replied", "via": "slack", "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. actions is on GET …/submissions and GET …/submissions/{id} (project and read APIs) and in mirio submissions --json. Webhooks get each action as its own submission.action event, with the action as action (see below).

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, messages have 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):

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, your own domain: the teammate's own address when it's at that domain ("Eric" <[email protected]>), else the domain's default address ("Eric from Acme" <[email protected]>). Without one, the first name of the person who clicked and your workspace's name, at Mirio's reply address: "Eric from Acme" <[email protected]>.
  • Reply-To: the teammate who clicked, 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 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 modal shows the From and Reply-To before you send.

Every action (Book, Reply, Not a fit, Spam) is recorded on the response: its Activity in Mirio, actions on the submission in the API and mirio submissions --json, and a submission.action event on the form's webhooks, so a CRM or your own agent hears what the team did.

What goes to the model

Drafts are written by the same AI provider as triage (OpenAI, through the Responses API with store: false), in one call per click, only when someone clicks Book, Reply or Not a fit.

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