# Notifications and connectors

Choose where project events appear: in-app notifications, Slack or email. Configure destinations in [Webhooks & connectors](/portal/connectors). For signed HTTP requests to your application, see [Webhooks](/docs/guides/webhooks).

## Filters

By default a connector receives every event of the types it subscribes to. Add **Filters** in the connector dialog to narrow that further. An event is sent only if it matches every filter you set; a filter left empty matches everything.

- **Severity**: **High severity only** skips `low` events.
- **Folders**: only events about an asset in one of the chosen folders, or in a folder inside them. Events that aren't about an asset (usage, team and connector events), and assets outside every folder, don't match.
- **Moderation categories**: only events that carry flagged categories, which today means [`asset.flagged`](/docs/api/events#event-asset-flagged), with at least one of the chosen categories. Every other event type doesn't match, so combine this filter with the **Asset flagged** event type.

Filters are applied when the event happens. Changing them doesn't affect deliveries already made.

## In-app notifications

Each project has one **In-app notifications** connector, listed first in [Webhooks & connectors](/portal/connectors). It shows events in the notification bell and counts them as unread, and new ones appear straight away for everyone with the portal open. By default it subscribes to the event types that need attention, such as flagged, rejected and failed assets, the upload limit, new members and failing connectors.

Edit it to choose which event types appear in the bell, or switch it off to stop new notifications. It can't be deleted, and it is never disabled automatically. Every event is still listed on [Alerts & Events](/portal/alerts) whatever this connector's settings. **Test** adds a sample notification to the bell, marked **Test**.

## Slack

A Slack connector posts each event to one Slack channel as a message with the event's title, severity, details and a **View in CalmLens** button.

1. In Slack, create an app, turn on **Incoming Webhooks** and add a webhook for the channel you want. Slack's [incoming webhooks guide](https://api.slack.com/messaging/webhooks) walks through it.
2. Copy the webhook URL. It looks like `https://hooks.slack.com/services/T000/B000/XXXX`.
3. In [Webhooks & connectors](/portal/connectors), add a connector, choose **Slack** and paste the URL as the **Slack webhook URL**.

Anyone with the URL can post to the channel, so CalmLens stores it encrypted and only shows its last four characters afterwards. To change it, edit the connector and paste a new URL; leave the field blank to keep the current one. Only `https://hooks.slack.com/services/…` URLs are accepted.

If Slack reports that the webhook was revoked, the channel was deleted or archived, or posting isn't allowed, the delivery fails straight away with a message saying so. Create a new webhook and update the connector. Slack rate limits and outages are retried on the schedule under [Deliveries and retries](/docs/guides/webhooks#deliveries-and-retries).

## Email

An email connector sends each event to the project members you choose, from `contact@calmlens.com`, one email per person. The email has the event's title, details and a **View in CalmLens** link, and says why the recipient is getting it.

1. In [Webhooks & connectors](/portal/connectors), add a connector and choose **Email**.
2. Tick the recipients. Only members of the project who have an email address are listed and accepted, including the owner.

Recipients are checked again every time an event is sent: someone who leaves the project stops receiving emails, even if the connector still lists them. If none of the recipients are members any more, the delivery fails with a message saying so. To stop someone receiving emails, edit the connector and untick them. A recipient who wants to stop should ask a project admin to do this.

To avoid flooding inboxes, each email connector sends at most 30 events a minute. Events beyond that wait and are sent shortly afterwards.

## Test a connector

Use **Test** on a connector to send a synthetic event to it straight away. The test is a real delivery: a signed request to your webhook endpoint (checking the URL, your signature verification and your response), a message in your Slack channel, or an email to each recipient. It appears in the deliveries list marked as a test, and is not retried. Test events use example data for the type you choose, with `{ "key": "test", "value": true }` added to `facts`.

## Delivery failures

See [Deliveries and retries](/docs/guides/webhooks#deliveries-and-retries) for retry timing, automatic disabling and retention.
