Skip to main content

Compare

The Amazon SES alternative, fully assembled

Send over REST or SMTP on a platform that already carries the logs, the dashboard, the webhooks and the scheduling. There is no AWS wiring to do.

What arrives assembled

Amazon sells sending. Everything around it is yours to build on AWS.

What comes with the plan on mailkube, and what you assemble yourself on Amazon SES
Comes withmailkubeAmazon SESDocs
Per-message events7 to 90 days by planCloudWatch, Firehose or SNSDocs(opens in a new tab)
Delivery dashboardYesVirtual Deliverability Manager
WebhooksYesAmazon SNSDocs(opens in a new tab)
Webhook signingHMACAmazon SNS
Scheduled sending30 daysNoDocs(opens in a new tab)
Idempotency keysYesNoDocs(opens in a new tab)
Framework packagesDjango, Laravel, Rails, Spring BootNoDocs(opens in a new tab)

Per-message logs are the sharpest line in that table. Your plan keeps 7 days on Free and 90 days on Volume, so a support question from last month still has an answer. The Amazon console shows four charts of hourly counts over 14 days. Anything finer needs a configuration set, an event destination and a store you run yourself.

Amazon also holds a new account in a sandbox. That account sends 200 messages a day, to verified recipients only, until Amazon reviews the production-access request.

Feature by feature

The rows below hold what each platform documents today. A docs link opens the mailkube page behind that row.

Feature by feature, mailkube against Amazon SES
FeaturemailkubeAmazon SESDocs
Where account data is storedEuropean Union29 regions worldwide
Free plan4,000 a month, 140 a dayNo
Dedicated IPsIncluded from EliteAdd-on, $24.95 a monthDocs(opens in a new tab)
IP warm-upYesYesDocs(opens in a new tab)
Tags per message20Not documentedDocs(opens in a new tab)
Per-topic opt-out on a sendYesYesDocs(opens in a new tab)
Outbound body and link scanYesNot documented
REST APIYesYesDocs(opens in a new tab)
SMTP relayYesYesDocs(opens in a new tab)
Stored templates, versionedYesNoDocs(opens in a new tab)
CLIYesYesDocs(opens in a new tab)

"Not documented" means the public Amazon SES documentation does not describe it. Checked on September 29, 2026.

Dedicated IPs are included from the Elite plan. Elite carries one at 100,000 emails a month, and Volume carries six at 750,000. Each new one warms on a six-stage ladder, from 50 messages a day to 10,000. Amazon sells a standard dedicated IP at $24.95 a month and warms it on a 45-day schedule.

Where your data lives

Customer data is stored in the European Union. Our infrastructure runs in European data centres, in the French OVHcloud group.

Amazon runs SES in 29 regions, seven of them European, and quotas, identities and suppression lists belong to the region you pick. mailkube runs one region, and every account is in it.

The detail is in the data processing agreement.

Two transports, headers included

POST to the REST API, or point the SMTP client you already run at smtp.mailkube.com. Everything the API takes as a JSON field, SMTP takes as a header. Those headers are stripped before the message reaches the recipient.

  • X-Mailkube-Tags carries the same tag list as the REST tags field
  • X-Mailkube-Topic attributes the send to a topic, so recipients who opted out are filtered
  • X-Mailkube-Template-Id and X-Mailkube-Template-Version render a saved template server-side

An SMTP send is the same message as an API send. It lands in the same logs, counts against the same quota and fires the same webhook events. The SMTP reference(opens in a new tab) lists every header, reply code and rate limit.

Amazon relays SMTP on email-smtp.<region>.amazonaws.com and documents a message-tag header and a list-management header. Its list management runs on one contact list per AWS account, holding up to 20 topics. No header there renders a stored template.

Two more differences sit on the send itself. Every mailkube send takes an idempotency key(opens in a new tab) , and a retried call returns the first result instead of sending twice. Every webhook arrives signed with an HMAC your SDK verifies for you. Amazon documents neither: its send API has no idempotency parameter, and delivery events reach you through an Amazon SNS topic whose signatures you verify yourself.

Your stack, already covered

Official SDKs cover Node, Python, Go, Java, PHP and Ruby. Django, Laravel, Rails and Spring Boot each have a package of their own. It plugs into the framework’s mail layer, and every client verifies your webhook signatures for you.

Amazon ships clients for more languages than that, and an aws command for its whole cloud. It publishes no framework package, so a Django or Laravel project wires the transport itself.

The CLI is a single binary. It sends over either transport and manages scheduled sends. While you develop, it runs a local webhook receiver. It carries a skill file, and a coding assistant reads the real command surface. Start from the SDK documentation(opens in a new tab) or the CLI guide(opens in a new tab) .

Migrating from Amazon SES

Install your language’s client, then replace the constructor and the key. The send call keeps its shape, with lowercase field names and no region to choose.

The same send, Amazon SES on the left and mailkube on the right

Amazon SES

import {
  SESv2Client,
  SendEmailCommand,
} from "@aws-sdk/client-sesv2";

const client = new SESv2Client({ region: "eu-west-1" });

const email = await client.send(
  new SendEmailCommand({
    FromEmailAddress: "hello@example.com",
    Destination: { ToAddresses: ["customer@example.com"] },
    Content: {
      Simple: {
        Subject: { Data: "Hello world" },
        Body: { Html: { Data: "<p>It works!</p>" } },
      },
    },
  }),
);
Host
email-smtp.eu-west-1.amazonaws.com
Port
587

mailkube

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

const client = new Mailkube({ apiKey: process.env.MAILKUBE_API_KEY });

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

SMTP is just as short. Change the host, the port and the credential in your mailer, and leave everything else alone. The messages you already send go out unchanged, and tags, topics and templates arrive as headers when you want them. Nothing forces a cutover date: run both platforms side by side and move one service at a time. The quickstart(opens in a new tab) covers the REST path and the SMTP guide(opens in a new tab) covers the relay.

When Amazon SES is the better fit

Amazon sells sending at infrastructure prices. A team that has already built the logging, the dashboards and the webhook plumbing pays less for the sending itself.

SES also sits inside AWS. IAM permissions, CloudTrail audit trails, KMS keys and private VPC endpoints come with the account, and a buyer already cleared on AWS inherits all of them. Messages there run to 40 MB, against 15 MB on a paid plan here.

The pricing page details every plan. The REST API and SMTP relay pages go deeper on the two transports.

Frequently asked questions

Frequently asked questions

What comes with the plan that Amazon SES leaves to me?
Per-message logs with retention, a delivery dashboard, signed webhooks, scheduled sends and an idempotency key. On Amazon each of those is an AWS service you configure, run and pay for, or it does not exist.
Amazon has European regions. Is that the same thing?
Amazon lets you pick a region, and quotas, identities and suppression lists then belong to it. mailkube runs one European region and every account is already in it, with nothing to configure and nothing to get wrong.
How long are my logs kept?
From 7 days on the Free plan to 90 days on Volume, per message. The Amazon console shows four charts of hourly counts over 14 days and keeps no per-message history.
Can I keep my SMTP configuration?
Yes. Point your mailer at smtp.mailkube.com on port 587 with a credential bound to your verified domain. Tags, topics and templates then travel as X-Mailkube headers on the message you already send.
Can I schedule a send?
Yes, on every paid plan, up to 30 days ahead, and the CLI manages the queue. The Amazon send API takes no scheduling parameter at all.
Where do the Amazon SES figures come from?
From the public pricing page and documentation on aws.amazon.com. The date under the feature table is the day they were last read. A change on their side moves that date.

Send your first email today

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