Queries
Queries are the foundation of your data layer. Each query pulls records from a Pipeline Outcome using SQL, and the result becomes a named data source that any widget on the page can reference. To add a query, open the Data panel from the left sidebar and click+ next to QUERIES.
Writing a Query
Queries use standard SQL syntax. You reference Pipeline Outcome tables by name — the same table names you see in your pipeline configuration. A basic query looks like this:Each query is scoped to the current Experience page. Queries defined on the Dashboard page aren’t automatically available on the Tasks page — create separate queries per page based on what that page needs.
Naming Queries
Give each query a clear, descriptive name — it shows up in the Data binding panel when you’re connecting widgets. A name likeq-tasks-by-status is far easier to work with than query1.
Convention: prefix with q- followed by what the query returns. Examples: q-pending-tasks, q-reviewer-performance, q-activity-feed.
Query Execution
Queries run automatically when a viewer loads the page. They re-run whenever a Filter component on the same page changes its value — so filtering by Status or Date Range automatically refreshes all connected widgets without any extra configuration.Transformers
Transformers sit between a query result and a widget. They’re JavaScript functions that let you reshape, filter, sort, join, or compute new values from raw query output before it reaches a component. To add a Transformer, click+ next to TRANSFORMERS in the Data panel.
A Transformer receives the output of a query as its input and returns a modified result set. For example, to add a computed priority_label column:
Binding Data to Widgets
Once you have a query (and optionally a Transformer), you connect it to a widget using the Data binding panel on the right side of the builder.1
Select a widget
Click any widget on the canvas to select it. The right panel will show three tabs: Properties, Styles, and Data.
2
Open the Data tab
Click the Data icon (the rightmost icon in the right panel icon strip) to open the Data binding panel.
3
Choose your data source
Select the query or transformer result you want to bind to this widget. For a Table, this is the full result set. For a KPI Card, you’ll pick a specific column and aggregation (sum, count, average, first value).
4
Map the fields
For components like Chart, you’ll map specific columns to the x-axis, y-axis, and series fields. For a Filter, you’ll choose the column whose distinct values should appear as filter options.
How Filters Connect to Queries
Filter components on a page automatically apply their selected values to all queries that reference the same column — no manual wiring needed. When a viewer selects “Resolved” in a Status filter, every query on that page that uses thestatus column is updated and re-fetches its results.
For explicit filter-to-query wiring, use query parameters in your SQL:
{{ }} syntax references a Filter component by its name, making the query reactive to whatever value the viewer selects.
How Pipeline Data Flows into Experiences
Experiences don’t connect directly to external systems — they connect to Pipeline Outcomes. A Pipeline Outcome is the structured, pre-processed result of a Data Pipeline that has been associated with this Experience in your Project configuration. When you write a query likeSELECT * FROM tasks, the tasks table is a Pipeline Outcome that your Project has made available to this Experience. The pipeline handles extraction, transformation, and freshness — the Experience just queries the clean result.
This separation keeps Experiences fast and reliable. Instead of triggering live API calls on every page load, the Experience reads from a pre-processed snapshot that the pipeline keeps current on its own schedule.