Skip to main content

Fields Builder

What it does

The Fields Builder turns your raw event history into ready-to-use per-customer metrics. It automatically aggregates behavioural data — purchases, sessions, page views, form submissions — and produces a clean summary table with one row per customer and one column per metric you define.

These metrics are then available throughout BPP as filter fields when building audiences and as value inputs when configuring signals.

Examples of what you can compute:

  • Total number of orders in the last 90 days.
  • Average order value over the last year.
  • Whether a user has ever completed a purchase (yes/no).
  • Most recent product category browsed.
  • Time between a user's first and last event.

Why it matters for marketers

Without pre-computed fields, you could only filter audiences on static user attributes (e.g., country, plan type). With Fields Builder, you can filter on what users have actually done — making your audience segments far more precise.

Examples of audiences you can build once fields are set up:

  • "Users who placed 3 or more orders in the last 6 months" → loyalty targeting.
  • "Users with average order value above €150" → premium up-sell audience.
  • "Users who visited the pricing page but never purchased" → high-intent remarketing.
  • "Users whose predicted LTV is above €500" (combined with AI models).

You can also use field values in your conversion signals — for example, sending a user's total lifetime revenue as the conversion value, rather than a fixed number.


How to define a field

Navigate to the Fields Builder section in BPP and click Add Aggregated Field.

For each field, you define:

SettingWhat it means
NameWhat this metric will be called in the filter builder (e.g., "Total Orders"). Must be unique within your workspace.
DescriptionA short explanation of what this field measures. Required.
Source tableWhich event table to aggregate from (e.g., your orders table or pageview table). Must be an event-type table.
Field to aggregateWhich column in that table to compute (e.g., order value, or count all rows). Use * to count all rows with COUNT.
Aggregation typeHow to compute the metric — see the table below. Available options depend on the data type of the selected field.
Filters (optional)Restrict which rows are included (e.g., only include orders with status = "completed").

Once defined, set the field to Ready and BPP will compute it automatically on the next daily run.

Template fields: BPP includes a library of pre-built template fields (common metrics like total orders, average order value, days since last purchase). You can use these as a starting point — copy a template to your workspace and adjust it to match your data tables and field names.


Aggregation types

BPP supports 11 aggregation types, split into two groups: metrics (numeric outputs) and dimensions (categorical or boolean outputs).

Field type compatibility: Not all aggregations are available for every field. BPP automatically shows only the aggregations that are valid for the data type of your selected field. For example, SUM and AVG are only available on numeric fields; EVENTTIMEDIFF is only available on date/timestamp fields.

Numeric aggregations

Use these when you want to measure how much, how many, or how big.

COUNT — how many times

Counts the number of events per user. Use * as the field to count all rows, or a specific field to count non-null values.

  • Output type: whole number
  • Typical use: total number of orders, total sessions, total page views
  • Example field: "Total orders in the last 90 days" → COUNT(*) on your orders table with a date filter

COUNT_UNIQUE — how many distinct values

Counts the number of unique values of a field per user.

  • Output type: whole number
  • Typical use: number of distinct products purchased, number of different categories browsed
  • Example field: "Unique products purchased" → COUNT_UNIQUE(product_id) on your orders table

SUM — total value

Adds up all values of a numeric field per user.

  • Output type: number (integer or decimal)
  • Requires: a numeric field (e.g., revenue, quantity, points)
  • Typical use: total revenue, total quantity purchased, total ad clicks
  • Example field: "Total spend last 12 months" → SUM(order_value) on your orders table

AVG — average value

Calculates the mean value of a numeric field per user.

  • Output type: decimal number
  • Requires: a numeric field
  • Typical use: average order value, average session duration
  • Example field: "Average order value" → AVG(order_value) on your orders table

MIN — lowest value

Returns the smallest value of a field across all of a user's events.

  • Output type: same type as the source field (number or date)
  • Typical use: cheapest order ever placed, earliest event date, lowest score
  • Example field: "Cheapest order ever" → MIN(order_value) on your orders table

MAX — highest value

Returns the largest value of a field across all of a user's events.

  • Output type: same type as the source field (number or date)
  • Typical use: most expensive purchase, most recent event date, highest score
  • Example field: "Highest single order value" → MAX(order_value) on your orders table

Dimensional aggregations

Use these when you want to know what, when, or whether.

FIRST — earliest recorded value

Returns the value of a field from the chronologically first event per user (ordered by event_date ascending).

  • Output type: same type as the source field (text, number, date)
  • Typical use: first product category purchased, first acquisition channel, first country
  • Example field: "First product category bought" → FIRST(category) on your orders table

Useful for understanding customer acquisition — what did users buy first, where did they come from?

LAST — most recent value

Returns the value of a field from the most recent event per user (ordered by event_date descending).

  • Output type: same type as the source field
  • Typical use: last product browsed, most recent session source, latest subscription plan
  • Example field: "Last category browsed" → LAST(category) on your pageview table

Useful for intent signals — what is the user interested in right now?

MODE — most frequent value

Returns the value that appears most often across a user's events. If multiple values tie, one is returned (approximate).

  • Output type: same type as the source field (usually text)
  • Typical use: favourite product category, most-used device, preferred payment method
  • Example field: "Favourite category" → MODE(category) on your orders table

