Wraps Logo
Open-source email infrastructure for Amazon SES

Everything Amazon SES needs, including operations.

One command puts the whole SES surface in your AWS account. Send from your app or your agent. Then run it day to day from one control plane.

~2 min
typical first deploy
5% / 0.1%
AWS bounce and complaint limits
0
credentials we store
Deploying to us-east-1...
✓ SES identity verified (acme.com)
✓ DKIM, SPF, DMARC configured
✓ Event tracking pipeline deployed
✓ Analytics tables created
✓ Bounce & complaint handlers active
Infrastructure deployed
Ready to send. Run: wraps email status
Before you pick anything

There are four ways to send application email. Wraps is the fourth.

  • 01

    Run SES yourself

    You, the AWS console, and a week

    Your sending is simple enough that one SendEmail call covers it, and you would rather own a hundred lines than a dependency.

  • 02

    Rent a sending API

    Resend, Postmark, SendGrid, Mailgun

    You have no AWS account and no appetite for one. Everything below this row assumes you are willing to hold an AWS account; if you are not, this is your row.

  • 03

    Rent a marketing platform

    Customer.io, Klaviyo, Braze, Knock

    Someone who is not an engineer owns email day to day, and the contact-based bill is worth not having to build campaign tooling.

  • 04

    Self-host an open-source wrapper

    Wraps, OpenSend, useSend, MillionSend

    You want the account, the reputation and the data to be yours, and you want the tooling to be open source. This is the row Wraps is in.

Open source, your own AWS account, your own reputation — that row is getting crowded, and it should. The thing that still separates the wrappers is whether anything watches the account once you are sending.

See how the wrappers compare
The control plane

Staying on top of it, without opening the AWS console.

Most teams pick a hosted API because they do not want to deal with any of this. Fair. So we made dealing with it the easy part: Amazon can put an account under review once its bounce rate passes 5% and pause sending at 10%, and the console will not draw your rates against those lines — the control plane does, swept hourly, with owners and admins notified when one is crossed.

Same surface for the rest of the daily job: suppression you can browse and clear, deliverability and blacklist audits, and a per-message event log. Bounces and complaints are suppressed on the way in, so the rates have a floor under them and not only a gauge over them.

Account survival

Under review

Bounce rate

4.1%

AWS reviews at 5%, pauses at 10%.

Complaint rate

0.12%

Over AWS's 0.1% review line.

24h quota

38,200/ 50,000

Warns at 80% of the send quota AWS grants the account.

The dashboard's account survival card. Rates shown are an example; the thresholds are AWS's own.
How Wraps deploys

Your email sends through your AWS, not ours.

This model has a name now: BYOC for email sending, bring your own cloud, applied to how you send. Wraps hosts the dashboard, templates, and workflows. Your AWS account holds the sending infrastructure and the delivery data.

Control plane

Wraps-hosted
  • Dashboard and analytics UI
  • Visual template editor and template storage
  • Workflow builder and automation state
  • Contacts, segments, topics
  • Broadcast scheduling and orchestration

Data plane

Your AWS account
  • SES: Sending, domain identity, sender reputation
  • EventBridge: Real-time event capture
  • SQS + dead letter queue: Reliable event delivery
  • Lambda: Event processing
  • DynamoDB: Delivery history and engagement events

Wraps orchestrates. Your AWS sends and stores. Delivery events stream to both places: your DynamoDB keeps the copy you own, and Wraps receives the same stream to power suppression, analytics, and workflow triggers. Full detail on what we receive is on the BYOC page.

Why teams run email on Wraps

Code you can review

Templates and workflows live in your repo. Roll back a bad send in a pull request.

Type-safe end to end

Typed SDK, typed templates, typed workflows. Errors surface at build, not in inboxes.

No more email tickets

Engineers own the code, marketers own the content, both ship through one pipeline.

Runs in your account

Your SES, your DynamoDB, your domain reputation. The bill comes from AWS, not us.

Built for Agents Too

Agents write TypeScript and open PRs. Your agent ships what your team ships.

The platform

