---
title: "Migrate from Amazon SES to OpenEmail"
description: "Move from Amazon SES to OpenEmail: every field mapped, a code converter for Node.js, Python, Ruby and cURL, and the webhook events side by side."
url: "https://openemail.uk/migrate/amazon-ses"
---

[All migrations](https://openemail.uk/migrate.md)

Migrate from Amazon SES

# Move from Amazon SES to OpenEmail.

SESv2 calls, configuration sets and SNS events, mapped field by field, with a converter that rewrites your code.

[Convert your code](https://openemail.uk/migrate/amazon-ses#convert) [Open mail](https://openemail.uk/mail/inbox) [Get Started](https://openemail.uk/signup.md)

## The same email, written both ways.

One message with a reply-to address and a tag, sent through Amazon SES and then through OpenEmail.

```
1import { SESv2Client, SendEmailCommand } from '@aws-sdk/client-sesv2'2 3const ses = new SESv2Client({ region: 'us-east-1' })4 5const result = await ses.send(6  new SendEmailCommand({7    FromEmailAddress: 'Acme <billing@acme.com>',8    Destination: { ToAddresses: ['ada@example.com'] },9    ReplyToAddresses: ['support@acme.com'],10    Content: {11      Simple: {12        Subject: { Data: 'Your invoice is ready' },13        Body: { Html: { Data: '<p>Thanks for your order.</p>' } },14      },15    },16    EmailTags: [{ Name: 'category', Value: 'invoice' }],17  }),18)19 20console.log(result.MessageId)
```

```
1import { init, openemail } from '@openemail/sdk'2 3init({ apiKey: process.env.OPENEMAIL_API_KEY })4 5const email = await openemail.emails.send({6  from: 'Acme <billing@acme.com>',7  to: ['ada@example.com'],8  replyTo: 'support@acme.com',9  subject: 'Your invoice is ready',10  html: '<p>Thanks for your order.</p>',11  tags: { category: 'invoice' },12})13 14console.log(email.id)
```

## Field by field, what goes where.

Each option Amazon SES takes, and its place in OpenEmail.

| Amazon SES | OpenEmail | Notes |
| --- | --- | --- |
| `FromEmailAddress` | `from` | Also takes Name and address together. |
| `Destination.ToAddresses` | `to` | CcAddresses and BccAddresses become cc and bcc. |
| `ReplyToAddresses` | `replyTo` | One address per message. |
| `Content.Simple.Subject.Data` | `subject` | A plain string. |
| `Content.Simple.Body.Html.Data` | `html` | The text body goes in text. |
| `EmailTags: [{ Name, Value }]` | `tags: { Name: Value }` | Up to 10 key and value pairs. |
| `Content.Template.TemplateData` | `template: { id, props }` | Props are an object, not a JSON string. |
| `SendBulkEmail` | `emails.sendBatch` | Up to 100 emails, each sent on its own. |
| `ConfigurationSetName` | `webhooks.create` | Events arrive through webhooks. |
| `AWS credentials, region` | `OPENEMAIL_API_KEY` | One key, and no region. |

Converter

## Paste your Amazon SES code, get it back on OpenEmail.

Pick where the code comes from and its language. Recognised keys are removed in your browser, and nothing you paste is kept.

From Amazon SES

Your OpenEmail code appears here

Paste a file, or load an example, then convert.

0 of 12,000 characters Recognised keys are removed before sending.

## Beyond the code, four more steps.

1. 01
   
   Add your sending domain
   
   Add it in OpenEmail and publish the DNS records it lists. Sending starts once the signing record answers.
2. 02
   
   Create an API key
   
   Keys start with oe\_live\_ and carry only the scopes you give them.
3. 03
   
   Move your webhooks
   
   Create an endpoint for the events listed below and check the X-OpenEmail-Signature header on every request.
4. 04
   
   Bring contacts and suppressions
   
   Import your contacts as a CSV on an audience page, and add the addresses Amazon SES suppressed to the suppression list.

## Webhook events, renamed.

Each Amazon SES event and the OpenEmail event that replaces it. Every request carries one event, signed.

| Amazon SES | OpenEmail |
| --- | --- |
| `Send` | `email.sent` |
| `Delivery` | `email.delivered` |
| `DeliveryDelay` | `email.delivery_delayed` |
| `Bounce` | `email.bounced` |
| `Complaint` | `email.complained` |
| `Open` | `email.opened` |
| `Click` | `email.clicked` |
| `Reject` | `email.failed` |

## Moving from Amazon SES, answered.

## Moving from somewhere else?

Every guide has the same converter, field map and checklist.

- [Resend Migration guide Keep your code on the compatible API, or convert it.](https://openemail.uk/migrate/resend.md)
- [SendGrid Migration guide Personalizations, dynamic templates and event webhooks.](https://openemail.uk/migrate/sendgrid.md)
- [Postmark Migration guide Server tokens, message streams and templates.](https://openemail.uk/migrate/postmark.md)
- [Mailgun Migration guide Domains, o: options and v: variables.](https://openemail.uk/migrate/mailgun.md)

## Converted? Create the key it reads.

A workspace takes a minute. Add your domain, create an API key and set OPENEMAIL\_API\_KEY.

[Open mail](https://openemail.uk/mail/inbox) [Get Started](https://openemail.uk/signup.md)[Read the SDK docs](https://openemail.uk/docs/sdk.md)
