# Concept: Notification stream

A **notification stream** tells you when a product's sync **crosses a health boundary** — it fires on state *changes* (a run starts failing; a failing product recovers), not on every event, so it stays quiet in steady state. A stream is either a **Slack** incoming webhook (a short message posted to a channel) or a **generic webhook** (a JSON `POST` to your endpoint). It can watch **all products** in the tool or narrow to one.

Webhook streams are **signed**: every request carries an HMAC-SHA256 of the raw body in a signature header, keyed with the stream's own **signing secret** (shown on its edit page). Recompute and compare constant-time; reject mismatches. The secret can be **rotated** — the old one stops verifying immediately. A **test** action sends a sample `run.failed` payload so you can verify the wiring before trusting it.

Related: [Product](/concepts/product) · [Sync run](/concepts/sync_run)
