Test signup, password reset, invite, and notification flows without shared inboxes or public disposable tools. Claim a test subdomain and every email to anything@acme.mailoven.com lands in a private team inbox you can inspect in the UI or assert on from your test suite.
How it works
Pick a slug and your team gets yourcompany.mailoven.com. No mailboxes to create, no DNS work, no setup per address.
Send your app to reset-run-42@yourcompany.mailoven.com or any other address. Every message is captured instantly.
Open the email in the shared inbox for manual QA, or poll via REST API / JS client from Playwright, Cypress, Jest, or Vitest.
See it in action
import { test, expect } from "@playwright/test";
import { MailOvenClient } from "@mailoven/client";
const mailoven = new MailOvenClient({
apiKey: process.env.MAILOVEN_API_KEY,
slug: "acme",
});
test("password reset sends a link", async ({ page }) => {
const inbox = "reset-" + Date.now();
await page.goto("/forgot-password");
await page.fill("[name=email]", mailoven.getEmailAddress(inbox));
await page.click("button[type=submit]");
const email = await mailoven.waitForEmail({
to: inbox,
filter: { subject: "Reset your password" },
});
expect(email.bodyText).toContain("reset");
});Use a unique inbox per test run, then assert on the subject, body, links, or recipients.
Features
Use a unique inbox like run-123@acme.mailoven.com without creating mailboxes ahead of time.
Manual testers and developers can inspect the same emails in one private team inbox.
Poll for emails from Playwright, Cypress, Jest, Vitest, or plain HTTP.
View docs →Your subdomain belongs to your org only. No public inbox browsing or shared throwaway addresses.
Delete inboxes in tests or let retention purge old staging mail automatically.
Use API polling or webhooks to react when a new email lands.
Also included: sender allowlists plus TLS, DKIM, SPF, and DMARC results on each email.
Pricing
Free during beta for teams testing real app emails. No credit card required.
Integrations
Playwright, Cypress, Jest, Vitest, Cucumber, or plain HTTP from any stack.
Create a private test subdomain, trigger your app, and assert on the message.