Send email from Linear workflows — with approval before delivery

Linear tells your agent when work changed state. MultiMail decides whether that change justifies an outbound email, and makes a human confirm before it goes out.


Linear is the issue tracker and project coordination tool most engineering teams actually use. Agents built on top of Linear data — triage bots, release coordinators, customer escalation handlers — frequently need to send email when something changes: a P0 closes, a cycle slips, a release ships. The problem is that Linear state changes do not map cleanly onto email-worthy events. An agent that emails customers every time an issue moves to Done will burn trust fast.

MultiMail sits between your Linear agent and your outbox. When the agent decides an email should go out, MultiMail captures that intent and holds it for human review under `gated_send` mode, or logs it with full auditability under `monitored` mode. Your team gets to confirm that the agent's judgment is correct before anything reaches a customer or teammate.

The integration is a webhook handler plus a few MultiMail API calls. Linear fires a webhook on issue state changes, cycle transitions, or project updates. Your handler reads the Linear context, decides whether an email is warranted, and calls `POST /send_email` — or queues the decision for a human to approve via `list_pending` and `decide_email`.

Built for Linear developers

State changes are not email triggers

A Linear issue moving from In Progress to Done is internal signal, not a customer event. MultiMail's `gated_send` mode lets your agent propose the email while a human confirms it's appropriate — preventing notification spam from automated workflows.

Full audit trail on every outbound notification

Every email sent from a Linear-triggered agent is logged with the originating issue ID, the agent's reasoning, and approval timestamps. When a customer asks why they received a message, you have a complete record tied back to a specific Linear event.

Oversight mode per mailbox

Set `autonomous` for internal Slack-replacement notifications, `gated_send` for customer-facing release notes, and `read_only` for agents that should only report what they'd send. Oversight mode is configured per mailbox, not per request.

Approval webhooks close the loop

MultiMail fires webhooks on approval events. Your agent can listen for `email.approved` and `email.rejected` to update the Linear issue — adding a comment, changing state, or notifying the assignee — without polling.

No sending infrastructure to operate

MultiMail handles deliverability, DKIM signing, bounce tracking, and unsubscribe headers required by CAN-SPAM and GDPR. Your Linear agent calls one API endpoint; MultiMail handles the rest.


Try it with your agent

No code, no dashboard. Paste this to your AI agent — it connects MultiMail, creates an inbox, and builds the flow for you.

1. Get MultiMail ready: read https://multimail.dev/llms.txt, connect the MultiMail MCP server to this agent, create a free inbox, and set up a verified sending domain. 2. Wire this into Linear using Linear’s agent session flow: when Linear starts or updates an assigned agent session for an issue, use the issue, comments, status, assignee, subscribers, and related project context Linear provides as the work-state signal. 3. Give yourself these MultiMail capabilities through MCP only: check the inbox for replies or delivery context, compose a draft reply when a Linear issue state change appears to need outbound email, and send or schedule email only through MultiMail. 4. Send one test email from the verified sender to the developer’s own address. The subject should identify the Linear issue or test session, and the body should say this is a MultiMail plus Linear agent test. 5. Run with MultiMail oversight mode set to gated_send. For every Linear-triggered outbound message, draft the email, show the intended recipient, subject, and body for human review, and do not send until the developer explicitly approves.

Step by step

1

Install the Linear SDK and configure your MultiMail mailbox

Install the Linear TypeScript SDK. In your MultiMail dashboard, create a mailbox for agent-sent notifications (e.g., `[email protected]`) and set its oversight mode to `gated_send` to hold all outbound emails for review.

2

Register a Linear webhook for issue events

In your Linear workspace settings, create a webhook pointing to your handler endpoint. Subscribe to `Issue` events at minimum. Linear will POST to your URL on every state change, assignment, or label update.

3

Write the webhook handler

Handle the Linear webhook payload, fetch any additional context from the Linear API, and call `POST /send_email` on MultiMail. Include the Linear issue ID in `metadata` so you can correlate approval decisions back to issues.

4

Handle MultiMail approval webhooks to close the loop

Register a MultiMail webhook for `email.approved` and `email.rejected` events. When an approval decision arrives, extract `metadata.linear_issue_id` and post a comment to the Linear issue confirming whether the notification was sent.


Common questions

Does MultiMail integrate directly with Linear or does it require custom code?
MultiMail does not have a native Linear connector. You write a webhook handler that receives Linear events, queries the Linear API for context, and calls the MultiMail REST API. The integration is typically 50–100 lines of TypeScript. There is no Linear-specific SDK on the MultiMail side — the same `POST /send_email` endpoint used for all integrations applies here.
How do I prevent the agent from emailing the same person twice about the same issue?
Include a deduplication key in the `metadata` field (e.g., `linear_issue_id` + `event_type`). Before calling `POST /send_email`, call `GET /check_inbox` or query your own database for prior sends tagged with the same key. MultiMail does not deduplicate automatically — your handler is responsible for checking whether a notification was already proposed or sent.
Can I use `gated_all` for internal stakeholder digests and `autonomous` for read receipts in the same integration?
Yes. Oversight mode is set per mailbox, not per API call. Create two mailboxes — `[email protected]` with `gated_all` and `[email protected]` with `autonomous` — and route calls to the appropriate `from` address based on the email's stakes.
How do I attach the approval decision back to the Linear issue without polling?
Register a MultiMail webhook for `email.approved` and `email.rejected` events in your dashboard. When MultiMail fires the webhook, your handler receives the full email object including the `metadata` you attached at send time. Extract `metadata.linear_issue_id` and call `linear.createComment()` to post the outcome to the issue.
Does MultiMail handle unsubscribes for Linear-triggered notifications?
Yes. MultiMail automatically inserts a List-Unsubscribe header and honors unsubscribe requests as required by CAN-SPAM. If a recipient unsubscribes, subsequent calls to `send_email` targeting that address will be blocked with a `recipient_unsubscribed` error. Your handler should surface this back to Linear — e.g., tag the issue or update a custom field — so the agent doesn't keep proposing emails to opted-out addresses.
Can I run this integration in a Linear-native automation or does it need an external server?
Linear automations cannot make arbitrary HTTP requests — they trigger predefined actions within Linear. You need an external server or serverless function (Cloudflare Workers, AWS Lambda, a Hono app) to receive the webhook, query the Linear GraphQL API, and call MultiMail. The handler is stateless and can run in any environment that supports outbound HTTPS.

Explore more

The only agent email with a verifiable sender

Email infrastructure built for AI agents. Verifiable identity, graduated oversight, and a hosted MCP server. Formally verified in Lean 4.