Envello
Migration guide

Switch to Envello in about 30 minutes

Familiar method names, familiar request shapes, on purpose. Most of the diff is the import line.

Before
import { Client } from 'your-current-provider';

const client = new Client('sk_...');

await client.emails.send({
  from: 'Acme <[email protected]>',
  to: '[email protected]',
  subject: 'Welcome!',
  react: <WelcomeEmail name="Svenja" />,
});
After: Envello
import { Envello } from 'envello';

const envello = new Envello('env_live_...');

await envello.emails.send({
  from: 'Acme <[email protected]>',
  to: '[email protected]',
  subject: 'Welcome!',
  react: <WelcomeEmail name="Svenja" />,
});

1. Run the codemod

npx @envello/migrate rewrites your import statements and client instantiation across the codebase: import { Resend } from 'resend' becomes import { Envello } from 'envello', and every new Resend(...) call updates with it. Method calls like .emails.send() and .emails.batch() don't change, since Envello's SDK mirrors Resend's shapes on purpose. Review the diff like any other automated refactor.

2. Re-verify your sending domains

Add the SPF, DKIM, and DMARC records we generate. Most teams keep the same `from` domain, so this is usually one extra TXT record alongside your existing ones during the transition.

3. Swap your API key

Replace your old API key environment variable with ENVELLO_API_KEY. Request shapes are compatible with the most common providers, so the rest of your integration, templates, attachments, tags, keeps working.

4. Watch the logs during cutover

Send a small percentage of traffic first if you're risk-averse. Our log search shows delivery status in real time so you'll know within minutes if anything needs attention.

Sending HTML from React components instead of raw strings? See the React Email guide for how render() plugs straight into the html field above.

Ready to switch?

Start sending free and migrate at your own pace.