> For the complete documentation index, see [llms.txt](https://docs.ilert.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ilert.com/alerting/configure-alerting/event-flows.md).

# Event flows

A routing layer in front of your alert sources: branch on the payload, wait for business hours, and send each event to the source that suits it.

An alert source decides what an event means. An event flow decides **which alert source gets it** — and that turns out to be the thing you need once one endpoint has to serve several teams, several severities, or different behaviour during the night.

Your tool sends to the flow instead of to a source. The flow evaluates the payload, follows the first branch that matches, and routes the event onward.

{% hint style="info" %}
**Event flows require the** [**Scale plan**](https://www.ilert.com/pricing) **or higher, and are in beta.**

Beta here means the node set is still growing and one node — **Transform event** — is in closed beta on top of that. Flows you build now keep working; expect new blocks rather than changed ones.
{% endhint %}

## When to reach for one

You do not need an event flow to control noise — the [alert source](/alerting/configure-alerting/alert-sources.md) does that, with filters, grouping and priority. Reach for a flow when the *destination* has to change:

* One Prometheus endpoint, but database alerts should page the database team and everything else the platform team.
* Anything arriving outside business hours should go to a low-priority source instead of the on-call one.
* An event should be held for ten minutes in case it resolves itself, and only then routed.

If the routing decision is always the same, put the logic on the alert source and skip the flow.

## Build a flow

{% stepper %}
{% step %}

### Create it

In the sidebar, go to **Alerting** → **Event flows** and click **Create new event flow**. Give it a name, and optionally assign [teams](/users-and-access-management/teams.md).
{% endstep %}

{% step %}

### Say what triggers it

Click the **Incoming event** node and pick one or more integrations. ilert generates an endpoint and integration key per integration — point your tool at those instead of at an alert source's. They are drop-in replacements, so switching an existing tool over is a URL change.
{% endstep %}

{% step %}

### Add logic

Click a **+** on the canvas and choose a node. Most flows are a **Branch** or a **Support hours** node followed by a **Route to alert source** on each path.
{% endstep %}

{% step %}

### Save

Click **Save**. The flow is live immediately and starts processing events from the integrations you attached.
{% endstep %}
{% endstepper %}

<figure><img src="https://3394882078-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M76ygPnS4HUcFSX8ulm%2Fuploads%2Fgit-blob-0daedbaa0d146c9c252c9a35f1831cc045cb224f%2Fevent-flow-canvas.png?alt=media" alt="A saved ilert event flow named PROD: an Incoming event node reading No integration added, below it a Branch node, a grey Else branch chip, a Route to alert source node naming Amazon SNS, and an End of flow node. The header carries Edit, View event flow logs and Export to Terraform buttons."><figcaption><p>The <strong>Incoming event</strong> node always says what it is listening to — here, nothing yet. Grey chips are branch names, not nodes.</p></figcaption></figure>

## The nodes

| Node                      | Does                                                                                                     | Branches it adds                     |
| ------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------ |
| **Branch**                | Evaluates conditions against the payload                                                                 | one per condition group, plus `Else` |
| **Route to alert source** | Sends the event to an alert source, optionally overriding its escalation policy or notification priority | none                                 |
| **Support hours**         | Splits on your [support hours](/alerting/configure-alerting/support-hours.md) definition                 | `During`, `Outside`                  |
| **Wait**                  | Pauses the event before the next node runs                                                               | none                                 |
| **Transform event**       | Modifies event properties before they continue                                                           | none                                 |

Every path ends at **End of flow**. An event that reaches it without passing a **Route to alert source** node creates nothing — which is a legitimate way to drop events, and also the most common reason a flow "does nothing".

### Branch

Conditions are built the same way as an [event filter](/alerting/configure-alerting/alert-sources.md#event-filter): filter groups combined with AND / OR, over ilert event properties (`context.event.summary`), custom payload fields (`context.event.customDetails.labels`), integration type and event timestamp.

Branches are evaluated **in order, first match wins** — so order matters, and a broad condition placed early will shadow the specific ones after it. Anything matching nothing takes the `Else` path.

### Wait

Two modes, and the second is the interesting one:

* **Duration** — hold for a number of seconds, minutes, hours or days.
* **Support hours** — hold until support hours **start**, or until they **end**. During support hours the flow continues immediately rather than waiting for the next window.

Waiting until business hours begin is how you stop a low-severity event from paging at 3am without dropping it: it simply arrives at 9.

### Transform event

Rewrites fields before the event continues — set a value, copy from another field, map values onto new ones, apply a template, merge properties, append to an array. This node is in **closed beta**; if it is disabled in your account, the tooltip explains how to ask for access.

## Working with large flows

Every node's three-dot menu offers **Copy node**, **Copy subtree**, **Cut subtree** and the matching paste actions. A subtree is a node plus everything below it, so a branch you have tuned can be duplicated in one action.

**Export to Terraform**, in the header of a saved flow, produces the flow as Terraform configuration — useful when a flow is something you would rather review in a pull request than rebuild by hand in another account.

## See what a flow actually did

**Alerting** → **Event flows** → **Event flow logs**, or **View event flow logs** on a single flow. Each entry shows the path an event took, which branch it matched, and — for flows containing a **Wait** node — whether it is currently paused, what it is waiting for, and why it resumed.

Start here when a flow did not do what you expected. It reports what happened, rather than what the canvas suggests should have.

## FAQ

### Can one integration feed several flows?

Not the same integration key. Create another integration key of the same type and attach that one to the second flow.

### What happens if no branch matches?

The event follows the `Else` path. If that path has no **Route to alert source** node, no alert is created.

### Do event flows replace alert sources?

No — they sit in front of them. A flow's job is to choose a destination; the alert source still owns filtering, grouping, templates, priority and escalation once the event lands.

### Can I test a flow before pointing production traffic at it?

Attach the flow's endpoint to a test integration and send events to it, then read the event flow logs. There is no dry-run mode.

### Where do I configure support hours?

**Alerting** → **Support hours**. See [Support hours](/alerting/configure-alerting/support-hours.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.ilert.com/alerting/configure-alerting/event-flows.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