One command stands up the whole sending stack.

Wraps deploys SES, DynamoDB, Lambda, EventBridge, and scoped IAM roles into your AWS account. Every event streams to tables you own — query them yourself, or watch them in the dashboard.

  • One-command deploy

    Run wraps email init and the full stack is production-ready in under two minutes.

  • TypeScript-first SDK

    email.send() — full type inference, no boilerplate, no wrappers.

  • Reputation protection

    Bounce and complaint rates drawn against the lines AWS reviews and pauses at, swept hourly. Suppression is wired on from the first send.

  • Zero stored credentials

    Access is an OIDC-federated IAM role. Your AWS keys never leave your account.

TypeScript SDK

Send an email. That's the whole API.

One import, one client, one call. Events stream to DynamoDB in your account — query them yourself or use the dashboard.

Your code talks to SES, not to us. Swap the SDK for the AWS SDK, boto3, or plain SMTP and the events still land.

import { WrapsEmail } from '@wraps.dev/email';

const email = new WrapsEmail();

await email.send({
  from: 'hello@acme.com',
  to: user.email,
  subject: 'Welcome to Acme',
  react: <WelcomeEmail name={user.name} />,
});
import {
  SESv2Client,
  SendEmailCommand,
} from '@aws-sdk/client-sesv2';

const ses = new SESv2Client();

// No ConfigurationSetName needed. Wraps binds it to
// the domain identity, so your events land either way.
await ses.send(new SendEmailCommand({
  FromEmailAddress: 'hello@acme.com',
  Destination: { ToAddresses: [user.email] },
  Content: {
    Simple: {
      Subject: { Data: 'Welcome to Acme' },
      Body: { Html: { Data: html } },
    },
  },
}));
Product tour

Everything that happens after you hit send.

01One-command deploy
02Broadcasts
03Audience segments
04Templates as code
05Workflows
06Live analytics
07Every send, tracked
The math

What you pay everywhere else, versus AWS cost.

Wraps + SESResendSendGridPostmark
100k emails / month$10(SES)$35$89.95$126
Your data, your AWSYesNoNoNo
Open sourceAGPL-3.0NoNoNo
Typed SDK + templatesYesYesNoNo
Templates-as-code in PRsYesYesNoNo
Workflows-as-codeYes(TypeScript, Git-versioned)Visual builderVisual builderNo
Pricing

You pay for the platform. AWS handles the sending.

Free to start, no credit card. Sending costs go straight to AWS — $0.10/1K on à la carte, or $0.16/1K on the new default Essentials plan.

Free forever

Free

Try the platform with your AWS account

$0
you pay AWS directly
  • Unlimited sends, domains & contacts
  • Unlimited team members
  • 5,000 custom events/mo
  • 1 AWS account
  • 2 workflows
  • 30-day history
Get Started
Most popular

Pro

For indie hackers and side projects

$29
per month
  • Everything in Free
  • Unlimited workflows
  • Unlimited custom events
  • Topics, segments, batch & campaigns
  • 250 AI generations/mo
  • 90-day history
Subscribe

Business

For scaling companies

$199
per month
  • Everything in Pro
  • Unlimited AWS accounts
  • 1,000 AI generations/mo
  • 1-year history
  • SSO + SCIM, audit log + CSV export
  • Priority support
Subscribe

Every plan includes unlimited sends, domains, contacts, templates, and team members.

Need custom limits or on-prem deployment? Contact us for Enterprise

AWS costs are separate

You pay AWS directly for sending at $0.10 per 1,000 emails on à la carte — AWS now defaults new accounts to $0.16, and Wraps tells you which plan applies — plus infrastructure (~$2-5/mo). The infrastructure lives in your account, so you can leave anytime and keep everything.

Calculate Your Costs
FAQ

Questions? We've got answers.

Still have questions? Contact support

Get started

One command to set it up. One place to run it.

About two minutes, and nothing you already have in the account gets touched. Cancel whenever — the infrastructure is yours and keeps sending.

No credit cardInfrastructure stays if you cancelOpen source