Core Signals components and concepts
Signals introduces a new set of data governance concepts to Snowplow. As with schemas for Snowplow event data, Signals components are strictly defined, structured, and versioned.
Signals has three main configurable components:
- Attribute groups, for defining and calculating attributes
- Services, for consuming calculated attributes in your applications
- Interventions, for consuming calculated attributes and triggering actions in your applications
Attribute groups are where you define the behavioral data you want to calculate. Each attribute group contains multiple attributes - the specific facts about user behavior you want to measure or take action on - along with the configuration that defines how to calculate them, and from what data. Attributes can only be defined within attribute groups; they are effectively properties of the attribute group.
To use attributes to trigger actions such as in-app messages, discounts, or personalized journeys, use services or interventions.
Services provide a stable interface layer between your calculated attributes and your applications. Each service can contain multiple attribute groups, pinned to specific versions. You'd build the logic within your application for how to use the retrieved attributes. Interventions are a separate abstraction for defining when to trigger actions in your application.

Attribute groups
Attribute groups are where you define the data you want to calculate. Each attribute group is a versioned collection that specifies:
- The attributes to calculate - the specific behavioral facts about users
- The data source - whether to calculate from the real-time stream, or in batch from the warehouse
- The attribute key that provides the analytical context
- Other metadata such as description or owner
Types of attribute
Attributes describe what kind of calculation to perform, and what event data to evaluate. They can only exist within attribute groups.
Attributes can be categorized into four main types, depending on the type of user behavior you want to understand:
| Type | Description | Example |
|---|---|---|
| Time windowed | Actions that happened within the last X period of time | products_added_to_cart_last_10_min |
| Lifetime | Calculated over all the available data | total_product_price_clv |
| First touch | The first event or property that happened | first_mkt_source |
| Last touch | The most recent event or property that happened | last_device_class |
Signals includes a range of different aggregations for calculating attributes, including mean, counter, or unique_list. See the full list in the attribute configuration page.
Attribute keys
An attribute key is an identifier that provides the analytical context for all attribute calculations within a group. The identifier can be any atomic field of a Snowplow event, such as domain_userid.
To demonstrate the necessity of attribute keys, consider the attribute num_views_in_last_10_min. It represents a count of page view events, with a 10 minute time limit. This table lists some possible meanings of the attribute, based on the attribute key configured for its attribute group:
| Attribute | Attribute key | Description |
|---|---|---|
num_views_in_last_10_min | User | How many pages a user has viewed within the last 10 minutes |
num_views_in_last_10_min | Page | How many page views a page has received within the last 10 minutes |
num_views_in_last_10_min | Product | How many times a product has been viewed within the last 10 minutes |
num_views_in_last_10_min | App | How many page views occurred within an app in the last 10 minutes |
num_views_in_last_10_min | Device | How many page views came from a specific device in the last 10 minutes |
num_views_in_last_10_min | Marketing campaign | How many page views were generated by a campaign in the last 10 minutes |
num_views_in_last_10_min | Geographic region | How many page views came from users in one region within the last 10 minutes |
num_views_in_last_10_min | Customer segment | How many page views were generated by users in a segment within the last 10 minutes |
Each of these is likely to have a different calculated value.
You can define your own attribute keys, or use the built-in ones. Signals comes with predefined attribute keys for user, device, and session. Their identifiers are from the out-of-the-box atomic user-related fields in all Snowplow events.
| Attribute key | Type |
|---|---|
user_id | string |
domain_userid | uuid |
network_userid | uuid |
domain_sessionid | uuid |
Data sources
Whether to compute attributes in real-time from the event stream or in batch from the warehouse is an important decision. Broadly, you might use:
- Stream for real-time use cases, such as tracking the latest product a user viewed, or the number of page views in a session
- Batch sources (warehouse tables) for historical analysis, such as calculating a user's purchase history or average session length
This table summarizes the options for different types of processing:
| Feature | Supported in real-time stream | Supported in batch |
|---|---|---|
| Real-time calculation | ✅ | ❌ |
| Time windowing operations | ✅ | ✅ |
| Computing user lifetime attributes | ✅ from the point at which the attribute was defined | ✅ |
| Reprocessing data | ❌ attributes are only calculated from the moment they are defined | ✅ |
| Non-Snowplow data | ❌ | ✅ using external batch source |
Stream source
When Signals is deployed in your pipeline, the event stream is read by the streaming engine. All tracked events are inspected.
Real-time stream flow:
- Behavioral data event is received by Collector
- Event is enriched by Enrich
- The Signals stream engine reads from the events stream
- The stream engine checks if attributes are defined for the event
- Are there any attributes to calculate?
- No: nothing happens, and the process ends
- Yes: processing continues
- Signals evaluates and computes the attributes
- Updated attributes are pushed to the Profiles Store
Batch source
The batch data source uses dbt to generate and calculate new tables of attributes from your Snowplow atomic events table. Signals then syncs them to the Profiles Store periodically using the sync engine.
Batch flow:
- Behavioral data events arrive in the warehouse
- Signals compares timestamps to check for new rows in the atomic events table
- Are there any new rows?
- No: nothing happens
- Yes: processing continues
- Signals runs dbt models to update the attribute tables
- Updated tables are synced to the Profiles Store
External batch source
Use an external batch source to sync tables of existing, pre-calculated values to the Profiles Store. The external batch tables can be any data. For example, you may want to include transactional data in your Signals use case.
Services
Services are where you define how to use the calculated attributes in your applications.
Rather than connecting applications directly to attribute groups, services allow you to consume specific attribute group versions. This provides a consistent set of consumable attributes. We strongly recommend using services in production applications.
By using services you can:
- Iterate on attribute definitions without worrying about breaking downstream processes
- Migrate to new attribute group versions by updating the service definition, without having to update the application code
Interventions
Interventions are opportunities to take actions to improve user outcomes. They're automated triggers fired by changes in attribute values, or by your own applications.
They can be thought of as "if-then" rules that run in real time. For example:
Ifa user has viewed five products in the last ten minutesThenautomatically send that user a personalized offer
In practice, this rule could work like this:
- User views product pages
- The application tracks the user behavior and sends events
- Signals evaluates the events and updates attribute values
- Signals checks whether the new attribute values meet any intervention conditions
- The attribute
product_view_count_last_10_minhas just been updated to5, matching the intervention's trigger criteria - The application receives the subscribed intervention payload
- The application sends a personalized offer to the user
Interventions are usually relevant only within a certain moment. Therefore, an intervention is sent only the first time the criteria are met.
Standard rule-based interventions can have multiple conditions, or trigger criteria, based on the values of different attributes.