BIRD EMAIL

TRANSACTIONAL EMAIL AT SCALE

# Your email API. Built for what’s next.

Send receipts, password resets and account updates with Bird’s API. Track delivery, investigate failures and scale with your email team.

[Start now](/dashboard/signup?returnTo=%2Fdashboard%2Fw%2Femail)

[Talk to sales](/demo?product=email)

[Read the API docs ↗](/docs/api/reference/create-email-message)

**Node.js**: `npm install @messagebird/sdk tsx`

File: `send.mts`

Run: `npx tsx send.mts`

```typescript
import { BirdClient } from "@messagebird/sdk";
import { html, attachments } from "./content.mts";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const msg = await bird.email.send({
  from: { email: "onboarding@messagebird.dev", name: "Fieldnotes" },
  to: [{ email: "delivered@messagebird.dev", name: "Alex Lee" }],
  subject: "A beautiful beginning.",
  category: "transactional",
  html,
  attachments,
});

console.log(msg.id, msg.status);
```

File: `content.mts`

```typescript
import { readFileSync } from "node:fs";

export const html = readFileSync(
  new URL("./welcome.html", import.meta.url), "utf8",
);

export const attachments = [{
  filename: "shoreline.webp",
  content_id: "shoreline",
  content: readFileSync(
    new URL("./shoreline.webp", import.meta.url),
  ).toString("base64"),
}];
```

File: `welcome.html`

```html
<div style="background:#f8f9f1;color:#171c19;font-family:Arial,sans-serif">
  <div style="padding:30px 24px">
    <p style="margin:0 0 26px;font-size:18px;letter-spacing:-1px">fieldnotes.</p>
    <p style="margin:0 0 20px;font-size:42px;font-weight:700;line-height:1.05;letter-spacing:-2px">
      Good things<br>start here.
    </p>
    <p style="font-size:14px;line-height:1.65">
      Hi Alex. Your Fieldnotes account is ready.<br>We’re glad you’re here.
    </p>
    <a href="https://example.com/account" style="display:inline-block;margin-top:18px;color:#171c19;font-size:13px;text-decoration:none">
      Open your account ↗
    </a>
  </div>
  <img src="cid:shoreline" alt="A quiet Mediterranean shoreline" width="840" style="display:block;width:100%;height:auto">
</div>
```

[Download the complete example, including the inline image](/downloads/email-welcome-sample.zip). Requires Node.js 20.3+. Run `npm install`, export `BIRD_API_KEY`, then run `npm run send`. Sandbox delivery is simulated. An accepted message is not proof of delivery.

Examples: [TypeScript](/id-id/email-api.ts.md)

Companies that trust Bird across their communications.

- [Airwallex](/customers/airwallex)
- Uber
- [Zillow](/customers/zillow)
- [Glovo](/customers/glovo)
- PayPal
- Adobe

200M — Emails per month, on average

Reported by Zillow in its customer story, after migrating to Bird in 2015.

[Read Zillow’s story](/customers/zillow)

01 / THE EMAIL API

## Transactional email. Ready for your product.

Send welcome messages, password resets and receipts. Trace each message when your customer or support team needs an answer.

[Send your first email](/docs/get-started/send-your-first-email)

### Keep your template workflow.

Send HTML, render React Email in your application, or use a stored template. Keep the workflow your team knows.

[Explore email templates](/email-template-api)

### Retry without a duplicate send.

Reuse an idempotency key when a request needs a retry. Follow the documented replay window and recovery steps for uncertain results.

[Read the idempotency guide](/docs/guides/idempotency)

### Keep your application informed.

Use delivery events and webhooks to connect what happened to an email with what your application does next.

[Integrate delivery events](/docs/guides/email/events)

Already have an SMTP integration?

[Connect it to Bird’s SMTP relay](/smtp-service)

Need replies too?

[Explore inbound email](/inbound-email-api)

02 / SDKs & QUICKSTARTS

## Email SDKs & quickstarts.

Choose your stack, install the SDK and send to a sandbox recipient. Each quickstart covers setup, the request and its result.

[Explore the email docs](/docs/guides/email/overview)

[Next.js Server actions. Your first send. Open the quickstart ↗](/docs/get-started/quickstarts/typescript/next-js/email)

[Node.js Modern JavaScript. A direct integration. Open the quickstart ↗](/docs/get-started/quickstarts/typescript/email)

[Python A typed SDK. Synchronous quickstart. Open the quickstart ↗](/docs/get-started/quickstarts/python/email)

