EMAIL CONTROL PLANE

We don’t send your email. We prove what happened to it.

Password resets, invoices, “verify your email” — the mail your product has to send. You keep the mail server you already have (or SES, Mailgun, Postmark). We keep the proof: did it go out, what it said, and who sent it.

spoolway.com/panel/messageslive
STATUSRECIPIENTSUBJECTTIME
Deliveredwebhook[email protected]Payment failed — card expiring12s
Handed to your server[email protected]Reset your Basalt password40s
Deferred5/8[email protected]Credit note #1144m
Bounced[email protected]Verify your email address9m
— complaints · feed quiet since 06:12Z · counts complete only to that moment
pans sideways →
HOW IT WORKS

It sits between your app and the mail server you already pay for.

Spoolway sits between the apps you build and the mail server you already pay for. Nothing about your sending changes. What changes is that afterwards, you can look any of it up.

WHO WE AREWe are YS Progress Inc., a small Canadian company. We built the layer we could not buy — one place that answers did it send, what did it say, who can send.
1Your appyoursSends one request: who it goes to, which template to use, and the values to fill in.
2Spoolwaythis is usWe fill in your template, hand it to your server, and write down every step.
3Your mail serveryoursAmazon SES, Mailgun, Postmark, or your own server. We never send as if the mail were ours.
4Your customerGets the email, the same as they do today.
and every step above is written down

Afterwards you can look up the body, the server’s reply, and who sent it. That is the cards below.

An archive that answers “what exactly did it say?”Search any email later. We store the body encrypted, for as long as you choose — or, for password resets, at zero, where the hourly sweep removes it once the message is final. When a retention period ends, deletion is a dated event you can see — not a mysterious 404.
subjectInvoice #8102 for May
templatebilling/invoice@v41 · git 8c2f19a
Body deleted 12 Jun 2026 per billing-prod’s 30-day policy — the envelope stays (who it was to, the subject, the delivery record).
250 2.0.0 OK id=4F8A2C · smtp.acme.com · 312ms — the receipt outlives the body
Templates, versioned in gitWrite a password-reset once. Every product uses the same copy. Later you can see exactly which version went out.auth/password-reset@v18 · git 4efd21c
Every message names its ApplicationAn Application is one of your products. “Which of my products sent this?” is a filter, not a forensic hunt. Unapproved senders have nowhere to hide.billing-prod09:12:04Z · invoice@v41

Who can send. Who can read.

If you sign the contracts, these are the questions you actually ask — answered in the product, not in a PDF.

"Who read that password-reset email?"Reading a customer’s email is an audited actMost tools let anyone with a login read every customer’s mail and leave no trace. Here, opening a body records who, when and from where — and tells the reader they are being recorded.
Body views are audit-logged. Who, when, where — recorded. You are casey@acme-corp (owner).
14:22:08Z · body revealed · casey@acme-corp · 84.115.22.9 · audit #881709:41:55Z · body viewed · support@acme-corp (viewer) · audit #8790Jul 30, 18:03Z · export · dana@acme-corp (admin) · audit #8712Jul 29, 11:20Z · body viewed · casey@acme-corp (owner) · audit #8688Jul 28, 09:02Z · reveal denied · support@acme-corp (viewer scope) · audit #8641
viewers can look · only owner-role can reveal · audit export ships on Team
Every key belongs to a personFire someone and their send key dies with their access — watch:
JDj.doe@acme-corpspw_live_…c419
key revoked with membership · 14:02Z · audit #8812
Scope people to ApplicationsA contractor sees one product. A junior sees staging, not billing. That limit ships on Team and Enterprise; on Free, Pro and Scale a member sees every Application.
[email protected]client-acmeonly
Visibility never costs a licenceAnyone who only needs to look is free, on every plan. Support can always check the log.read-only viewers · free · unlimited

Watch how far we can see.

Your apps → us → your mail server (a transport, in our words — the server or SES/Mailgun/Postmark account you already have). The dashed line is where we stop guessing. A 250 from your server means it accepted the job, not that the inbox got it, so we call it handed to your server. Amazon SES over SMTP, and a plain server, are marked handoff only. Green appears only when Mailgun or Postmark later confirms delivery — tagged as their word, not ours — and if a feed goes quiet, the count shows a dash with the time, never a zero.
scroll to follow the path →
How a message travels: your app, Spoolway, your mail server, your recipientYour application sends one request to Spoolway, which renders the template, writes the record and hands the message to the mail server you already run. A plain server and Amazon SES over SMTP stop at that handoff. A delivery is shown only when Mailgun or Postmark reports it back.YOUR APPSauth-prodbilling-prodnotify-prodYOUR TRANSPORTyours — reputation and allinbox —beyond viewdelivered — eventwebhook evidence — Mailgun and PostmarkDeliveredwebhookSpoolwayCONTROL PLANE · SYSTEM OF RECORDqueue · custody · verbatim receiptstemplates · gitattributionencrypted archivesmtp.acme.comhandoff onlyAmazon SEShandoff onlyMailgunPostmarkcustody transfers hereour direct visibility endsPOST /v1/messagesSMTP · TLS250 OK

The whole integration.

You send a subject, the text, who it is from, and which product. We accept it, write it down, and hand it to your server. After that, every step is time-stamped and searchable.

SDKs planned · plain HTTP works today
terminal — your first send
curl -X POST https://spoolway.com/api/v1/messages \
  -H "Authorization: Bearer spw_…" \
  -H "Content-Type: application/json" \
  -d '{
        "application": "basalt-prod",
        "from":        { "email": "[email protected]" },
        "to":          "[email protected]",
        "subject":     "Your first message",
        "text":        "This is the first message through your account."
      }'
← 202 Accepted · queued, not yet sent
{
  "id": "2ee35675-6bae-42be-aa5e-6d4618d0c61d",
  "status": "queued",
  "application_id": 1,
  "over_monthly_quota": false,
  "attachments_captured": 0
}

Your transport. Your record.
Running in five minutes.

connect your mail server → name the product that will send → send a test message
Start free — no card requiredFree forever tier · caps pause, never auto-upgrade