Product

Everything your email touches, in one place.

Mailway sits between your app and the email providers you already use. It keeps an exact copy of every email and shows what happened to each one, and if a provider refuses a mail, it sends it through the next.

An email gateway sits between your application and its email providers: your app hands a message to one endpoint, and the gateway keeps the record, decides which provider carries it, and retries when one fails. Mailway is that layer for transactional email, and the record is the point: for every mail it answers “what exactly did we send?” Adopting it is a config change: standard SMTP or HTTP in, your own provider accounts out.

Every message first walks the rules gate and your routing policy; the suppression list is checked again before any provider is contacted. From there the product answers three questions: what was sent (the archive, which works as your app's Sent folder), what happened to it (the delivery history), and whether you can prove it (proof of delivery, on Business and up). Automatic failover keeps the record whole when a provider refuses. Everything is BYOK. Mailway records and routes; your providers deliver and bill you at their prices.

How it works

The whole migration
is a config change.

the migration — mailer config
const transporter = nodemailer.createTransport({
- host: "smtp.sendgrid.net",
+ host: "smtp.mailway.net",
port: 587,
- auth: { user: OLD_USER, pass: OLD_PASS },
+ auth: { user: MAILWAY_USER, pass: MAILWAY_PASS },
});
1

Point your app at Mailway

Swap host, port, and credentials in the mailer you already use: Nodemailer, Laravel, Rails, smtplib, whatever ships your mail today. 7 SMTP ports open, so it works even where your cloud blocks the usual ones. Prefer HTTP? There's an HTTP API.

2

Paste in the keys you already have

Add your provider API keys, assign them to projects, and pick how each project chooses a provider: fallback (a fixed order), free-first (providers with free allowance left go first, counted approximately), round‑robin (each provider in turn), or random (the default). All from the console, with no deploy and no DNS changes.

3

Mailway takes it from here

Mailway handles routing, retries, suppression, and the archive. Switching providers never touches your code again.

Join the waitlistprivate beta · invites go out one at a time
Archive

Your app doesn't have a Sent folder.
Mailway gives it one.

Every mail client keeps what you send. Your app sends the more consequential mail and keeps none of it: receipts, reset links, and contracts vanish the instant SMTP takes them. Mailway archives each message exactly as sent, searchable by sender, recipient, subject, and state. So when a customer complains and legal asks what exactly was sent to them, and when, you open the emails themselves instead of a log line that mentions them, for as long as your plan keeps them (30 days on Free, a custom window on Enterprise, up to unlimited with a retention add-on).

And it doesn't have to be a developer who looks. Give support or legal a member seat and they answer "what did we send?" themselves, only for the projects you give them.

Search a sample Sent folder →

storedthe raw message, byte-for-byte: headers, attachments, original DKIM signature intact (SMTP relays; an API send is kept as the JSON request Mailway accepted)
foundby sender, recipient, subject, plus operators like state:delivered, before:2024-06-01, rescued:yes
openedrendered · plain text · headers · raw source · attachments, unchanged for your plan's full retention
console.mailway.net — Mails
to:customer@gmail.com
Invoice #20412026-04-10✓ delivered
Payment reminder — invoice #19872026-03-12✓ delivered
Changes to our terms of service2026-01-15✓ delivered
Your password was changed2025-11-02✓ delivered
Welcome to YourApp2024-06-18✓ delivered
renderedheadersrawinvoice-2041.pdf
FromYourApp Billing <billing@yourapp.com>Tocustomer@gmail.comDateFri, 10 Apr 2026 09:41:02 +0000
Invoice #2041YourApp
Amount due · €240.00due 10 May 2026
accepted by Amazon SES 09:41:07 · deliveredsha-256 9f2c…a41e · the bytes as sent
5 of 5 sent to this customernewest first
Delivery history

“Sent” is not
the whole story.

Most mailers call a mail “sent” as soon as a server answers 250, SMTP’s OK. That only means the server took the mail, not that it arrived. Mailway records the rest: every attempt, every provider response, every error code, down to the SMTP session for mail relayed over SMTP. So when support asks “did that email go out?”, you answer with a timeline.

Where a provider reports back (every supported provider except Gmail and Any SMTP server), its delivered, bounced, and complained events land in one normalized delivery history, beside every other provider's attempts and responses on the same timeline. No single provider can see across your whole sending; the gateway in front of them can.

  • Search by subject, sender, recipient, or state
  • Delivered, bounced, complained: one vocabulary for every provider that reports outcomes
  • A bounce or complaint your provider reports blocks the address for every provider in that project
  • The SMTP session behind every relayed message, credentials redacted
  • Per-project analytics, with 30 days of volume
console.mailway.net — Mailssample data
invoice to:customer@
Invoice #2041
customer@gmail.com
delivered2m
Password reset
anna@outlook.com
delivered9m
Order confirmation
old-address@fake.io
bounced14m
Weekly digest
team@company.eu
accepted22m
Shipping update
leo@proton.me
pending31m
1 match
Delivery timeline — Invoice #2041
● received via SMTP :587 09:41:02
● rule matched → tag billing
● SendGrid 535 credentials rejected → retry in 5 s
● accepted by Amazon SES · 142 ms · 09:41:07
● delivered · Amazon SES delivery event · 09:41:08
Mailway · Proof of delivery
Certificate
of delivery
message m.01j9zk3vq7
content sha-256 9f2c…a41e ✓ match
dkim d=yourapp.com ✓ verified
accepted SES msg-id · 2026-04-10T09:41:07Z
delivered SES event · 2026-04-10T09:41:08Z
signature ed25519:Kx4v…9dQ=
verify mailway.to/m/f3XK…
Proof of delivery

“I never got that email.”
Here’s the receipt.

Every SMTP-relayed message is archived with its raw MIME and original DKIM signature. Any mail a provider accepted can be turned into an Ed25519-signed proof-of-delivery certificate, countersigned by an independent time authority so it can't be back-dated, and the certificate says whether it proves acceptance or delivery. The signature and the timestamp verify in anyone's browser, with no call to our database; compare the certificate's key with Mailway's to know it came from us. Share the rendered email itself with a private mailway.to link, and settle the dispute instead of having it.

Certificates are included on Business and up, and share links on Pro and up. Free has 1 limited share link a month.

Retention on paid plans
SendGrid Essentials
3 days
Mailgun Foundation
5 days
Postmark default
45 days
Mailway
90d → years

30 days on Free, 90 days on Pro, 6 months on Team, 1 year on Business, custom on Enterprise, with retention add-ons (+1 year, +3 years, +7 years, or unlimited) for SOX, HIPAA, and FINRA record-keeping. All of it EU-hosted.

Routing & failover

Providers fail.
Your app shouldn't notice.

Your app hands off once, gets 250 OK, and moves on. Mailway reads whatever the provider says back: a rejected key, an empty credit balance, a rate limit. Then it retries on the next provider in your chain five seconds later; a provider it has already tried waits on a widening backoff. Here's a bad day, handled with no one stepping in:

Failover needs at least two providers in a project. It is included on Pro and up, with up to 3 providers per project on Pro.

Your appsmtp.mailway.netSMTPROUTES · LOGS · FAILS OVERAmazon SES535 auth failedSendGrid451 credits exceededMailgun250 accepted · 97 msattempt 1attempt 2 · +5 sattempt 3 · +5 s

illustration · a failover chain of three · each retry to an untried provider leaves 5 s after the last failure

Four routing strategies

reliability
Fallback

Primary provider first. When an attempt fails, the next provider in your chain takes it five seconds later; one this message already tried waits on a widening backoff (1, 5, 15, 30 min).

cost
Free-first

Providers with free allowance left go first. Paid volume mostly starts once the free capacity you entered is used up (an approximate count, not a hard cap), and exhausted providers stay available for failover.

balance
Round-robin

Take providers in turn, one message after another. Spreads spend and sender reputation, and keeps any one account further from its rate limits.

simplicity
Random

A random provider per message, the default for a new project. Retries draw again, so for a guaranteed failover order pick Fallback.

Not all errors are equal

provider saysclassmailway does
550 user unknownhard bouncestop · mark rejected
535 credentials rejectedauthnext provider · 5 s
451 max credits exceededprovider quotanext provider · 5 s
429 too many requestsrate limitnext provider · 5 s

A permanent reject on a single-recipient send stops there instead of walking your chain. Addresses your providers report as bounced or complained go on your suppression list, and suppressed addresses are skipped before any provider sees them again. Everything else fails over, and every attempt is on the message's timeline.

The rules gate

One message in.
A defensible decision out.

Your app should send mail, not carry routing policy. Inside the gateway every message walks the same gate: your rules, which can tag it, hold it, or reroute it before any provider is chosen, and the suppression list before any provider is contacted. Every hold and tag lands on the mail's timeline; changing the policy is a console edit, not a redeploy.

queued before the 250rules versionedevery decision recorded
mailway · rules enginepolicy v.37
Incoming messagebilling policy
Invoice #2038
84 KB · 1 attachment
from
billing@yourapp.com
to
customer@gmail.com
raw MIME written to the queue, then the 250
Evaluate policyrules → suppressions
subjectcontains “invoice”match
recipient@gmail.commatch
size84 KBpass
Committed actions
tag · billingbcc · accountingroute · ses-eu
Decision recordm.01k3f2…vq7d
Amazon SES · eu-central-1
250 accepted · 89 ms

3 rules evaluated · 2 matched · decision on the timeline

appended to the mail's timeline

Your mailer config has
one block to change

Mailway is in private beta, and we onboard teams one at a time. Leave your email and we'll send your invite when it's your turn.

read the docs meanwhile →

join the waitlist — mailway.net

Your invite, one email away.

Mailway is in private beta, and we onboard teams one at a time. Leave your email and your invite arrives when it's your turn.