Skip to main content

Define attributes

Attributes are defined as part of attribute groups. To create an attribute, you'll need to set:

  • A name that describes the attribute
  • Which event schema or event specification to calculate it from
  • What property in the schema to consider for the calculation
  • What kind of aggregation you want to calculate over time, e.g. mean or last

Attribute calculation starts when the definitions are published, and values are not backdated.

Configure the attribute

Every attribute needs events to calculate from, and an aggregation to calculate. Most aggregations also operate on a property of those events. The time period and criteria settings are optional refinements.

In Console, open your attribute group and use the attribute configuration interface to fill in the fields. The time period and criteria settings are within More options.

Attribute configuration interface showing name, event filter, and aggregation options

With the Python SDK, these settings are arguments to the Attribute class, listed in all attribute options.

Select events

Use the event filter to choose which event type to calculate the attribute from.

Event filter dropdown showing available event specifications, Snowplow, and custom event schemas

Click the dropdown to see the available events, listed by name and vendor:

  • Event Specifications: select any event specification from an existing tracking plan.
  • Snowplow events: select any built-in Snowplow or Iglu Central schema. For legacy reasons, to calculate an attribute from structured events find event (com.google.analytics.measurement-protocol).
  • Custom events: select any schema or data structure available within your pipeline.
Searching for events

The search finds direct matches only, so use the exact name of the event, schema, or vendor.

Once you've selected an event and version, click Confirm to add the attribute to your attribute group.

Choose an aggregation

Signals supports the following aggregation types:

AggregationDescriptionRequired property type in schema
CounterCount eventsNo property used for this aggregation
SumSum of property valuesNumeric
MinMinimum property valueNumeric
MaxMaximum property valueNumeric
MeanAverage of property valuesNumeric
FirstFirst property value seenString, Numeric, Boolean
LastLast property value seenString, Numeric, Boolean
Most FrequentMost frequent property value seenString, Numeric, Boolean
Least FrequentLeast frequent property value seenString, Numeric, Boolean
Approx Count DistinctApproximate distinct count (HyperLogLog)String, Numeric, Boolean
Category CountDictionary of unique values and their countsString, Numeric, Boolean
Unique ListList of unique property valuesString, Numeric, Boolean

A property isn't used for counter aggregation. To only count events with a specific property value, use a criteria filter.

Select the aggregation type from the dropdown in the attribute configuration interface.

Select a property

You can calculate attributes based on properties in any part of your events:

  • Atomic properties: available for all events
  • Event schema properties: properties within your chosen event
  • Entity properties: properties from schemas tracked as entities with your chosen event

Property selection interface with atomic, event schema, and entity property tabs

Click Confirm to specify the property for this attribute.

Set a time period

Add an optional time period to aggregate over a rolling window. Signals won't include events older than the specified time period in the calculation.

Find the time period option within More options. Click Done to save it.

Time period configuration dialog for setting rolling window attributes

Filter with criteria

Use criteria to filter the events used to calculate an attribute. They allow you to be specific about which subsets of events should trigger attribute updates. For example, instead of counting all page views in a user's session, you may wish to calculate only views for the homepage, or a login page.

Find the criteria option within More options.

Defining criteria has three steps:

  1. Select which property to filter on, similarly to the property selection for the attribute
  2. Choose which logical operator to use
  3. Enter the value to filter on

If you enter multiple criteria, you will have the option to require all or any of them to be met for the attribute to update.

Criteria filter configuration with property selection, operator, and value fields

Click Done to save the criteria when you're finished.

All attribute options

The table below lists all available arguments for a Python SDK Attribute. The same options are available in the Console attribute configuration interface.

ArgumentDescriptionTypeRequired?
nameThe name of the attributestring
descriptionThe description of the attributestring
eventsList of Snowplow Events to calculate the attribute fromlist of Event
aggregationThe calculation to performone of: counter, sum, min, max, mean, first, last, most_frequent, least_frequent, approx_count_distinct, category_count, unique_list
typeThe type of the aggregation resultone of: bytes, string, int32, int64, double, float, bool, dict, unix_timestamp, bytes_list, string_list, int32_list, int64_list, double_list, float_list, bool_list, unix_timestamp_list
criteriaFilters to apply to eventsCriteria
propertyThe property of the event or entity to use in the aggregationstring
periodThe time window over which to calculate the aggregationtimedelta
default_valueDefault value if aggregation returns no results

Examples

The following examples show complete attribute configurations, using the Python SDK.

Minimal example

This is the minimum configuration needed to create an attribute:

python
from snowplow_signals import Attribute, Event

my_attribute = Attribute(
name="button_click_counter",
type="int32",
events=[
Event(
vendor="com.snowplowanalytics.snowplow",
name="button_click",
version="1-0-0",
)
],
aggregation="counter"
)

Once applied and active, this definition triggers every time Signals processes an event with the schema iglu:com.snowplowanalytics.snowplow/button_click/jsonschema/1-0-0. The stored attribute starts at 0 and increases by 1 with every button_click event.

Filtered counter with a time window

Count button_click events only where the button id is generate_emoji_btn, over a rolling 10-minute window.

python
from snowplow_signals import Attribute, Event, Criteria, Criterion, EventProperty
from datetime import timedelta

button_click_counter_attribute = Attribute(
name="emoji_button_click_counter",
description="The number of clicks for the 'generate emoji' button",
type="int32",
events=[
Event(
vendor="com.snowplowanalytics.snowplow",
name="button_click",
version="1-0-0",
)
],
aggregation="counter",
criteria=Criteria(
all=[
Criterion.eq(
EventProperty(
vendor="com.snowplowanalytics.snowplow",
name="button_click",
major_version=1,
path="id"
),
"generate_emoji_btn"
)
]
),
period=timedelta(minutes=10),
default_value=0
)

Last atomic property value

Track the most recent referrer source using the mkt_medium atomic property, calculated from either a page view or a custom event.

python
from snowplow_signals import Attribute, Event, AtomicProperty

referrer_source_attribute = Attribute(
name="referrer_source",
description="Referrer",
type="string",
events=[
Event(name="page_view", vendor="com.snowplowanalytics.snowplow", version="1-0-0"),
Event(name="login_landing", vendor="com.business.example", version="1-0-0"),
],
aggregation="last",
property=AtomicProperty(name="mkt_medium"),
)

Sum of an entity property

Sum the price of product entities in ecommerce events, counting only transaction events.

python
from snowplow_signals import Attribute, Event, Criteria, Criterion, EntityProperty, EventProperty

my_new_attribute = Attribute(
name="products_total_purchase_value",
description="Total purchase value for all products",
type="double",
events=[
Event(
vendor="com.snowplowanalytics.snowplow.ecommerce",
name="snowplow_ecommerce_action",
version="1-0-2",
)
],
aggregation="sum",
criteria=Criteria(
all=[
Criterion.eq(
EventProperty(
vendor="com.snowplowanalytics.snowplow.ecommerce",
name="snowplow_ecommerce_action",
major_version=1,
path="type"
),
"transaction"
)
]
),
property=EntityProperty(
vendor="com.snowplowanalytics.snowplow.ecommerce",
name="product",
major_version=1,
path="price",
),
default_value=0
)