Use this when you want to know a user's habitual preference, not their most recent one.

BOOLEAN_EXISTS — yes or no

Returns true if a user has at least one event matching the condition, and false otherwise. Think of it as "did this ever happen?".

There are two ways to use it:

  • On a boolean field: the field returns true if the field was ever true for that user (e.g., is_converted = true).
  • With a filter condition: the field returns true if any event matches the condition (e.g., event_type = "purchase"). This is the most common usage.
SettingExample
Source fieldAny field, or use a condition
Filterevent_type = "purchase"
Outputtrue / false
  • Typical use: has the user ever purchased? has the user seen the pricing page? is the user a loyalty member?
  • Example field: "Has purchased" → BOOLEAN_EXISTS on your events table with filter event_type = "purchase"

This is ideal for yes/no audience splits — for example, "re-engage users who browsed but never purchased".

EVENTTIMEDIFF — time between two events

Measures the elapsed time between two specific event types per user. You define a "first event" and a "second event", and BPP calculates how much time passed between them.

  • Output type: number (in the time unit you choose)
  • Time units: seconds, minutes, hours, or days
  • Typical use: time from first visit to first purchase, time from lead form submission to deal close, time from trial start to upgrade

Configuration:

SettingWhat to enter
First eventA filter condition identifying the starting event (e.g., event_type = "trial_start")
Second eventA filter condition identifying the ending event (e.g., event_type = "upgrade")
Timestamp fieldThe date/time column to measure from (usually event_date). Must be a DATE, DATETIME, or TIMESTAMP field.
Time unitDAYS, HOURS, MINUTES, or SECONDS

BPP uses the most recent occurrence of the second event and the closest preceding first event to calculate the time difference. Users who have not performed both events receive a blank value.

  • Example field: "Days from first visit to first purchase" → EVENTTIMEDIFF with event_type = "pageview" as first event and event_type = "purchase" as second event, unit DAYS

Use this to segment users by their conversion speed — fast converters vs long consideration cycles — and tailor your ad messaging accordingly.


Quick reference

AggregationOutputWorks onBest for
COUNTNumberAny field or *How many times something happened
COUNT_UNIQUENumberAny fieldHow many distinct things
SUMNumberNumeric fieldsTotal revenue, total quantity
AVGDecimalNumeric fieldsAverage order value, average score
MINNumber / DateAny fieldCheapest, earliest
MAXNumber / DateAny fieldMost expensive, most recent
FIRSTAnyAny fieldWhat happened first
LASTAnyAny fieldWhat happened most recently
MODEAnyAny fieldMost frequent value
BOOLEAN_EXISTSTrue / FalseBoolean or conditionDid it ever happen?
EVENTTIMEDIFFNumberTimestamp fieldTime between two events

Filtering which events to include

You can narrow which rows are counted by adding filter conditions to a field. For example:

  • Count only orders where status = completed (exclude cancelled orders).
  • Sum revenue only for category IN (electronics, appliances).
  • Count sessions where device_category = mobile.

Filters support AND and OR logic, so you can build precise definitions.


Field status

StatusWhat it means
DraftDefined but not yet active. BPP won't compute it yet.
ReadyEnabled. Will be computed on the next daily run.
RunningCurrently being computed.
CompleteSuccessfully computed. Available as a filter in audiences and signals.
Partial CompleteComputation completed but some users could not be processed. The field is still available with partial data.
ErrorSomething went wrong. Check that the source table and field names are correct.
SuspendedTemporarily paused.

How fields appear in audiences and signals

Once a field is in Complete (or Partial Complete) status, it appears automatically in the field picker when you build an audience filter or configure a signal value formula.

For audiences, you will see it as a filterable condition — for example, "Total Orders is greater than 5".

For signals, you can use it as the conversion value — for example, 1 * TotalRevenue to send a user's total revenue as the signal value.

Visibility: Each field has a Visibility toggle. If you turn visibility off, the field will no longer appear in the audience and signal builders, even if it is in Complete status. This is useful to hide experimental or deprecated fields without deleting them.


Adding a new field — step by step

  1. Go to Fields Builder in the left sidebar.
  2. Click Add Aggregated Field.
  3. Enter a name, select the source event table, and choose the field and aggregation type.
  4. Optionally add filters to restrict which rows are included.
  5. Click Save.
  6. Set the status to Ready.
  7. The field will be computed on the next daily run and will appear in audience and signal builders once it completes.

Troubleshooting

SymptomWhat to check
Field stuck in ErrorVerify the source table name and field name are correct and that the table has data.
Field shows NULL for most usersThe filter conditions may be too restrictive, or most users have no matching events. Relax the filters and check.
Field not appearing in the audience builderMake sure it has reached Complete or Partial Complete status. Also check that the Visibility toggle is on — hidden fields do not appear in the filter builder.
Aggregation type not available for my fieldSome aggregation types are only available for specific field types. SUM and AVG require a numeric field; EVENTTIMEDIFF requires a date or timestamp field. Select a compatible field or change your aggregation type.