[Go A small start in your existing stack. Open the quickstart ↗](/docs/get-started/quickstarts/go/email)

[Send and inspect an email with the CLI ↗](/docs/get-started/quickstarts/cli/email)

[Send with an AI client through MCP ↗](/ai/mcp-client)

[Explore Bird CLI ↗](/cli)

Keep the returned message ID, then read the message and follow delivery events. An accepted send confirms that Bird queued the email; delivery is reported separately.

[HTML email templates and downloads ↗](/email-templates)

## Send your first request before you write any code.

[The whole public API as a Postman collection](https://god.gw.postman.com/run-collection/20940851-8026901b-b1c8-4490-a3e6-b755bfbed32a?action=collection%2Ffork): every endpoint with an example request and response, converted from the same OpenAPI specification the SDKs are generated from. Fork it into your own workspace, set an API key, and send a live request.

### Find your framework

Go straight to a working email example for your application.

[Express ↗](/docs/get-started/quickstarts/typescript/express/email)

[Nuxt ↗](/docs/get-started/quickstarts/typescript/nuxt/email)

[SvelteKit ↗](/docs/get-started/quickstarts/typescript/sveltekit/email)

[Astro ↗](/docs/get-started/quickstarts/typescript/astro/email)

[Remix ↗](/docs/get-started/quickstarts/typescript/remix/email)

[Hono ↗](/docs/get-started/quickstarts/typescript/hono/email)

[Bun ↗](/docs/get-started/quickstarts/typescript/bun/email)

[Django ↗](/docs/get-started/quickstarts/python/django/email)

[FastAPI ↗](/docs/get-started/quickstarts/python/fastapi/email)

[Flask ↗](/docs/get-started/quickstarts/python/flask/email)

[Gin ↗](/docs/get-started/quickstarts/go/gin/email)

[PHP ↗](/docs/get-started/quickstarts/php/email)

[cURL ↗](/docs/get-started/quickstarts/curl/email)

### Evaluating a stack before you integrate?

See how Bird fits your application, with runnable examples and implementation choices.

[Email API for Next.js ↗](/email-api/nextjs)

[Email API for Node.js ↗](/email-api/nodejs)

[Email API for Python ↗](/email-api/python)

ALREADY SENDING SOMEWHERE ELSE?

### Switch to Bird.

Bring your templates, domains, and sending requirements. Follow a migration guide and plan the switch.

[Move from Resend](/docs/guides/email/migrate/resend)

[Move from SendGrid](/docs/guides/email/migrate/sendgrid)

[Move from Amazon SES](/docs/guides/email/migrate/ses)

[Move from Mailgun](/docs/guides/email/migrate/mailgun)

FROM REQUEST TO RESULT

## Follow every email.

Answer “where is my email?” with a message ID and delivery evidence. Try a successful send, then a hard bounce to see what your team can do next.

[iterable EMAIL INFRASTRUCTURE IN PRACTICE An email integration in one week. Iterable’s published story reports onboarding in one week and approximately 1,000 messages per second via API, with detailed deliverability analytics. A historical result from Bird’s email infrastructure. Read the story ↗ A reported customer result.](/customers/iterable)

## A beautiful beginning. / Delivered

### Accepted is the beginning.

A send to delivered@messagebird.dev is accepted first. The message ID connects the later outcome; a 202 does not mean delivery.

Request + response excerpt · example data

```text
POST /v1/email/messages

{
  "from": "onboarding@messagebird.dev",
  "to": [
    "delivered@messagebird.dev"
  ],
  "subject": "A beautiful beginning.",
  "category": "transactional",
  "html": "<p>Good things start here.</p>"
}

HTTP/1.1 202 Accepted
{
  "id": "em_01ky7qc398fmxraqtxn604zeq9",
  "status": "accepted"
}
```

[Read the sending guide ↗](/docs/guides/email/sending-email)

### The receiving server accepted it.

Delivered means the receiving server accepted the message. It does not establish inbox placement or a human open. This sandbox example simulates that outcome.

Event body · example data

```text
{
  "type": "email.delivered",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "delivered@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null
  }
}
```

[Explore email events ↗](/docs/guides/email/events)

### Turn the event into a next step.

Verify the signature against the raw body. Deduplicate deliveries by webhook-id and durably record the event before acknowledging it. Delivery order is not guaranteed.

Headers + event body · signature omitted

```text
webhook-id: evt_example_delivery_001
webhook-timestamp: 1789639202
webhook-signature: v1,<signature>

{
  "type": "email.delivered",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "delivered@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null
  }
}
```

[Read the webhook integration guide ↗](/docs/guides/webhooks)

## A beautiful beginning. / Hard bounce

### Accepted is the beginning.

A send to bounce@messagebird.dev is accepted first. The message ID connects the later outcome; a 202 does not mean delivery.

Request + response excerpt · example data

```text
POST /v1/email/messages

{
  "from": "onboarding@messagebird.dev",
  "to": [
    "bounce@messagebird.dev"
  ],
  "subject": "A beautiful beginning.",
  "category": "transactional",
  "html": "<p>Good things start here.</p>"
}

HTTP/1.1 202 Accepted
{
  "id": "em_01ky7qc398fmxraqtxn604zeq9",
  "status": "accepted"
}
```

[Read the sending guide ↗](/docs/guides/email/sending-email)

### A failure you can act on.

The sandbox simulates an unknown user. In production, hard bounces suppress the address. Sandbox bounces leave the suppression list unchanged.

Event body · example data

```text
{
  "type": "email.bounced",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "bounce@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null,
    "bounce_type": "hard",
    "bounce_class": 10,
    "bounce_code": "550",
    "bounce_description": "5.1.1 Unknown User",
    "sending_ip": null
  }
}
```

[Explore email events ↗](/docs/guides/email/events)

### Turn the event into a next step.

Verify the signature against the raw body. Deduplicate deliveries by webhook-id and durably record the event before acknowledging it. Delivery order is not guaranteed.

Headers + event body · signature omitted

```text
webhook-id: evt_example_delivery_001
webhook-timestamp: 1789639202
webhook-signature: v1,<signature>

{
  "type": "email.bounced",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "bounce@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null,
    "bounce_type": "hard",
    "bounce_class": 10,
    "bounce_code": "550",
    "bounce_description": "5.1.1 Unknown User",
    "sending_ip": null
  }
}
```

[Read the webhook integration guide ↗](/docs/guides/webhooks)

## Your Fieldnotes receipt / Delivered

### Accepted is the beginning.

A send to delivered@messagebird.dev is accepted first. The message ID connects the later outcome; a 202 does not mean delivery.

Request + response excerpt · example data

```text
POST /v1/email/messages

{
  "from": "onboarding@messagebird.dev",
  "to": [
    "delivered@messagebird.dev"
  ],
  "subject": "Your Fieldnotes receipt",
  "category": "transactional",
  "html": "<p>Your receipt is ready.</p>"
}

HTTP/1.1 202 Accepted
{
  "id": "em_01ky7qc398fmxraqtxn604zeq9",
  "status": "accepted"
}
```

[Read the sending guide ↗](/docs/guides/email/sending-email)

### The receiving server accepted it.

Delivered means the receiving server accepted the message. It does not establish inbox placement or a human open. This sandbox example simulates that outcome.

Event body · example data

```text
{
  "type": "email.delivered",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "delivered@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null
  }
}
```

[Explore email events ↗](/docs/guides/email/events)

### Turn the event into a next step.

Verify the signature against the raw body. Deduplicate deliveries by webhook-id and durably record the event before acknowledging it. Delivery order is not guaranteed.

Headers + event body · signature omitted

```text
webhook-id: evt_example_delivery_001
webhook-timestamp: 1789639202
webhook-signature: v1,<signature>

{
  "type": "email.delivered",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "delivered@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null
  }
}
```

[Read the webhook integration guide ↗](/docs/guides/webhooks)

## Your Fieldnotes receipt / Hard bounce

### Accepted is the beginning.

A send to bounce@messagebird.dev is accepted first. The message ID connects the later outcome; a 202 does not mean delivery.

Request + response excerpt · example data

```text
POST /v1/email/messages

{
  "from": "onboarding@messagebird.dev",
  "to": [
    "bounce@messagebird.dev"
  ],
  "subject": "Your Fieldnotes receipt",
  "category": "transactional",
  "html": "<p>Your receipt is ready.</p>"
}

HTTP/1.1 202 Accepted
{
  "id": "em_01ky7qc398fmxraqtxn604zeq9",
  "status": "accepted"
}
```

[Read the sending guide ↗](/docs/guides/email/sending-email)

### A failure you can act on.

The sandbox simulates an unknown user. In production, hard bounces suppress the address. Sandbox bounces leave the suppression list unchanged.

Event body · example data

```text
{
  "type": "email.bounced",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "bounce@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null,
    "bounce_type": "hard",
    "bounce_class": 10,
    "bounce_code": "550",
    "bounce_description": "5.1.1 Unknown User",
    "sending_ip": null
  }
}
```

[Explore email events ↗](/docs/guides/email/events)

### Turn the event into a next step.

Verify the signature against the raw body. Deduplicate deliveries by webhook-id and durably record the event before acknowledging it. Delivery order is not guaranteed.

Headers + event body · signature omitted

```text
webhook-id: evt_example_delivery_001
webhook-timestamp: 1789639202
webhook-signature: v1,<signature>

{
  "type": "email.bounced",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "bounce@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null,
    "bounce_type": "hard",
    "bounce_class": 10,
    "bounce_code": "550",
    "bounce_description": "5.1.1 Unknown User",
    "sending_ip": null
  }
}
```

[Read the webhook integration guide ↗](/docs/guides/webhooks)

## Reset your password / Delivered

### Accepted is the beginning.

A send to delivered@messagebird.dev is accepted first. The message ID connects the later outcome; a 202 does not mean delivery.

Request + response excerpt · example data

```text
POST /v1/email/messages

{
  "from": "onboarding@messagebird.dev",
  "to": [
    "delivered@messagebird.dev"
  ],
  "subject": "Reset your password",
  "category": "transactional",
  "html": "<p>Use the secure reset link from your application.</p>"
}

HTTP/1.1 202 Accepted
{
  "id": "em_01ky7qc398fmxraqtxn604zeq9",
  "status": "accepted"
}
```

[Read the sending guide ↗](/docs/guides/email/sending-email)

### The receiving server accepted it.

Delivered means the receiving server accepted the message. It does not establish inbox placement or a human open. This sandbox example simulates that outcome.

Event body · example data

```text
{
  "type": "email.delivered",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "delivered@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null
  }
}
```

[Explore email events ↗](/docs/guides/email/events)

### Turn the event into a next step.

Verify the signature against the raw body. Deduplicate deliveries by webhook-id and durably record the event before acknowledging it. Delivery order is not guaranteed.

Headers + event body · signature omitted

```text
webhook-id: evt_example_delivery_001
webhook-timestamp: 1789639202
webhook-signature: v1,<signature>

{
  "type": "email.delivered",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "delivered@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null
  }
}
```

[Read the webhook integration guide ↗](/docs/guides/webhooks)

## Reset your password / Hard bounce

### Accepted is the beginning.

A send to bounce@messagebird.dev is accepted first. The message ID connects the later outcome; a 202 does not mean delivery.

Request + response excerpt · example data

```text
POST /v1/email/messages

{
  "from": "onboarding@messagebird.dev",
  "to": [
    "bounce@messagebird.dev"
  ],
  "subject": "Reset your password",
  "category": "transactional",
  "html": "<p>Use the secure reset link from your application.</p>"
}

HTTP/1.1 202 Accepted
{
  "id": "em_01ky7qc398fmxraqtxn604zeq9",
  "status": "accepted"
}
```

[Read the sending guide ↗](/docs/guides/email/sending-email)

### A failure you can act on.

The sandbox simulates an unknown user. In production, hard bounces suppress the address. Sandbox bounces leave the suppression list unchanged.

Event body · example data

```text
{
  "type": "email.bounced",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "bounce@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null,
    "bounce_type": "hard",
    "bounce_class": 10,
    "bounce_code": "550",
    "bounce_description": "5.1.1 Unknown User",
    "sending_ip": null
  }
}
```

[Explore email events ↗](/docs/guides/email/events)

### Turn the event into a next step.

Verify the signature against the raw body. Deduplicate deliveries by webhook-id and durably record the event before acknowledging it. Delivery order is not guaranteed.

Headers + event body · signature omitted

```text
webhook-id: evt_example_delivery_001
webhook-timestamp: 1789639202
webhook-signature: v1,<signature>

{
  "type": "email.bounced",
  "timestamp": "2026-09-17T10:00:02.000Z",
  "data": {
    "email_id": "em_01ky7qc398fmxraqtxn604zeq9",
    "recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "bounce@messagebird.dev",
    "recipient_role": "to",
    "tags": null,
    "metadata": null,
    "broadcast_id": null,
    "bounce_type": "hard",
    "bounce_class": 10,
    "bounce_code": "550",
    "bounce_description": "5.1.1 Unknown User",
    "sending_ip": null
  }
}
```

[Read the webhook integration guide ↗](/docs/guides/webhooks)

03 / DELIVERABILITY & INSIGHTS

## Email deliverability. Understand each send.

Authenticate your sending domain, monitor delivery events and investigate inbox placement. Give your team a clear path from setup to troubleshooting.

[Explore deliverability](/email-deliverability)

[Set up your sending domain Authentication starts with the right foundation.](/docs/guides/email/sending-domains)

[Look beyond delivered Explore inbox placement estimates and seed tests.](/inbox-placement-testing)

[Understand your DMARC reports Make authentication data easier to act on.](/tools/dmarc-report-analyzer)

Bird

Email / Sending health

Example

mail.fieldnotes.example

Sending domain

✓ Verified

SPF

✓ Configured

DKIM

✓ Verified

DMARC

✓ Configured

A CUSTOMER SAYS THEIR EMAIL IS MISSING

### Delivered. What next?

Check the message event

Delivered means the receiving server accepted the message.

Check inbox placement separately

Review spam placement and authentication. A delivery event cannot tell you which folder received the email.

Investigate before sending again

Use the message ID and recipient details to trace the issue with your team.

Welcome email

Delivered

Order confirmation

Delivered

Invalid recipient

Suppressed

A simplified view with example data.

[When the right home appears, the email needs to follow. Read Zillow’s story 200M emails per month, reported in Zillow’s story. Zillow’s published story describes time-sensitive property alerts and the capacity to handle sending peaks on Bird email infrastructure.](/customers/zillow)

FROM YOUR FIRST SEND TO ENTERPRISE

## Email API pricing. Room to grow.

Start with a sandbox send, then choose a plan for your volume. Plan a larger rollout with our email team.

START WITH A PUBLISHED PLAN

### A clear starting point.

[Compare all plans and limits ↗](/products/email/pricing)

FOR LARGER SENDING OPERATIONS

### Your volume. Your requirements.

Review sending peaks, IP strategy and migration with our email team. Bring your security questionnaire and support requirements to the same conversation.

Sending workload

Monthly volume and peaks

Deliverability

Domains and IP requirements

Procurement

Security, DPA and support terms

[Plan your rollout with sales ↗](/demo?product=email)

[Enterprise email ↗](/enterprise-email-infrastructure)

[Security and compliance ↗](https://trust.bird.com)

[Data processing agreement ↗](/legal/dpa)

[Service status ↗](/status)

| Starting plan | Monthly price (USD) | Included emails / month |
| --- | --- | --- |
| Free | $0 | 1,000 |
| Startup | $15 | 50,000 |

Starting monthly plans in USD. Free is capped; paid plans have overage. [See all volumes, currencies, limits and add-ons](/products/email/pricing).

MORE OF YOUR BUSINESS. ONE PARTNER.

## Start with email. Build on Bird.

Add campaigns, inbound replies or another channel when your product needs them. Connect email, WhatsApp and SMS around the same customer and their choices.

[Explore all Email products ↗](/email)

[Email marketing ↗](/email-marketing)

[Inbound email ↗](/inbound-email-api)

[Explore all products](/products)

Fieldnotes / Customer journey

Illustrative workflow

AL

### Alex Lee

One customer. Same context.

Visit

Coastal studio

Booking

FN–1042

When

Friday · 14:00

EXAMPLE PREFERENCES

✓ Email confirmations

✓ WhatsApp replies

SMS reminders

Try changing this preference.

01 Email

02 WhatsApp

03 SMS

fieldnotes.

YOUR STUDIO VISIT / FN–1042

### A little time by the sea.

Hi Alex, your coastal studio visit is booked for Friday at 14:00.

A sunlit studio beside the sea

Friday, 14:00

Fieldnotes Studio · 1 guest

Today

Can I bring a friend to the studio tomorrow?

I’ll check whether we can add a guest, Alex. Your original booking FN–1042 stays confirmed for one guest while we check.

Text Message • SMS

Today

Hi Alex, a little reminder: your coastal studio visit is today at 14:00. Booking FN–1042. See you soon! Reply STOP to opt out.

Ⅱ

### A preference respected.

Alex has switched off SMS reminders. This workflow skips the SMS; the email confirmation and booking stay in place.

An example you can build with Bird’s APIs. Your application connects customer identity, booking data, and consent across channels.

06 / A GOOD NEXT STEP

## Email guides and tools.

[The email resource library](/email/resources)

[EXPLAINED Understand the Email API. What an email API does, and where it fits in your application.](/explained/email/what-is-an-email-api)

[EVALUATE Choose your email provider. Compare the sending workflow, operational controls and costs that matter to your team.](/products/email/compare)

[TECHNICAL GUIDE Handle opt-outs and bounces. Keep suppression handling connected to the way your application sends.](/docs/guides/email/suppressions)

[PRODUCTION CHECKLIST Prepare for production. Review transactional email practices before real customers depend on every send.](/explained/email/transactional-email-best-practices)

More sending options:

[Schedule a send ↗](/docs/guides/email/scheduled-sending)

[Send in bulk ↗](/docs/guides/email/sending-bulk)

[Add attachments ↗](/docs/guides/email/attachments)

THE DETAILS THAT MATTER

## Email questions, answered.

[All email FAQs](/products/email/faqs)

THE DETAILS THAT MATTER

## Email questions, answered.

[All email FAQs ](/products/email/faqs)

### Can I try the API before verifying a domain?

Yes. Use the shared onboarding sender and sandbox recipients to test your integration. Verify your own domain before sending to customers. Onboarding recipient and daily limits apply. [Follow the first-email quickstart.](/docs/get-started/send-your-first-email)

### Can I send transactional and marketing email?

Yes. Bird supports both application-driven messages and marketing email. Choose the appropriate message category and respect consent, unsubscribe, and suppression requirements. [Choose the message category.](/docs/guides/email/categories)

### Can I use React Email or my existing templates?

You can render React Email templates to HTML in your application and send the result through Bird. You can also send your own HTML or use stored email templates. [Explore templates.](/email-template-api)

### What limits should I plan around?

Plan for monthly volume, request rate and peak sending, as well as domain and webhook limits. A sandbox test does not establish your production throughput. [Read rate limits and retry behavior.](/docs/guides/rate-limits)

### Do I need a dedicated IP?

No. Shared IPs are the default. Dedicated IPs are a paid option for senders with consistent volume and require warmup. Review your plan’s eligibility and sending pattern before choosing one. [Understand dedicated IPs and pools.](/docs/guides/email/dedicated-ips-and-pools)

### How do we review security and support?

Use Bird’s Trust Center for security evidence and review the DPA with your team. Confirm support coverage, escalation and any service commitments in your agreement before rollout. [Explore enterprise email](/enterprise-email-infrastructure) · [Start your security review.](https://trust.bird.com)

### Where can I find pricing and migration help?

See the email pricing page for current options, and follow the guide for your existing provider. Our team can help you plan around sending volume, infrastructure, and your wider Bird setup. [Email pricing](/products/email/pricing) · [Migration guides.](/docs/guides/email/migrate)

### Can I send several messages in one request?

Submit up to 100 independent messages in a batch. The request validates as a unit; after acceptance, each message has its own delivery outcome. Batching does not guarantee that every recipient receives a message. [Read the batch sending guide.](/docs/guides/email/sending-bulk)

### Can I schedule email or attach files?

Schedule inline email content for a future send and cancel before sending begins. Scheduled sending cannot be combined with stored templates. Attach files as base64 and use content IDs for inline images; check the documented size and content-type limits. [Plan scheduled sending.](/docs/guides/email/scheduled-sending)

### How do I connect a message to my application data?

Use tags to group messages for reporting and metadata for application context, such as an order reference. Follow the documented field limits and avoid placing secrets in either. [Compare tags and metadata.](/docs/guides/email/sending-email#tags-vs-metadata)

### How do I test failures before launch?

Use documented sandbox recipients to exercise delivery outcomes and check your webhook handling. A simulated result tests your integration; it does not establish production delivery or throughput. [Exercise sandbox outcomes.](/docs/guides/email/testing-sandbox)

YOUR NEXT CONNECTION STARTS HERE

## Build your first send. Plan your next million.

Start building today, or review your sending volume, migration and support requirements with our email team.

[Start now](/dashboard/signup?returnTo=%2Fdashboard%2Fw%2Femail)

[Talk to our email team](/demo?product=email)

[Explore email pricing](/products/email/pricing)



## Related resources

- [Getting started with email](/learn/email/getting-started-with-email) (video)
- [Build your first integration](/learn/paths/integration) (course)

[Get an implementation brief](/learn/workspace?topic=email)
