---
title: "Real-time triggers | Snowplow Signals"
description: "Real-time triggers evaluate conditions over live attributes and deliver the moment one is met, to your app or to Braze, Kafka, webhooks and Pub/Sub."
source: https://signals.snowplow.io/products/real-time-triggers
---

[Product](https://signals.snowplow.io/products) / Real-time triggers 

# A rule that fires the moment it happens.

Real-time triggers watch live attributes continuously. The instant a condition is met, Signals delivers to your app or to the tools you already use to act.

[Start free](https://signals.snowplow.io/start) [Talk to an engineer](https://signals.snowplow.io/start?intent=engineer) 

The real engine · no card · no sales call

Your app → Signals subscribe 

```
// your app, when the page loads
const stream = signals.interventions.subscribe({
  key: { user_id: "u_48213" },
  service: "storefront"
});
stream.on("intervention", apply);
```

Illustrative. Your app holds one live connection. Or skip the app and deliver to Braze, Kafka, a webhook or Pub/Sub.

Signals → your app ● the moment it fires 

```
{
  "trigger": "high_value_basket_idle",
  "key": { "user_id": "u_48213" },
  "attributes": {
    "basket_value": 184.20,
    "basket_idle_seconds": 612
  },
  "fired_at": "2026-09-14T09:51:19.004Z"
}
```

Delivered over server-sent events the page changes while the customer is still on it 

The problem

## The moment passes before anything downstream knows. 

A batch job finds the high-value basket that went idle ten minutes ago tomorrow morning. The third failed search shows up in a dashboard next week. Nothing in the stack pushes the moment it happens, so nothing acts on it.

In Snowplow Console

## A trigger is a rule and a delivery. 

Set the conditions over live attributes, choose who receives it and what data travels with it, and Signals watches from the moment you publish.

![The Snowplow Console showing an active trigger that fires when a basket over $150 is idle for ten minutes.](https://signals.snowplow.io/images/products/console-intervention.webp)

Snowplow Console, shown with example data.

How it works

## Write the condition once. Signals watches. Something happens the instant it is true. 

![A rule that fires when basket_value is over 150 and basket_idle_seconds reaches 600, editable in the Console or in code.](https://signals.snowplow.io/images/products/triggers-step-condition.webp)01 · Condition 

### A rule over live attributes, in the console or in code.

A basket over a threshold idle for ten minutes. A third failed search in a session. Something that did not happen inside a window.

![A new add_to_cart event updates the attributes the rule reads, and each condition is checked as it changes.](https://signals.snowplow.io/images/products/triggers-step-evaluated.webp)02 · Evaluated 

### Every incoming event updates the attributes the rule depends on.

The rule is checked as they change, in the same engine that computes the attributes. No second system to keep in sync.

![The fired high_value_basket_idle trigger is delivered to your app over server-sent events and to Braze, Kafka, a webhook and Pub/Sub.](https://signals.snowplow.io/images/products/triggers-step-delivered.webp)03 · Delivered 

### Into your app over a live connection, or to a tool you already run.

Braze, Kafka, a webhook or Pub/Sub. Signals supplies the moment. You decide what happens next.

Works with 
* Braze
* Kafka
* Pub/Sub

Capabilities

## Rules that fire the moment they are true, delivered where you act. 

![A trigger rule fires when the cart passes $75, and the store shows the shopper free shipping.](https://signals.snowplow.io/images/products/intervention.webp)

![Three events from user u_48213 each update basket_value and basket_idle_seconds, and the high_value_basket_idle rule is checked after each one: not yet at a basket of 153.00, not yet at 184.20, and fired once basket_idle_seconds reaches 612.](https://signals.snowplow.io/images/products/triggers-every-event.webp)

![A timeline where a shopper adds three items to the cart, reaching $184.20, then sends no events for 10 minutes, so basket_idle_seconds reaches 600 and the high_value_basket_idle trigger fires.](https://signals.snowplow.io/images/products/triggers-absence.webp)

![Browser code adds the Signals plugin to the tracker, registers an intervention handler and subscribes, the high_value_basket_idle intervention arrives over an open server-sent events connection, and the shopper's open store page shows a free express shipping offer for their $184.20 cart.](https://signals.snowplow.io/images/products/triggers-in-app.webp)

![The high_value_basket_idle trigger fires for user u_48213 with a basket value of 184.20 and is delivered to your app over server-sent events and to Braze, Kafka, a webhook and Pub/Sub.](https://signals.snowplow.io/images/products/triggers-delivery.webp)

![A draft rule in the Signals Console previewed against warehouse data, showing an illustrative 38 keys that match right now with a sample of matching users, a field to send a test intervention to one key, and a Publish button.](https://signals.snowplow.io/images/products/triggers-replay.webp)

01 

### Conditions over live attributes

Reuse the attributes you already defined. A rule is a threshold, a window and a key, nothing more to keep in sync.

![A trigger rule fires when the cart passes $75, and the store shows the shopper free shipping.](https://signals.snowplow.io/images/products/intervention.webp)

02 

### Evaluated on every event

Each incoming event updates the attributes the rule depends on, and the rule is checked as they change.

![Three events from user u_48213 each update basket_value and basket_idle_seconds, and the high_value_basket_idle rule is checked after each one: not yet at a basket of 153.00, not yet at 184.20, and fired once basket_idle_seconds reaches 612.](https://signals.snowplow.io/images/products/triggers-every-event.webp)

03 

### Fires on absence too

A trigger can fire when something does not happen inside a window, not only when it does.

![A timeline where a shopper adds three items to the cart, reaching $184.20, then sends no events for 10 minutes, so basket_idle_seconds reaches 600 and the high_value_basket_idle trigger fires.](https://signals.snowplow.io/images/products/triggers-absence.webp)

04 

### Delivery into your app

Over server-sent events, so the page can change while the customer is still on it.

![Browser code adds the Signals plugin to the tracker, registers an intervention handler and subscribes, the high_value_basket_idle intervention arrives over an open server-sent events connection, and the shopper's open store page shows a free express shipping offer for their $184.20 cart.](https://signals.snowplow.io/images/products/triggers-in-app.webp)

05 

### Destinations you already own

Braze, Kafka, webhooks and Pub/Sub. Signals supplies the moment. Your existing tools do the acting.

![The high_value_basket_idle trigger fires for user u_48213 with a basket value of 184.20 and is delivered to your app over server-sent events and to Braze, Kafka, a webhook and Pub/Sub.](https://signals.snowplow.io/images/products/triggers-delivery.webp)

06 

### Versioned and testable before you publish

Preview how many keys match a rule against your warehouse data, and send a test to one key, before you publish it. Old versions keep firing until you retire them.

![A draft rule in the Signals Console previewed against warehouse data, showing an illustrative 38 keys that match right now with a sample of matching users, a field to send a test intervention to one key, and a Publish button.](https://signals.snowplow.io/images/products/triggers-replay.webp)

Full reference: [Defining interventions, the in-app delivery →](https://docs.snowplow.io/docs/signals/interventions/) 

## Collect. Define. Serve. 

Add the SDK, define one attribute, and watch it change while you click around your own product. The free tier runs on the real engine: no card, no sales call.

[Start free](https://signals.snowplow.io/start) [Talk to an engineer](https://signals.snowplow.io/start?intent=engineer) 

Next up: [Real-time attributes →](https://signals.snowplow.io/products/real-time-attributes) and [Agentic context →](https://signals.snowplow.io/products/agentic-context).
