Integrations
How Mailclutch plugs into the rest of your workflow — and what it deliberately doesn't do.
Slack
Create an incoming webhook in your Slack workspace, then add it in Settings → Webhooks with the type slack. Every captured email posts a message with the project, the subject, the sender and an excerpt.
Scope it to a single project if you want one channel per client, or leave the project empty for everything the organization captures. See the webhooks guide.
Anything else, over HTTP
An http webhook posts a signed JSON payload to any public URL, which is the integration point for everything we don't support natively: your own service, an automation platform, a Discord relay, a CI job waiting on an email.
POST https://your-service.example.com/hooks/mailclutch X-MailClutch-Signature: <hmac-sha256 of the raw body> { "event": "email.received", "inbox": { … }, "email": { … } }
Coding agents
Mailclutch runs an MCP server, so an agent in your editor can create a sandbox, point the project at it, wait for the mail your code sends and read it back — with no account and no API key. One command installs it. See the MCP guide.
End-to-end tests
In Playwright, Cypress, Pest or anything else, use the read API: empty the project, run the scenario, then poll for the email. No SDK involved — it's three HTTP calls.
// Playwright import { test, expect } from '@playwright/test'; import type { Metadata } from "next"; import { localizedPageMetadata } from "@/lib/seo"; export function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> { return localizedPageMetadata(params, { href: "/docs/integrations", title: "Integrations", description: "How Mailclutch plugs into the rest of your workflow — webhooks, Slack, browser notifications and the REST API — and what it deliberately doesn't do.", }); } const API = 'https://app.mailclutch.com/api/v1'; const headers = { Authorization: `Bearer ${process.env.MAILCLUTCH_TOKEN}` }; const INBOX = process.env.MAILCLUTCH_INBOX_ID; test('sends a welcome email', async ({ page }) => { await fetch(`${API}/inboxes/${INBOX}/emails`, { method: 'DELETE', headers }); await page.goto('/signup'); await page.fill('#email', 'test@example.com'); await page.click('button[type="submit"]'); await expect.poll(async () => { const res = await fetch( `${API}/inboxes/${INBOX}/emails?query=welcome&limit=1`, { headers }, ); const { data } = await res.json(); return data.length; }, { timeout: 10_000 }).toBeGreaterThan(0); });
Give CI its own project and its own token, scoped to read and purge, so a test run can never empty an inbox a human is using.
Browser notifications
Mailclutch can send a browser notification when an email lands in a project you follow — useful when you are testing a flow in another tab. Enable it per browser in Settings → Notifications, and mute the projects you don't want to hear about.
Tools you can't reconfigure
Some systems won't let you change their SMTP settings. Every project also has its own address at @mailclutch.com: send or forward to it and the message lands in the project like any other capture.
What we don't have
There is no GitHub, Linear, Jira, Zapier or Postman integration today, and no marketplace app. If you need one of those, an HTTP webhook plus the API will get you there — and telling us which one you rebuilt by hand is the best way to get it built properly.