# Set up email alerts

Email is the simplest and most reliable channel, and the one every account should set up first. It's free,
supports the full alert content (error details and rich HTML formatting), and it's the **only** channel that can
receive [scheduled uptime reports](/alerts/subscriptions/#event-types) - every other channel is alerts-only.

## Settings reference

| Setting (UI label) | API field (v2) | Type / allowed values | Default | Plan limits | What it does for you |
|---|---|---|---|---|---|
| Contact Type | `type` | `"email"` | - | - | |
| Email address | `address` | Email address string | - (required) | - | Where the alert is delivered; checked for a working mail domain (MX record) before the contact is created |
| Digest | `groupedAlerts` | boolean | `true` in the app's create flow | - | Combine alerts firing close together into one email - see [grouped alerts](/alerts/grouped-alerts/) |
| Plain-text emails | `plainText` | boolean | `false` (HTML) | - | Send plain text instead of the HTML design - useful for a ticketing system or pager gateway that parses the body |
| Billing notifications | `billingNotifications` | boolean | `false` | - | Also receive billing/payment emails at this address |
| News and updates | `sendNews` | boolean | `false` | - | Receive occasional product news |

Every other contact setting (language, alert delay, active hours) is the same shared model covered on
[what a contact is](/alerts/contacts/) - none of it is email-specific.

## Set it up in the app

1. Open **Alerts & Contacts** and click **+ Add contact**.
2. Choose **Email** (the default type).
3. Enter the address and give the contact a name.
4. Save, then open the confirmation email HostTracker sends and follow the link (or enter the code) to confirm
   it. See [confirmed vs unconfirmed contacts](/alerts/contacts/#confirmation---why-an-unconfirmed-contact-gets-nothing).

![The email contact editor, with Main Settings expanded to show language, alert delay, active hours and digest.](../../../../assets/screenshots/contact-editor-email.png)

Under **Main Settings** you can also set a per-contact [language](/alerts/contacts/), an
[alert delay](/alerts/escalation/), [active hours](/alerts/active-hours/), the **Digest** switch, and
**Plain-text emails**.

## What the message looks like

A real alert email is HTML by default: the monitor's name and URL, what happened (the error, or the recovery
and downtime duration), the time, and links back into HostTracker (edit the monitor, see the check details).
Turning on **Plain-text emails** sends the same information as plain text instead - no images, no styled
layout, just the facts a parser can read reliably. A scheduled report email instead carries a summary table
(uptime percentage, incident count) for the period and monitors it covers.

## Do it with the API or MCP

```
POST /contact
{ "type": "email", "address": "ops@example.com", "name": "Ops inbox" }
```

MCP: `create_contact(type="email", address="ops@example.com", name="Ops inbox")`. Confirm with
`send_contact_confirmation` / `confirm_contact`, then verify delivery with `test_contact`.

## What happens next

HostTracker sends a confirmation code to the address immediately. The contact receives nothing real until it's
confirmed - see [the confirmation flow](/alerts/contacts/#confirmation---why-an-unconfirmed-contact-gets-nothing)
for the exact code lifetime and attempt limit.

## Limits and gotchas

- **`422 validation_failed`** (reason `undeliverable_domain`) - the address's domain has no working mail server
  (checked at create/update time). This check fails open on DNS trouble, so it should never block a real domain
  having a bad day, but it will refuse an obvious typo up front.
- Check spam/junk folders for both the confirmation email and, if alerts seem to be missing later, the alerts
  themselves - add HostTracker's sending address to your allowlist if your provider filters aggressively.
- [Send a test alert](/alerts/test-a-contact/) once confirmed to be sure it renders and arrives as expected.

## Related

- [What a contact is](/alerts/contacts/)
- [Subscriptions: alert vs report](/alerts/subscriptions/)
- [All channels](/alerts/channels/)
