---
title: "Add DNS records · Cloudflare"
description: "Publish Bird's sending-domain DNS records in Cloudflare, including DKIM, return-path, DMARC, and optional tracking records."
canonical: "https://bird.com/docs/knowledge-base/dns-and-domains/cloudflare"
---

# Add DNS records · Cloudflare

<!-- external-screenshot: Cloudflare → DNS → Records → Add record -->

When you add a sending domain to Bird, the domain's detail page in the Bird dashboard lists every DNS record to publish, each with a copyable host and value. Keep that page open in one tab and the Cloudflare dashboard in another. Copy each value from Bird instead of typing it.

![A domain's DNS Records page in the Bird dashboard, showing the verified DKIM record with copyable name and value, and the return-path and DMARC sections below](/images/docs/dashboard-email-domain-detail.png)

## The records you'll add

| Type  | Host                                | Value (copy from Bird)     |
| ----- | ----------------------------------- | -------------------------- |
| TXT   | `<selector>._domainkey.example.com` | Your DKIM key              |
| CNAME | `send.example.com`                  | `<region>.bounce.bird.com` |
| TXT   | `_dmarc.example.com`                | Your DMARC policy          |
| CNAME | `links.example.com` (optional)      | `<region>.links.bird.com`  |

The tracking CNAME (`links`) is optional and enables branded open and click tracking. It is not required for sending.

## Add the records in Cloudflare

1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com) and select the account that holds your domain.
2. Select the domain, then select **DNS** > **Records**.
3. Click **Add record**.
4. For the DKIM record: set **Type** to **TXT**, paste the host from Bird into **Name**, and paste the DKIM value into **Content**. If the value is too long for Cloudflare to accept as one string, run it through the [DNS record splitter](/tools/dns-record-splitter) first. Leave **TTL** on **Auto**. Click **Save**.
5. Click **Add record** again. For the return-path record: set **Type** to **CNAME**, enter the host (for example `send`), paste the target from Bird (for example `<region>.bounce.bird.com`) into **Target**, and switch **Proxy status** to **DNS only**. Click **Save**.
6. Click **Add record** again. For the DMARC record: set **Type** to **TXT**, enter `_dmarc` as the **Name**, and paste the DMARC value from Bird into **Content**. Click **Save**.
7. If you want branded tracking, add the optional tracking record the same way as step 5: **Type** **CNAME**, **Name** `links`, **Target** `<region>.links.bird.com`, **Proxy status** **DNS only**. Click **Save**.

## Cloudflare-specific gotchas

- **Turn proxying off.** Cloudflare proxies CNAME records by default. A proxied record answers with Cloudflare's IPs instead of Bird's hostnames, which breaks bounce routing and verification. Set both CNAME records to **DNS only**.
- **Watch the Name field.** Cloudflare accepts a bare label (`send`) or a fully qualified name (`send.example.com`). After saving, confirm that the published record name matches Bird.

## After you publish

Bird checks your DNS automatically. You can also open the domain details in Bird and select **Refresh**. If the domain remains pending, see [Verification delays](/docs/knowledge-base/dns-and-domains/verification-delays).

## Next steps

- [Sending domains](/docs/guides/email/sending-domains)
- [DKIM, SPF & DMARC](/docs/guides/email/dkim-spf-dmarc)
- [Verification delays](/docs/knowledge-base/dns-and-domains/verification-delays)

## Related resources

- [SPF vs DKIM vs DMARC: what's the difference?](/explained/deliverability/spf-vs-dkim-vs-dmarc) (answer)
- [DMARC policy builder](/tools/dmarc-policy) (tool)
- [Sending domains](/email-api/features/domains) (product)

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