A sync alert fires when a sync enters a warning or critical state, and sends a notification to the people or channels you choose.
| Audience | Data teams and admins monitoring sync health |
| Prerequisites | At least one sync. |
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.
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
WARNINGorCRITICALstate, 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:
- A sync rejects rows and crosses the warning threshold. You receive one
WARNINGnotification. - It keeps rejecting rows on later runs. No new notification.
- Rejections climb past the critical threshold. You receive one
CRITICALnotification. - 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.

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.

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.

| 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. |
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. To adjust a trigger, click the pencil icon on it.
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.

For each recipient, choose how much to send under Alert severity:
- Send all alerts — notify on both
WARNINGandCRITICALstatus changes. - Send critical alerts only — notify on
CRITICALstatus 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 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:
{
"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.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. |
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.
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.