# Open and click tracking

> How Emailit tracks opens with a pixel and clicks with rewritten links on your own domain, how accurate the data is, and how to turn tracking on or off.

Emailit can record when recipients open your emails and click their links. Tracking runs on a hostname on your own domain, such as `go.acme.com`, so recipients never see a shared tracking host. This page explains how tracking works, its limits and how to control it.

## How it works

Tracking only runs when the sending domain has a verified tracking CNAME (`go.<domain>` pointing to `go.emailitmail.com`). Without it, Emailit still sends your mail, just untracked. [Set up a custom tracking domain](/docs/tracking/custom-tracking-domain/) first.

**Opens (loads).** Emailit adds a transparent 1×1 image to the end of the HTML body, loaded from `https://go.acme.com/<token>`. When the recipient's mail app loads it, Emailit records a load and returns the image. Opens can only be tracked in HTML email.

**Clicks.** Before sending, Emailit rewrites every `http` and `https` link in the HTML and plain-text parts to `https://go.acme.com/<token>`. When someone clicks, Emailit records the click and immediately redirects to the original URL. It leaves `mailto:` and `tel:` links, relative links and links to Emailit's own domains unchanged. If the message has HTML but no plain-text part, Emailit generates one from the HTML when it adds click tracking.

Emailit uses the word **loaded** for opens, because it can only see that the image was loaded, not that a person read the email.

## Accuracy and privacy

Treat open and click data as a signal, not an exact count. Emailit records every request that reaches your tracking domain and doesn't filter out automated traffic.

- **Apple Mail Privacy Protection** downloads images, including the pixel, through Apple's proxy servers as soon as mail arrives. Those messages show as loaded even if nobody opened them, and the IP address belongs to Apple.
- **Image proxies** such as Gmail's fetch and cache images on the recipient's behalf. The IP address and user agent belong to the proxy, and repeat opens may not reach Emailit.
- **Blocked images** mean no open is recorded, even when the recipient reads the email.
- **Security scanners** in corporate mail systems follow links to check them before the recipient sees the message. These show up as clicks, often within seconds of delivery.

Clicks are a more reliable engagement signal than opens. For deliverability decisions, look at trends over many messages rather than single events.

Tracking records the IP address and user agent of each open and click. In many regions, privacy law requires you to tell recipients about tracking, for example in your privacy policy, and some require consent. If you don't need the data, leave tracking off.

## Turn tracking on

### Domain defaults

Each domain has two switches in the **Tracking** card on its page in **Email API → Domains**: **Track loads** and **Track clicks**. They're off for new domains and stay disabled until the tracking CNAME shows **OK**.

The switches set the default for every email sent from the domain through the API and SMTP. Over SMTP, the domain defaults are the only way to control tracking.

With the API, call [Update a domain](/docs/api-reference/domains/update/) with `track_loads` and `track_clicks`. Turning either on before the CNAME is verified returns `422`.

### Per-email override

The `tracking` field on [Send an email](/docs/api-reference/emails/send/) overrides the domain defaults for that message:

| Value | Opens | Clicks |
| --- | --- | --- |
| Omitted | Domain default | Domain default |
| `true` | On | On |
| `false` | Off | Off |
| `{ "loads": true, "clicks": false }` | On | Off |
| `{ "clicks": true }` | Off | On |

In the object form, a key you leave out counts as off. The domain default doesn't fill it in.

```bash
curl https://api.emailit.com/v2/emails \
  -X POST \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Acme <hello@acme.com>",
    "to": "ada@example.com",
    "subject": "Your receipt",
    "html": "<p>Thanks for your order.</p>",
    "tracking": { "loads": false, "clicks": true }
  }'
```

If the domain's tracking CNAME isn't verified, Emailit turns tracking off for the message instead of rejecting it. The `tracking` object in the response shows what was actually applied.

Campaign emails always request open and click tracking, so they're tracked whenever the sending domain's tracking CNAME is verified. Test sends of a campaign aren't tracked.

## Events

Each open and click creates an event, not just the first one. The email's status moves to `loaded` after the first open and to `clicked` after the first click.

| Event | When it fires |
| --- | --- |
| [`email.loaded`](/docs/webhooks/events/email/loaded/) | The tracking pixel was loaded. |
| [`email.clicked`](/docs/webhooks/events/email/clicked/) | A tracked link was clicked. |

Both payloads include the IP address and user agent of the request, the email it belongs to and the matching contact if one exists. `email.clicked` also includes the link. Here's the `data.object` of an `email.clicked` event:

```json
{
  "id": "click_7Tn4Lp9Kd2Rv",
  "object": "click",
  "email_id": "em_5Vb2Nq8Xc1Jm",
  "email": {
    "id": "em_5Vb2Nq8Xc1Jm",
    "rcpt_to": "ada@example.com",
    "mail_from": "hello@acme.com",
    "subject": "Your receipt",
    "created_at": "2026-10-01T09:12:44Z",
    "campaign": null,
    "meta": { "order_id": "1042" }
  },
  "link": {
    "id": "link_9Wd3Ks6Mf4Ht",
    "url": "https://acme.com/orders/1042"
  },
  "contact": { "id": "con_8Ry5Bv2Lq7Np", "email": "ada@example.com" },
  "ip_address": "203.0.113.24",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15",
  "created_at": "2026-10-01T09:15:02Z"
}
```

`email.loaded` has the same shape with `"object": "load"`, an ID that starts with `load_` and no `link`. See [Webhook requests](/docs/webhooks/webhook-requests/) for the full request format.

## Where to see tracking data

- **Email details.** The **Loads** and **Clicks** tabs on an email's page list every open and click with its time, IP address and, for clicks, the URL. See [Email details](/docs/logs/email-details/).
- **Analytics.** The **Loads** and **Clicks** widgets chart engagement over time. See [Analytics](/docs/analytics/).
- **Campaign reports.** Loaded, clicked and click-through rate per campaign, with clicks per link. See [Campaign reports](/docs/campaigns/reports/).
- **Events and webhooks.** Every `email.loaded` and `email.clicked` event appears in **Email API → Events** and is sent to webhooks that subscribe to it.

## Next steps

  - [Custom tracking domain](/docs/tracking/custom-tracking-domain/): Publish and verify the tracking CNAME.
  - [Set up webhooks](/docs/webhooks/set-up/): Receive email.loaded and email.clicked events.

---
Source: https://emailit.com/docs/tracking/
