Skip to main content

Email infrastructure you can stop thinking about

We run the mail infrastructure your product depends on, so you can go build it.

Why mailkube

Why teams choose mailkube

Made for developers

POST to the REST API, or relay through SMTP from whatever you already run. Templates, tags and topics travel over SMTP headers. An existing system gets them without a rewrite.

Deliverability expertise

The routing is run by people who have spent more than fifteen years on email infrastructure and inbox placement.

Less to build yourself

Templates, scheduled sending, webhooks, topics and tags ship with the product.

GDPR compliant, hosted in Europe

Customer data is stored at rest in the European Union, and operational access to it happens from inside the EU.

Read the full argument
Integration

Integrate in minutes

Send your first email in minutes. Official SDKs for six languages, a CLI for your terminal, and SMTP for anything that already sends mail.

Any language works. Six ship an official SDK, and everything else sends over HTTP or SMTP.

import { Mailkube } from "@mailkube/mailkube-node";

const client = new Mailkube({ apiKey: "mk_<key_id>_<secret>" });

const email = await client.emails.send({
  from: "Acme <hello@yourdomain.com>",
  to: "customer@example.com",
  subject: "Hello world",
  html: "<p>It works!</p>",
});

console.log(email.id);
The platform

Everything around the send

These five sections follow one message, from the draft to the delivery report.

01 Content

Templates ready to send, or your own

Copy a ready-made template, or open the editor on a blank page. Send its id and a few values, and mailkube renders the message. A wording change stops needing a deploy.

Versioned, never overwritten

Every save appends a version. Pin one, or send latest and restore an earlier snapshot when a change goes wrong.

Variables with a declared schema

Declare what a template expects. A send missing a required variable is rejected at validation.

Templates
02 Audience

Topics and tags on every send

Classify a send with a topic, and label it with your own tags. Both follow the message, so you can slice your sending by either one.

Topics classify the traffic

A topic is the mailing list a send belongs to: a newsletter, product updates, receipts. Set it on REST or in an SMTP header.

Tags carry your own labels

Attach up to twenty tags of your own metadata per message. They travel into the logs, the dashboards and the webhook payload.

POST /mta/v1/emails
{
  "from": "Acme <hello@acme.com>",
  "to": "customer@example.com",
  "subject": "Your invoice",
  "topic": "receipts",
  "tags": [
    { "name": "campaign", "value": "billing" },
    { "name": "environment", "value": "production" }
  ]
}
03 Timing

Emails that can wait

Add a timestamp to a normal send and mailkube transmits it at that instant. An appointment reminder, a nightly digest, a receipt that should not arrive at 3am.

Cancel or move it before it goes

List, retrieve, reschedule or cancel any scheduled message before its due time, one at a time or a whole batch at once.

One batch id, many sends

Give related messages the same batch id, then move or cancel the whole group in one call. mailkube is not a campaign builder; a batch is a label for one send.

Scheduled forMessageState
07:00 +02:00appointment_remindersent
08:30 +02:00invoice_receiptscheduled
09:00 +02:00nightly_digestscheduled
04 Outcome

Know what happened to every email

Receive a signed event at your endpoint when a message is delivered, bounces, is opened or is marked as spam. Your application never polls.

Signed with your endpoint secret

Verify every delivery with your endpoint secret. The SDKs ship the verifier.

Retried until you answer

A failed delivery is retried with backoff for up to 48 hours. Deduplicate on the delivery id, which stays stable across retries.

POST /your-endpoint
{
  "type": "email.delivered",
  "created_at": "2026-06-30T12:00:00.123456+00:00",
  "data": {
    "email_id": "56761188-7520-42d8-8898-ff6fc54ce618",
    "to": ["alice@example.com"],
    "subject": "Sending this example",
    "tags": [{ "name": "campaign", "value": "welcome_series" }],
    "delivery": {
      "recipient": "alice@example.com",
      "timestamp": "2026-06-30T12:00:00.123456Z"
    }
  }
}
05 Control

Send from your terminal or your agent

Send mail, manage scheduled sends and stream webhook events from one binary. It carries a skill file, so a coding agent drives it correctly instead of guessing at flags.

See the message before it goes

Dry-run any send. It prints the exact request that would have gone out, and transmits nothing.

Webhook events in your terminal

Watch deliveries arrive as they happen while you build the handler. Add a forward flag to re-post each one into your local application.

your terminal
$ mailkube emails send --dry-run \
    --from "Acme <hello@acme.com>" \
    --to customer@example.com \
    --subject "Your invoice" \
    --text "Thanks for your order."
{
  "method": "POST",
  "url": "https://api.mailkube.com/mta/v1/emails",
  "body": {
    "from": "Acme <hello@acme.com>",
    "to": ["customer@example.com"],
    "subject": "Your invoice",
    "text": "Thanks for your order."
  },
  "dryRun": true
}

$ mailkube webhooks listen \
    --public-url https://acme.tunnel.dev
listening on 127.0.0.1:4318
email.delivered  8f1d2c3b  customer@example.com
your coding agent
$ mailkube skill install
$ claude "send Ada the welcome email"

mailkube emails send --dry-run \
    --template-id welcome-v2 --var name=Ada \
    --from "Acme <hello@acme.com>" \
    --to ada@example.com \
    --subject "Welcome aboard"

mailkube emails send \
    --template-id welcome-v2 --var name=Ada \
    --from "Acme <hello@acme.com>" \
    --to ada@example.com \
    --subject "Welcome aboard"
{
  "id": "8f1d2c3b-...",
  "messageId": "<8f1d2c3b-...@msg.mailkube.com>",
  "to": ["ada@example.com"],
  "replayed": false,
  "scheduled": false
}
Pricing

Pricing

Free

  • 4K emails/mo
  • 140 emails/day
  • SMTP & API Access
  • 7-day log retention
  • Basic analytics
  • Community
Join the waitlist

Launch

  • 10K emails/mo
  • 350 emails/day
  • SMTP & API Access
  • 7-day log retention
  • Advanced analytics
  • Email Support
Join the waitlist

Momentum

  • 50K emails/mo
  • 1700 emails/day
  • SMTP & API Access
  • 14-day log retention
  • Advanced analytics
  • Priority Support
Join the waitlist

Send your first email today

Start free, no card. Point an existing SMTP client at us, or install an SDK and make one POST.