# Set up your sending domain and warm-up

> Choose the domain marketing email comes from, add its DNS records, watch the daily limit rise, set the postal address and fix a setup that is not ready.

Source: https://www.coritan.com/docs/organizations/commerce/email-sending/

In the dashboard:

- /dashboard/organizations/…/commerce/sending: https://www.coritan.com/dashboard/organizations

**Sending** is where you set up the domain that marketing email comes from, and how fast it may go. Marketing email leaves from a domain of its own, usually `news.` in front of your own domain, through Coritan's mail platform. It never uses the sender that carries your order emails. No campaign or automation can send until this page says your domain is set up and its records are in place.

## Before you begin

- You need Tier 3 support or higher to open **Sending**, and an owner or admin to change anything on it.
- Know the domain you will send from. You need to change its DNS records, or have the zone on Coritan DNS, which publishes them for you ([Add, edit and delete DNS records](/docs/websites/dns/manage-dns-records/)).
- Have your organization's postal address. Every marketing email shows it, and a campaign cannot start without it.

## Set up the sending domain

A *sending domain* is a name of its own, such as `news.example.com`, that marketing email comes from. Keeping it apart protects the reputation of the address your order emails use.

1. In the [dashboard](https://www.coritan.com/dashboard/organizations), open the organization, then **Commerce**, then **Email**, then **Sending**.
2. Under **Sending domain**, leave **Domain** empty to use `news.` in front of your organization's custom domain, or in front of your storefront's host. Or enter a domain such as `news.example.com`.
3. Select **Set up domain**.

The status badge on the card moves from **Not set up** to **Waiting for DNS**. The page now lists the records the domain needs.

- The domain must be a subdomain, such as `news.example.com`, so the email you already use on `example.com` keeps working.
- It cannot be one that another organization uses.
- You can change the domain until its records have been verified. After that it is locked, and Coritan support has to move it.
- Setting up is safe to repeat. It allows 30 calls an hour.

## Add the DNS records

*DKIM, SPF and DMARC* are three records that prove an email really comes from you. DKIM signs each message, SPF lists the servers allowed to send it, and DMARC says what a receiver should do with a message that fails. Mail apps trust a sender more, and filter it less, when all three are in place.

The **DNS records** card lists each record with its **Record** (what it is for and its type), its **Name**, its **Value** and its **Status**. Copy each **Name** and **Value** to your DNS provider. When your DNS zone is on Coritan DNS, we publish them and you add nothing.

| Record | Type | What it is for |
| --- | --- | --- |
| **Domain ownership** | `TXT` at `_mailverify` on your sending domain | Proves the domain is yours. It is listed only when your DNS is not on Coritan DNS. |
| **SPF** | `TXT` at your sending domain | Lists the servers allowed to send for the domain. A name has one SPF record, so if your sending domain already has one, add our `include:` to it. |
| **DKIM** | `TXT` or `CNAME`, one or more | The key receivers use to check each message's signature. |
| **DMARC** | `TXT` at `_dmarc` on your sending domain | Tells receivers what to do with mail that fails SPF and DKIM. |
| **Click tracking** | `CNAME` at `click` on your sending domain | Lets the links in your emails run on your own domain. Sending does not wait for it. |

There is no separate record for the return path. Bounces come back to a `bounce+` address on your sending domain itself, which the SPF record covers.

A record's **Status** reads **In place** when DNS answers with the right value, **Different value** when the name holds something else, and **Not found** when nothing is there. The click tracking record reads **Waiting** when its name is in place and the host does not answer yet. DNS changes can take a while to spread.

Select **Check records** after you add them. It checks again and answers how many records are in place. When the ownership, SPF, DKIM and DMARC records are all **In place**, the domain is verified and the warm-up starts at once. Click tracking is **Waiting** until `https://click.<your domain>` answers with a valid certificate. Until it does, links in your emails run on Coritan's own address. **Check records** allows 30 checks an hour.

The **Status** card shows the **Domain**, the address emails are sent from (**Sends from**), the **Tracking host** and when it was **Verified**.

## Set the sender and the postal address

Under **Sender and limits**, set what readers see and the address every email shows:

| Field | What it takes |
| --- | --- |
| **Sender name** | What readers see before the address, up to 100 characters on one line. |
| **Address before the @** | Letters, numbers, dots, dashes and underscores, up to 64. It defaults to `hello`. The address ends with your sending domain. |
| **Reply to** | Where replies go. Leave it empty to use your store's support address. |
| **Postal address** | One line of 10 to 500 characters. Every marketing email shows it, as the law asks. A campaign cannot start without one. A line break becomes a space. |
| **Emails each minute** | The top speed, from 1 to 5,000. It is 300 until you change it. A campaign can set a lower one. |

Select **Save changes**. A campaign can use its own sender name, address and reply-to ([Write, test and send email campaigns](/docs/organizations/commerce/email-campaigns/#set-up-the-campaign)).

## Warm-up and the daily limit

A new domain has no sending history, so mail apps are careful with it. The *warm-up* starts the daily limit low and raises it each day your sending stays clean. The **Daily limit** card shows how much of today's limit you used, the **Stage**, **Today's limit**, **Left today**, and what the limit becomes **Tomorrow, if all goes well**.

| Stage | Emails a day |
| --- | --- |
| 1 | 50 |
| 2 | 100 |
| 3 | 200 |
| 4 | 400 |
| 5 | 800 |
| 6 | 1,500 |
| 7 | 2,500 |
| 8 | 4,000 |
| 9 | 6,000 |
| 10 | 9,000 |
| 11 | 13,000 |
| 12 | 20,000 |
| 13 | 30,000 |
| 14 | 50,000 |
| Finished | No daily limit. Only **Emails each minute** limits sending. |

The limit counts emails sent since midnight UTC, for campaigns and automations together. A stage moves up once a day, when the day before met all three conditions:

- You sent at least half of that stage's limit. A quiet day proves nothing to mail apps.
- Fewer than 3% of the emails sent that day bounced.
- Fewer than 0.1% of them were reported as spam.

The day is judged an hour after midnight UTC, so late bounces count. A stage that does not meet the conditions repeats the next day. The warm-up does not move while sending is paused. The status reads **Warming up** until stage 14 is passed, then **Ready**.

A campaign larger than the day's room sends what fits and continues the next day. The rest wait as **Waiting to go** in its report. An email that would go to a mailbox provider the mail platform has not sent to before can be held for a while, and goes out later. If Coritan staff set a fixed daily cap for your organization, it replaces the stage limit and sending reads **Ready**.

## Automatic pausing

Under **Sender and limits**, you set the limits at which *auto-pause* acts. After at least 200 emails of a campaign are delivered, the campaign pauses if its bounce rate or its spam report rate goes over your limits:

| Setting | What it does | Default | Allowed |
| --- | --- | --- | --- |
| **Bounces go over** | Pauses a campaign when more than this share of its emails bounced. | 5% | 0.5% to 10% |
| **Spam reports go over** | Pauses a campaign when more than this share of its emails were reported as spam. | 0.3% | 0.05% to 0.5% |

The campaign shows why it paused, such as `Paused automatically: 6.2% of this campaign's emails bounced, over your limit of 5%. Remove old or mistyped addresses from your lists, then resume.` If two campaigns in a row pause this way, all your marketing email pauses. Clean your lists, check how people join them, and then resume.

The **Overview** badge reads **Watch** above 2% bounces or 0.1% spam reports, and **Critical** over your limits or while sending is paused ([Set up email marketing for your store](/docs/organizations/commerce/email-marketing/#read-the-overview)).

## Pause and resume sending

Select **Pause sending…**, add a **Reason** if you like, and confirm with **Pause sending**. Every campaign and automation stops now. Emails already queued wait and go out after you resume. **Resume sending** starts it again, whether you paused it or an automatic pause did.

If Coritan staff paused your sending, the page says **Coritan staff paused your sending**, gives their reason and shows no way to resume. Only staff can lift their own pause. Open a ticket from the page to find out why.

## Bounces and spam reports

The mail platform tells us what happened to each email after it left, and we act on it once for each email:

- A *hard bounce*, a permanent failure such as a mailbox that does not exist, suppresses the address and sets the contact to **Bounced**.
- An email the platform gave up on after temporary failures, such as a full mailbox, counts as a bounce. It suppresses the address only after three of them in 30 days.
- A spam report suppresses the address and sets the contact to **Marked as spam**.

The contact leaves every list, and the suppression list used by the store's flows holds the address too. Nobody can lift a bounce or a spam report. Each is also sent as a [webhook event](/docs/organizations/commerce/email-marketing/#webhook-events), and campaign reports list bounces by reason.

An email that fails because the platform could not take it right away is tried again after 2, then 10, then 30 minutes. After the fourth failure it is marked **Failed**. An email is never sent twice: when we cannot tell whether one went out, it is marked **Failed** and not tried again.

## When sending is not ready

A campaign that cannot start answers with a reason. The same reasons show as **Sending is not ready** in the schedule dialog.

| Reason | What it means | What to do |
| --- | --- | --- |
| `not_set` | No sending domain. | Select **Set up domain**. |
| `pending_dns` | Some required records are not in place. | Add them, then select **Check records**. A record that reads **Different value** holds something else at that name, such as a second SPF record. |
| `no_address` | No postal address. | Fill in **Postal address** and select **Save changes**. |
| `paused` | You or an automatic pause paused sending. | Select **Resume sending**. |
| `staff_paused` | Coritan staff paused sending. | Open a ticket. Only staff can resume. |
| `daily_limit` | Today's limit is used up. | Wait for tomorrow. A send that did not fit continues, and the limit rises as your history builds. |

`daily_limit` stops a campaign from starting now. A scheduled campaign and a resume go ahead, and the emails that do not fit wait for the next day.

A setup call can also answer `422` with `invalid_domain` or `use_subdomain`, `409` with `domain_unavailable` or `domain_locked`, and `503` with `mail_unavailable` when the mail platform cannot take a new domain yet. Try again later in the last case.

## Result

- The status badge reads **Warming up** once the required records are **In place**, then **Ready**.
- **Daily limit** shows the stage and how many emails you can still send today.
- A campaign you schedule starts instead of answering that sending is not ready.

## Troubleshooting

A record stays **Not found**
: DNS has not spread yet, or the record is at another name. Compare the **Name** on the page with the one at your DNS provider, wait a while and select **Check records** again.

A record reads **Different value**
: The name holds another value. For SPF, a name can have only one record: merge our `include:` into it. For DKIM, copy the whole value, which is long.

The domain cannot be changed
: Its records were verified, so it is locked. Ask [support](https://www.coritan.com/dashboard/support) to move it.

The page is read-only
: Changing the setup needs an owner or admin. Tier 3 support can read it.

A campaign paused by itself
: Its bounce or spam report rate went over your limits. Clean your lists, then resume.

Sending is slower than I expected
: The warm-up limit, **Emails each minute** or the campaign's own speed holds it back. Read the **Daily limit** card and the campaign's speed under **Sending speed**.

## Related

- [Set up email marketing for your store](/docs/organizations/commerce/email-marketing/)
- [Write, test and send email campaigns](/docs/organizations/commerce/email-campaigns/)
- [Manage your email contacts, lists and segments](/docs/organizations/commerce/email-contacts/)
- [How email reaches an inbox](/docs/learn/how-email-works/)

## With the API

The routes are under `https://api.coritan.com/api/v1/orgs/{org_slug}/marketing/sending`. Reading takes `marketing.settings:read` and changing takes `marketing.settings:write` ([API key scopes](/docs/organizations/commerce/email-marketing/#api-key-scopes)).

`GET /sending` answers `{sending}`:

| Field | What it holds |
| --- | --- |
| `status` | `not_set`, `pending_dns`, `verified`, `warming`, `ready` or `paused`. |
| `domain`, `tracking_host`, `verified_at` | The domain, its tracking host once verified, and when the records were verified. |
| `from_name`, `from_local`, `from_address`, `reply_to`, `physical_address` | The sender and the postal address. |
| `warmup` | `{stage, started_at, daily_limit}`, with `stage` from 0. |
| `daily_cap`, `per_minute` | A fixed cap set by Coritan staff, and the speed in emails a minute. |
| `quota` | `{daily_limit, sent_today, remaining}`. `daily_limit` and `remaining` are `null` without a daily limit. |
| `thresholds` | `{bounce_pause_pct, complaint_pause_pct}`. |
| `paused`, `paused_by_staff`, `paused_reason`, `paused_at` | The pause. |
| `dns` | `{records, checked_at}`. Each record is `{type, name, value, purpose, status}`. `purpose` is `ownership`, `spf`, `dkim`, `dmarc` or `tracking`, and `status` is `verified`, `pending`, `mismatch` or `missing`. |

1. `POST /sending/setup` sets up the domain. Send `{"domain": "news.example.com"}`, or no body for `news.` in front of your own domain. It answers `{sending}` with the records to add.

   ```bash
   curl -X POST "https://api.coritan.com/api/v1/orgs/acme/marketing/sending/setup" \
     -H "X-API-Key: $ORG_API_KEY" -H "Content-Type: application/json" \
     -d '{"domain": "news.example.com"}'
   ```

2. Add the records, then `POST /sending/verify` checks them and answers `{sending}`. It moves `pending_dns` to `warming` once every required record is in place. Without a domain, it answers `409` with `not_set`.
3. `PUT /sending` changes the sender and the limits. Send only what changes:

   ```bash
   curl -X PUT "https://api.coritan.com/api/v1/orgs/acme/marketing/sending" \
     -H "X-API-Key: $ORG_API_KEY" -H "Content-Type: application/json" \
     -d '{"from_name": "Acme Games", "physical_address": "12 Dock Road, Hamburg 20095, Germany",
          "per_minute": 300, "thresholds": {"bounce_pause_pct": 5, "complaint_pause_pct": 0.3}}'
   ```

   A value outside its range answers `422` with `invalid` and the `field`, such as `per_minute` or `bounce_pause_pct`.

4. `POST /sending/pause` takes an optional `reason` of up to 500 characters and stops all marketing email. `POST /sending/resume` starts it again, and answers `409` with `staff_paused` when Coritan staff paused it.

Setup and verify each allow 30 calls an hour per organization, and answer `429` with `rate_limited` beyond that.

## API

- `GET /api/v1/orgs/{org_slug}/marketing/sending`: Get sending (https://www.coritan.com/docs/api/reference/organizations/marketing/marketing/#op-get-api-v1-orgs-org-slug-marketing-sending)
- `PUT /api/v1/orgs/{org_slug}/marketing/sending`: Update sending (https://www.coritan.com/docs/api/reference/organizations/marketing/marketing/#op-put-api-v1-orgs-org-slug-marketing-sending)
- `POST /api/v1/orgs/{org_slug}/marketing/sending/pause`: Stop all marketing email now (https://www.coritan.com/docs/api/reference/organizations/marketing/marketing/#op-post-api-v1-orgs-org-slug-marketing-sending-pause)
- `POST /api/v1/orgs/{org_slug}/marketing/sending/resume`: Start sending again after a pause, yours or an automatic one (https://www.coritan.com/docs/api/reference/organizations/marketing/marketing/#op-post-api-v1-orgs-org-slug-marketing-sending-resume)
- `POST /api/v1/orgs/{org_slug}/marketing/sending/setup`: Set up the sending domain (https://www.coritan.com/docs/api/reference/organizations/marketing/marketing/#op-post-api-v1-orgs-org-slug-marketing-sending-setup)
- `POST /api/v1/orgs/{org_slug}/marketing/sending/verify`: Check the DNS records again (https://www.coritan.com/docs/api/reference/organizations/marketing/marketing/#op-post-api-v1-orgs-org-slug-marketing-sending-verify)
