Migrate from Amazon SES

Migrating from Amazon SES to Sendpository

Everything that changes when you move your email from Amazon SES, in the order you'll do it. A day if you also retire SNS topics, SQS queues and bounce-processing Lambdas; an hour for the send call alone.

In short

Migrating from Amazon SES to Sendpository replaces the AWS SDK, SigV4 signing and IAM credentials with one HTTPS request and a Bearer key. Bounce and complaint events arrive as signed webhooks instead of going through configuration sets and SNS, and suppression, logs and a dashboard come built in. You trade SES's lowest-in-class per-email price for far less infrastructure to run.

Or let your coding agent do the whole migration

Paste it in. It finds every Amazon SES call, rewrites it, updates your webhook handler and switches over behind a flag you can flip back.

Show the prompt

Switch this project's email from Amazon SES to Sendpository. First run `npx sendpository@latest init` - it opens my browser for me to approve, saves the API key and installs the Sendpository skill - then follow the skill's migration guide (references/migrate.md). If you can't run commands, read https://www.sendpository.com/agents/sendpository/references/migrate.md instead.

1. API differences

Amazon SESSendpository
EndpointSESv2 SendEmail (POST /v2/email/outbound-emails), usually through the AWS SDKPOST https://api.sendpository.com/v1/emails
BodyFromEmailAddress, Destination.ToAddresses, Content.Simple.Subject.Data, Content.Simple.Body.Html.Datafrom, to, subject, html, text
AttachmentsContent.Simple.Attachments, or a raw MIME messageattachments: [{ filename, content (base64), content_type }]
MetadataEmailTags: [{ Name, Value }] with a configuration settags: a string key/value object
EventsConfiguration set → SNS, EventBridge, Firehose or CloudWatchSigned webhooks to your URL, plus searchable logs
Response{ MessageId }{ "id": "..." }

2. Authentication differences

Amazon SESSendpository
API keyAWS SigV4 with IAM credentials and an ses:SendEmail policyAuthorization: Bearer sp_... - no IAM, no region

Create the key under API keys in the dashboard. It is shown once, so put it straight into SENDPOSITORY_API_KEY in your secrets manager. Keep the Amazon SES key until the switch is finished, then revoke it.

3. Domain setup

Add your sending domain in Sendpository and publish the records it shows: a 2048-bit DKIM key signed as your own domain, plus SPF and a bounce MX on a sp. subdomain so your existing records are never edited. DMARC is recommended; if you already publish one, leave it as it is.

  • SES Easy DKIM publishes three CNAMEs. Sendpository publishes its own DKIM TXT record on a different selector, so they coexist.
  • There is no sandbox or production-access request: sending opens once your domain verifies and your account email is confirmed.

Not sure what’s published already? Run the domain through the email DNS checker.

4. Webhooks

Amazon SESSendpository
VerificationSNS notifications, verified with the SNS message signature and certificateHTTPS POST with Sendpository-Signature: t=<unix>,v1=<HMAC-SHA256>

Event names

Amazon SES eventSendpository event
Sendemail.sent
Deliveryemail.delivered
DeliveryDelayemail.delayed
Bounceemail.bounced
Complaintemail.complained
Rejectemail.failed
Openemail.opened
Clickemail.clicked
Subscriptionemail.unsubscribed

No SNS subscription confirmation step - add the URL and events arrive.

Full payloads and verification code are in the webhooks guide.

5. Error handling

Amazon SESSendpository
Error shapeSDK exceptions such as MessageRejected, MailFromDomainNotVerifiedException and TooManyRequestsException{ "error": { "type": "domain_not_verified", "message": "..." } }

These map to validation_error, domain_not_verified and rate_limit_exceeded. rate_limit_exceeded includes a Retry-After header. Only rate_limit_exceeded (wait for Retry-After) and internal_error are worth retrying automatically; the errors reference lists every type.

6. Code migration

Before - Amazon SES (AWS SDK v3)
import { SESv2Client, SendEmailCommand } from "@aws-sdk/client-sesv2";

const ses = new SESv2Client({ region: "us-east-1" });

await ses.send(
  new SendEmailCommand({
    FromEmailAddress: "Acme <billing@yourdomain.com>",
    Destination: { ToAddresses: ["customer@example.com"] },
    Content: {
      Simple: {
        Subject: { Data: "Your receipt" },
        Body: { Html: { Data: "<p>Thanks for your order.</p>" } },
      },
    },
    EmailTags: [{ Name: "type", Value: "receipt" }],
    ConfigurationSetName: "transactional",
  }),
);
After - Sendpository (Node.js)
import { Sendpository, SendpositoryError } from "sendpository";

const sendpository = new Sendpository(process.env.SENDPOSITORY_API_KEY);

try {
  const { id } = await sendpository.emails.send(
    {
      from: "Acme <billing@mail.yourdomain.com>",
      to: ["customer@example.com"],
      subject: "Your receipt",
      html: "<p>Thanks for your order.</p>",
      text: "Thanks for your order.",
      tags: { type: "receipt" },
    },
    // A retried job returns the first message's id instead of sending twice.
    { idempotencyKey: "receipt-10428" },
  );
  console.log(id);
} catch (err) {
  if (err instanceof SendpositoryError) console.error(err.type, err.message);
  throw err;
}

Watch out for

7. Pricing

Amazon SESSendpository
Published pricing$0.10 per 1,000 emails sent, and $0.10 per 1,000 received plus charges per 256 KB chunk. New AWS accounts get free-tier credits.6,000 emails a month (up to 200 a day), free forever. Current plans

Amazon SES pricing from their own pages, checked 2026-09-23. Sendpository has a permanent free plan (6,000 emails a month); Amazon SES does not.

8. Things to test before switching

Specific to leaving Amazon SES:

True of any migration:

Questions

Is Sendpository cheaper than Amazon SES?

Not per email at high volume - SES's price is hard to beat. Teams move to save engineering time: logs, signed webhooks, suppression, receiving and a dashboard work without building on SNS, SQS and Lambda.

Do I need an AWS account to use Sendpository?

No. It is one HTTPS API with a Bearer key. There are no IAM policies, regions, sandbox requests or configuration sets.

Amazon SES API details are from their documentation, checked 2026-09-25: docs.aws.amazon.com, docs.aws.amazon.com.

Keep reading

Send your first email in minutes

6,000 emails a month (up to 200 a day), free forever. No card needed.