> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hightouch.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Configure sync alerts

> A sync alert fires when a sync enters a warning or critical state, and sends a notification to the people or channels you choose.

> [!NOTE]
>
> Advanced alerting must be enabled by Hightouch. [Contact us](#pylon-chat) to turn it on.

Configure alerts once per destination, override them on the syncs that need it, add the recipients who should hear about them, then let Hightouch notify you when a sync breaks or degrades.

## Before you begin

* At least one sync.

## How alerting works

Each sync is evaluated against a set of **triggers** that watch for problems like failed runs, rejected rows, slow performance, or unexpected data drops. Two terms do the work:

* **Alert** — the signal that a sync has entered a `WARNING` or `CRITICAL` state, based on a trigger crossing its threshold.
* **Notification** — the message a recipient receives. Alerts always show in the Hightouch app; a notification only goes out if a recipient is subscribed at that severity.

Instead of showing only the last run's result, each sync shows a **rollup** of its current alerting state: `No alerts` when everything is healthy, or the number of active alerts when one or more triggers are in a `WARNING` or `CRITICAL` state. This reflects whether the sync is healthy, degraded, or needs attention, regardless of when it last ran.

### When notifications are sent

Hightouch sends one notification per trigger **status change**, not per run, so a persistent problem doesn't notify you on every run. For example:

1. A sync rejects rows and crosses the warning threshold. You receive one `WARNING` notification.
2. It keeps rejecting rows on later runs. No new notification.
3. Rejections climb past the critical threshold. You receive one `CRITICAL` notification.
4. The sync recovers. You receive one recovery notification.

## Configure alerts

Set alert triggers at two levels. Destination-level settings apply to every sync using that destination; sync-level settings override them for a single sync.

To set destination-wide defaults, go to **Integrations > Alerting**, open the **Syncs** tab, and select a destination. Set its triggers and recipients, and every sync using that destination inherits them.

![Destination-level alert settings under Integrations > Alerting](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/syncs/alerting/destination-alert-settings.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=f671d71cbbed2581c583536ac5b14df6)

To override the defaults for one sync, open the sync and click the **Alerting** tab. A sync inherits its destination's defaults; adjust its triggers or recipients here to override them.

![Sync-level alert settings on the Alerting tab](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/syncs/alerting/sync-alert-settings.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=00ebc939861c39e82545e9f0fdc4df72)

> [!NOTE]
>
> Changes take effect the next time thresholds are evaluated: after the next
> sync run, or about every five minutes for time-based triggers.

## Trigger types

**Fatal errors**, **Rejected rows**, and **Sync throughput** come preconfigured with defaults. **Model or audience size** and **Sync duration** start off until you configure them.

![The trigger list showing default alert conditions](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/syncs/alerting/alerting-triggers.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=b57adf2728fc09e776c4cb0115a4cd87)

| Trigger | What it watches | Default |
| - | - | - |
| **Fatal errors** | Runs that can't complete because of an infrastructure or configuration problem, such as unreachable credentials or invalid SQL. | `CRITICAL` if any run has a fatal error. |
| **Rejected rows** | Rows the destination rejected because of schema mismatches, validation failures, or destination constraints. | `WARNING` if any rows are rejected during a run. |
| **Sync throughput** | Successful operations over a time window, to catch stalled or idle syncs. | `WARNING` if no successful operations occur in seven days. |
| **Model or audience size** | The number of rows the model returns at run time, which can flag broken upstream filters or joins. | Off until you set a minimum row count. |
| **Sync duration** | Wall-clock runtime, from when a run is queued to when it finishes. | Off until you set a duration threshold. |
| **Unexpected sync volume** | Journey trigger syncs that are about to sync far more members than entered the journey node since the last run. | Fires when a run would sync more than twice the members who entered the node, and more than 1,000 extra rows. |

**Unexpected sync volume** applies only to journey sync tiles in [Trigger mode](https://docs.hightouch.com/customer-studio/journeys/tiles.md#trigger-mode), and is evaluated after a run plans but before it sends anything, rather than after the run ends, so its `STOP` severity stops the run instead of reporting on one that already happened. See [Unexpected sync volume](#unexpected-sync-volume).

Fatal-error and rejected-row triggers are evaluated right after each run ends. Time-based triggers — throughput and duration — are evaluated about every five minutes, so they can fire before a long-running run finishes even if it's working normally. To adjust a trigger, click the pencil icon on it.

## Unexpected sync volume

Applies to journey sync tiles in [Trigger mode](https://docs.hightouch.com/customer-studio/journeys/tiles.md#trigger-mode). It compares the members a run is about to sync against the members who entered the tile since the last run, and acts before any rows reach the destination: at `STOP` it prevents the run from sending, at `WARNING` it notifies you and lets the run continue.

![The Unexpected sync volume trigger on a journey trigger sync](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/syncs/alerting/journey-sync-volume-trigger.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=cade62863865e65b1f3d87d3b3466299)

A stopped run reports what it saw, for example:

> Stopped before syncing: About to sync 50000 members but only 1200 entered this node since the last run (41.7x). Planned adds 50000, retried 0, unaccounted 48800.

A gap that size usually means the run is about to sync members who have already been through the node.

A stopped run doesn't resume. To allow the next run to proceed, mute the trigger on the sync's [Alerting](https://docs.hightouch.com/syncs/alerting.md#configure-alerts) tab, which lets subsequent runs complete and silences the notification.

If the alert fires on runs that are normal for this journey, raise either threshold, or set the trigger to `WARNING`.

## Set up recipients and channels

Recipients are the people and channels that receive notifications. Manage them on the **Recipients** tab of **Integrations > Alerting**, where each channel type is set up once:

* **Email** — add an address directly.
* **Slack** — authorize the Slack connection, then choose a channel.
* **PagerDuty** — complete the PagerDuty setup, then route alerts to a service.
* **SMS** — add a phone number. Hightouch covers the cost of SMS alerts.
* **Webhook** — send a JSON payload to a URL you specify. See [Send alerts to a webhook](#send-alerts-to-a-webhook).

![The Recipients tab showing channel types and a recipient's settings](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/syncs/alerting/recipient-channels.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=ebe054e4c1ffa41e9ab894be891dd2ec)

For each recipient, choose how much to send under **Alert severity**:

* **Send all alerts** — notify on both `WARNING` and `CRITICAL` status changes.
* **Send critical alerts only** — notify on `CRITICAL` status changes only.

You can also scope a recipient to specific destinations, and still override that routing per sync from the sync's **Alerting** tab.

### Test a recipient

Before you rely on a recipient, confirm it works. On the recipient's settings, click **Send a test alert now** to send a test notification through that channel.

### Send alerts to a webhook

A webhook channel delivers a JSON payload to a URL you specify whenever an alert fires or recovers. Webhook channels support custom HTTP headers, sent with every request, for authentication tokens or routing keys your endpoint requires — for example `Authorization: Bearer <token>` or `X-Routing-Key: ops-team`.

![Webhook recipient configuration showing custom headers](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/syncs/alerting/webhook-recipient-config.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=f99ce07ce62fd631607d31b9b459c5cd)

#### Webhook payload

When a sync alert fires or recovers, Hightouch sends an HTTP `POST` request with a JSON body to your webhook URL. The request carries `Content-Type: application/json`, along with any custom headers you configured. The body identifies the sync, the status change, and the trigger that caused it:

```json theme={null}
{
  "resourceId": "123",
  "resourceType": "Sync",
  "resourceName": "[Orders → Salesforce]",
  "resourceUrl": "https://app.hightouch.com/example-workspace/syncs/123",
  "resourceDescription": "Syncs orders to Salesforce.",
  "resourceLabels": {
    "team": "data-platform"
  },
  "destinationLabels": {
    "team": "growth"
  },
  "newStatus": "critical",
  "oldStatus": "healthy",
  "trigger": {
    "displayName": "Fatal errors",
    "status": "critical",
    "displayMessage": "3 or more consecutive sync runs encountered fatal errors."
  }
}
```

| Field | Type | Description |
| - | - | - |
| `resourceId` | string | The ID of the sync that generated the alert. |
| `resourceType` | string | The monitored resource type. Sync alerts send `Sync`. |
| `resourceName` | string | The sync name, formatted as `[model name → destination name]`. |
| `resourceUrl` | string | A link to the sync in the Hightouch app. |
| `resourceDescription` | string \| null | The sync's description, when it has one, or null if the description is not set. |
| `resourceLabels` | `object` | The sync's labels as key-value string pairs. Empty (`{}`) when the sync has no labels. |
| `destinationLabels` | `object` | The labels on the sync's destination, as key-value string pairs. Empty (`{}`) when the destination has no labels. |
| `newStatus` | string | The sync's new status: `warning` or `critical` when an alert fires, or `healthy` when it recovers. |
| `oldStatus` | string | The sync's previous status, or `disabled` if the sync was disabled before the latest status. Omitted if the sync has never changed status. |
| `trigger` | object | The trigger whose status change generated the alert. |
| `trigger.displayName` | string | The trigger's name, such as `Fatal errors`, `Rejected rows`, or `Sync throughput`. Matches the [trigger types](#trigger-types). |
| `trigger.status` | string | The trigger's current status: `warning`, `critical`, or `healthy` when it recovers. |
| `trigger.displayMessage` | string | A human-readable description of the alert or recovery. |
| `trigger.error` | string | Additional error detail, included only when the alert has one. |

> [!NOTE]
>
> The payload body is fixed. You can configure the webhook URL and custom
> headers, but not the fields Hightouch sends or their shape.

## Mute a trigger

Mute a trigger to stop its notifications during planned maintenance, a known issue, or quiet hours. A muted trigger still updates the sync's alert state and appears in rollups; it just doesn't notify anyone.

Muting **Unexpected sync volume** also lets the next run proceed. This trigger can stop a run, so silencing it and allowing it are the same action.

From the sync's **Alerting** tab, click the volume icon on the trigger and select a mute duration — a fixed window such as one hour or one day, or indefinitely. You can also mute from the **Mute...** link at the top of an active alert on the sync page.
