Flow Nodes
All available nodes for building data pipelines in the flow editor
The Flow Editor lets you build chart queries by connecting nodes in a pipeline. Drag nodes onto the canvas, configure them, and wire them together. Data flows from top to bottom, starting at a Data Source, passing through transformations, and ending at an Output.
Getting started
- Add a Data Source node to choose which adapter and field to read from
- Connect transformation nodes like Filter, Group By, or Aggregate to shape the data
- Finish with an Output node to produce the chart result
Each node has handles on its top and/or bottom edge. Connect the bottom handle of one node to the top handle of the next to build the pipeline. The colored badge on each node shows its category. Sources, filters, aggregates, groupings, transforms, time operations, and outputs each have their own color.
Nodes
Data Source
The starting point of every pipeline. Choose which dataset to read from and which field to pull out of it.
Adapter: the data provider or dataset (for example, Events or Sessions). This determines which fields you can pick below.
Field: the metric or property to read from the selected adapter.
Dedupe: when checked, counts only the latest row per identity (where the data source supports it). Useful for unique-visitor style queries.
Filter
Keeps rows that match a condition and drops the rest. Pick a field, an operator, and a comparison value. Only matching rows continue down the pipeline.
Field: which upstream field to compare.
Operator: how to compare. Available options:
equals,not equals,contains,matches regex,does not match regex,greater than,less than,greater or equal,less or equal.Value: what to compare against. Becomes a true/false dropdown when filtering a boolean field.
Map target: only shown for map fields. Choose whether to filter on the map’s keys or its values.
Aggregate
Reduces multiple rows into one computed value per group. Usually placed after a Group By or Time Group node.
Function: how values inside each group are combined:
count: number of rows in the groupsum: adds numeric valuesavg: average of numeric valuesmedian: middle numeric valuepercentile: the value a chosen share of numeric values are at or below (see Percentile)min: smallest numeric valuemax: largest numeric valuedistinct: count of unique values
Text and boolean fields only offer
countanddistinct.Per: measure the function once per user, session, or server first, instead of over all rows (see Per). Only shown when the data source supports it.
Percentile
A percentile tells you the value that a given share of values are at or below. For a page load time, the 95th percentile (p95) is the time 95% of page loads were faster than or equal to. Unlike an average, a percentile isn’t pulled up by a few extreme values, and a high percentile shows what your slowest users experience.
Choose percentile as the function, then type the level into the p field next to it:
- The level starts at
95 - Any level above 0 and below 100 works, with up to two decimals, for example
75,99.9, or99.99 - Text that isn’t a valid level is discarded when you leave the field
Common levels:
| Level | Use it for |
|---|---|
p50 | The typical value. Same as median. |
p75 | What most users experience. Core Web Vitals are judged at p75, like the Web Vitals page. |
p90, p95 | The slow end that a sizable share of users still hits |
p99 | Outliers and worst cases. Needs plenty of values to be stable. |
Percentiles, like median, are estimated from a sample of each group’s values. Small groups are exact. In large groups the result can shift slightly between refreshes.
For example, to chart the p75 Largest Contentful Paint of each page:
- Data Source: Web Vitals, field Value
- Filter: Metric equals
LCP - Group By: URL
- Aggregate:
percentile,p75
In Easy mode, the Measure picker offers Median and the 90th, 95th, and 99th percentile. Switch to the canvas to use any other level.
Per user, session, or server
By default an aggregate combines every row in each group. Set Per to measure the function once per user, session, or server first, then add a second Aggregate node to combine those values.
For example, to see how many events your heaviest users trigger:
- Aggregate:
count, peruser. This gives the number of events for each user. - Aggregate:
percentile,p90. This gives the event count that 90% of users stay at or below.
Use avg in the second node for the average user instead, or a Filter followed by count for the number of users who did something at least N times.
Which options are offered depends on the data source:
| Data source | Per |
|---|---|
| Web Events, Errors, LLM Traces, Feature Flags | user, session |
| Web Vitals | session |
| Mod Events | server |
| Downloads | Not available |
Group By
Groups rows by one or more categorical fields. Usually paired with an Aggregate node to compute per-group metrics (for example, page views grouped by browser).
Fields: the grouping dimensions. Rows that share the same values across these fields end up in the same group. Add as many as you need.
Multi-field mode: only shown when more than one field is selected.
combined: joins field values into a single composite key (for example,Chrome / Germanyas one group).flat: keeps each field as its own dimension so the chart can break down by either axis.
Time Group
Groups rows into time-based buckets. This is the foundation of every time-series chart.
Bucket size: the interval each row rolls into:
Auto,Minute,Hour,Day,Week,Month.Autopicks a sensible size based on the chart’s time range.Missing buckets: what to do when a time period has no data:
Zero: insert a zero value so the line stays continuous.None: leave the gap empty and the series breaks.
Cumulative: carry each bucket’s value into every later bucket. Use this for running totals, such as total users or downloads so far.
Text Transform
Rewrites string values before they are grouped, filtered, or displayed. Useful for normalizing inconsistent text (for example, casing) or extracting derived labels.
Operation: which transformation to apply:
lowercase/uppercase/title case: change casingtrim: strip leading and trailing whitespaceappend: add a fixed string to the end of each valuereplace text: find an exact string and replace itreplace regex: match a regular expression and substitute (use\1,\2, and so on for capture groups)length: replace each value with its character count
Text to append: only for
append. The string added to every value.Find / Pattern and Replace with: only for
replace textandreplace regex. Leave the replacement empty to delete matches.
Formula
Computes a derived numeric value from a custom expression. Each input
connection to the Formula node gets a letter (A,
B, C, and so on) in the order it was connected.
Use those letters as variables in the expression.
Expression: the formula to evaluate, for example
A + B,A / B * 100, or(A + B) / C.Output name: name of the resulting field. Downstream nodes and the chart legend use this label.
Precision: number of decimal places to round the result to. Leave empty to keep full precision.
Limit
Caps the number of rows that flow through. Most useful after a Group By when you only want the top N groups in a chart.
Max rows: the maximum number of rows to keep.
Group rows over limit as Other: instead of dropping rows beyond the limit, fold them into a single
Otherbucket so totals still match.
Max Age
Limits the pipeline to events within a rolling window relative to now. Combine with Min Age to look at a slice between two points in the past.
Look back at most: the size of the window. Pick a number and a unit:
ms,seconds,minutes,hours,days.
Min Age
Drops events that are too recent. Useful for excluding the live tail of data that has not fully settled yet, or for comparing past periods.
Exclude newer than: events within this window before the current time are removed. Uses the same units as Max Age.
Output
The final node in every pipeline. This is what produces the chart result. See Output & Multi-Series for how multiple Output nodes combine into tabs, multi-line charts, or stacked bars.
Output name (or Tab name on list charts): label shown in the chart legend or as the tab header.
Icon set: only on list charts. Optional icons shown next to each row.
Nest by: only on list and pie charts. Splits each row into a nested hierarchy, either by another data field or by a custom delimiter.
Delimiter: only when nesting by a custom pattern. The character or string used to split values (for example,
/to split a URL path).
Final query result for this chart