Event triggers
Event triggers are the most common type of trigger. They are intended to react to the presence or absence of an event. Event triggers are indicated with{"type": "event"}.

Resource matching
Both theevent and metric triggers support matching events for specific resources in your workspace, including most
Prefect objects (like flows, deployment, blocks, work pools, tags) as well as resources you have defined in any
events you emit yourself.
The match and match_related fields control which events a trigger considers for evaluation
by filtering on the contents of their resource and related fields, respectively. Each label added to a match filter
is ANDed with the other labels, and can accept a single value or a list of multiple values that are ORed together.
Example
See theresource and related fields on the following prefect.flow-run.Completed event, truncated for this example.
Its primary resource is a flow run, and since that flow run was started by a deployment, it is related to both its flow and its deployment:
cute- or radical-.
prefect.flow-run.Completed event, but will permit additional,
possibly undesired events through the filter as well. You can combine match and match_related for more restrictive
filtering:
cute- or radical-.
Advanced matching for related resources
match_related also supports an array of objects, each of which can contain multiple labels.
This allows for more complex matching on related resources, such as filtering for events that are related to a specific work pool or tag.
To match flow runs on a work pool with specific tags, you can use the following configuration:
DeploymentEventTrigger:
Negative matching
Use the! prefix to exclude resources with specific label values. A negative pattern matches
any value that does not match the rest of the pattern.
Two rules govern how negative patterns interact with the rest of a filter:
- Values in a list are
ORed together, so a negative pattern cannot be combined with a positive pattern in the same list. In["dev-*", "!dev-automations"], any name matchingdev-*satisfies the first pattern and the negative pattern is never applied. To scope with a wildcard and exclude a value, use a list ofmatch_relatedobjects (see below). - A
match_relatedobject matches when any single related resource satisfies all of its labels. Exclusions are therefore only reliable for roles where an event has exactly one related resource, such aswork-poolordeployment. For roles with many resources per event, such astag,{"prefect.resource.id": "!prefect.tag.dev", "prefect.resource.role": "tag"}matches any event with at least one tag other thandev— it does not exclude events that carry thedevtag alongside other tags.
dev-automations-work-pool:
dev-* work pools while still excluding that one, use two
match_related objects — each object must match independently:
dev-, except
dev-automations-work-pool. This pattern is especially useful when an automation starts flow
runs of its own: excluding the work pool those runs execute on prevents the automation from
triggering on itself.
Expected events
Once an event has passed through thematch filters, you must decide if this event counts toward the
trigger’s threshold. That is determined by the event names present in expect.
This configuration informs the trigger to evaluate only prefect.flow-run.Completed events that have passed the
match filters.
threshold decides the quantity of expected events needed to satisfy the trigger. Increasing the threshold
above 1 requires use of within to define a range of time when multiple events are seen. The following
configuration expects two occurrences of prefect.flow-run.Completed within 60 seconds:
after to handle scenarios that require more complex event reactivity.
For example, this flow emits an event indicating the table it operates on is missing or empty:
after to prevent this automation from firing unless either a table-missing or a
table-empty event has occurred before a flow run of this deployment completes.
Evaluation strategy
All of the previous examples were designed around a reactiveposture; that is, count up events toward the
threshold until it is met, then execute actions. To respond to the absence of events, use a proactive posture.
A proactive trigger fires when its threshold has not been met by the end of the window of time defined by within.
Proactive triggers must have a within value of at least 10 seconds.
The following trigger fires if a prefect.flow-run.Completed event is not seen within 60 seconds after a
prefect.flow-run.Running event is seen:
for_each, a prefect.flow-run.Completed event from a different flow run than the one that
started this trigger with its prefect.flow-run.Running event could satisfy the condition. Adding a for_each of
prefect.resource.id causes this trigger to be evaluated separately for each flow run id associated with these events.
Event ordering and after
A trigger with an after clause starts watching for its expect events only once one of
its after events has arrived. An expect event that arrives at the system before the
trigger’s after event does not count, even when the two events were emitted in the
correct order. For a Reactive trigger this can mean a missed firing; for a Proactive
trigger it can mean a spurious one.
Prefect does not guarantee the order that unrelated events arrive at the system: events
that occur within a second or two of each other may arrive in either order. When your
code emits the expect event immediately after the after event—for example, from a
state change hook
or right after emitting the first event—declare the relationship with
follows on the later event.
Triggers hold an event that declares follows until the event it follows has arrived, so
the pair is always processed in order and the race disappears. If the followed event
never arrives, the held event is processed on its own after several minutes—a lost
predecessor delays the follower rather than losing it.
Events that are naturally separated by more time—like an order.created and an
order.complete minutes apart—don’t strictly need follows, but it can still be good
practice to set it to document the relationship between the events.
Metric triggers
Metric triggers ({"type": "metric"}) fire when the value of a metric in your workspace crosses a threshold you defined.
For example, you can trigger an automation when the success rate of flows in your workspace drops below 95% over the course
of an hour.
Prefect’s metrics are all derived by examining your workspace’s events, and if applicable, use the occurred times of
those events as the basis for their calculations.
Prefect defines three metrics:
- Successes (
{"name": "successes"}), defined as the number of flow runs that wentPendingand then the latest state we saw was not a failure (FailedorCrashed). This metric accounts for retries if the ultimate state was successful. - Duration (
{"name": "duration"}), defined as the length of time that a flow remains in aRunningstate before transitioning to a terminal state such asCompleted,Failed, orCrashed. Because this time is derived in terms of flow run state change events, it may be greater than the runtime of your function. - Lateness (
{"name": "lateness"}), defined as the length of time that aScheduledflow remains in aLatestate before transitioning to aRunningand/orCrashedstate. Only flow runs that the system marksLateare included.
And the
MetricTriggerQuery query is defined as:
For example, to fire when flow runs tagged
production in your workspace have been failing at a rate of 10% or worse (in other words, a success rate below 90%) over the last hour, sustained for at least five minutes, create this trigger:
kubernetes) in the
last day exceeds five minutes late—and that number hasn’t gotten better for the last 10 minutes—use a trigger like this:
Composite triggers
To create a trigger from multiple kinds of events and metrics, use acompound or sequence trigger.
These higher-order triggers are composed from a set of underlying event and metric triggers.
For example, if you want to run a deployment only after three different flows in your workspace have written their
results to a remote filesystem, combine them with a ‘compound’ trigger:
sequence trigger,
its first child trigger expects a Completed event, and its second child trigger is the compound trigger from the
prior example:
daily-export-initiator flow complete, and then the three
files written by the other flows.
The within parameter for compound and sequence triggers restricts how close in time (in seconds) the child triggers
must fire to satisfy the composite trigger. For example, if the daily-export-initiator flow runs, but the other three
flows don’t write their result files until three hours later, this trigger won’t fire. Placing these time constraints
on the triggers can prevent a misfire if you know that the events will generally happen within a specific timeframe—
and you don’t want a stray older event included in the evaluation of the trigger.
If this isn’t a concern for you, you may set within to null, in which case there is no limit to how far apart in
time the child triggers occur. The within key itself is required on compound and sequence triggers — leaving it out
entirely is a validation error.
You can compose any type of trigger into higher-order composite triggers, including proactive event triggers and metric
triggers. In the following example, the compound trigger fires if any of the following events occur: a flow run
stuck in Pending, a work pool becoming unready, or the average amount of Late work in your workspace going over
10 minutes:
require parameter may be "any", "all", or a number between 1 and the number of child
triggers. In the example above, if you feel that you are receiving too many spurious notifications for issues that
resolve on their own, you can specify {"require": 2} to express that any two of the triggers must fire in order
for the compound trigger to fire. Sequence triggers, on the other hand, always require all of their child triggers to
fire before they fire.
Compound triggers are defined as:
Sequence triggers are defined as: