Metrics

Configuring Metrics

Complete reference for every section of the metric editor — from aggregation and time windows to notification templates, access control, and everything in between.

Editor layout

The metric editor is a side sheet with six accordion sections that correspond to the setup journey:

DatasetMetric BuilderScheduleGeneralNotificationSummary
Note
Metric name and Status live in the dialog header, not inside any accordion section. Name is an inline text editor at the top; Status is controlled by a selector just below it.

Metric name and status

Give your metric a clear, descriptive name — it appears in Slack alerts, the metrics list, and the notification template via {{ metric_name }}.

The status controls whether the metric is actively monitored. You can change it at any time:

StatusMeaning
DraftDefault for new metrics. The metric is not monitored. Use this to configure before going live.
LiveActively monitored on schedule. Alerts fire when thresholds are breached.
PausedMonitoring suspended. Configuration is preserved. Resume when ready.
InvalidThe metric definition has a configuration error. Resolve the errors shown in the Summary section before re-enabling.

Metric types

TypeDescription
BusinessForm-based. Pick an aggregation function and column — no SQL required. Supports all built-in time window, filter, and segment options.
SQLWrite your own SQL. Full flexibility for joins, ratios, and custom logic. You test the query and map result columns to roles.

Both types support the same schedule, threshold, segment, and notification configuration. The only difference is how the metric value is computed.

Metric builder

Business metrics — aggregation

Pick the aggregation function and the column it operates on. The column picker shows only columns marked as metric columns on the dataset, except for COUNT (any column) and COUNT DISTINCT (any column).

FunctionWhat it computes
COUNTNumber of rows matching the time window and filters
COUNT DISTINCTNumber of unique values of the selected column
AVGAverage value of the selected column across matching rows
SUMSum of the selected column across matching rows
MINMinimum value of the selected column
MAXMaximum value of the selected column
MEDIANMedian value of the selected column

Formula mode lets you combine multiple aggregations into a single expression — for example, SUM(revenue) / COUNT(orders) for average order value. Enable it in the aggregation section.

Time window

A time window controls which rows Lighthouse reads on each run. Configure three fields:

FieldOptionsExample
Period columnAny column marked as a datetime column on the datasetcreated_at
RelationWITHIN (inclusive end), WITHIN_EXCLUDED (exclusive end), BEFOREWITHIN
UnitMinutes, Hours, Days, Weeks, Months, Years + a numberLast 1 hour

Data lag

Data lag adds a deliberate delay before Lighthouse evaluates the metric. Use it when your pipeline has a known ingestion delay — for example, if events take 30 minutes to arrive in your warehouse after they occur.

When enabled, set the lag amount (unit: minutes or hours). On each run, Lighthouse shifts the time window back by the lag amount before querying, so you're always looking at a fully-arrived window.

Filters

Filters add WHERE conditions to the metric query. Only columns marked as filter columns on the dataset appear in the picker. Common patterns:

  • Restrict to a specific status: status = 'completed'
  • Limit to a region: country IN ('US', 'GB', 'CA')
  • Exclude test users: is_internal != true

SQL metrics

  1. 1Write your SQLThe query must return at least one numeric column (the metric value). It can also return segment columns for breakdowns.
  2. 2Test the queryClick Test Query. Lighthouse runs the SQL against your warehouse and infers column names and types from the result.
  3. 3Map columnsAssign a role to each result column — metric value, segment dimension, or other. Mark one column as the primary metric value.
Note
SQL metrics give you full flexibility but Lighthouse cannot auto-detect time windows from free-form SQL. If you want segment-level alerts, return segment columns in the query and map them as segment dimensions.

Schedule

The schedule controls how often Lighthouse runs the metric query. You can configure it using the visual Editor or write a raw Cron expression — toggle between the two at the top of the Schedule section.

Manual schedule types

TypeFieldsDetail
Every X MinutesFrequency (5–59), optional From minute / To minuteRuns every N minutes within each hour. Use From/To to restrict to a window within the hour.
Every X HoursFrequency (1–23), Minute of hour (0–59), optional From hour / To hourRuns every N hours. Minute of hour sets when within the hour it runs. Use From/To to restrict to business hours.
DailyHour (0–23) and Minute (0–59)Runs once per day at the specified time in the metric's timezone.

Use Cron mode for patterns not covered by the manual editor — for example, running only on weekdays at a specific time, or complex multi-interval schedules.

Days of week

Below the schedule type, a seven-day toggle (Sun – Sat) restricts which calendar days the schedule runs. All seven days are selected by default. Deselect days to skip weekends, for example.

Days are evaluated in the metric's timezone (see below). Cron mode encodes days directly in the cron expression.

Timezone

Every metric has its own timezone. Schedule times and day-of-week evaluation use this timezone. It defaults to your organization's timezone but can be changed per metric. Timezone is required — the metric cannot go live without one.

Round to nearest hour

Available on Business metrics only (not SQL) and only when the schedule type is Hours or Daily (not Minutes). When enabled, Lighthouse rounds metric values to the nearest calendar hour before evaluating thresholds. Useful for hourly KPIs where partial-hour results would create noise.

Upcoming runs preview

A debug card at the bottom of the Schedule section shows the next several scheduled run times in the metric's timezone. Use this to verify your schedule fires when you expect.

Important
The minimum monitoring interval is enforced by your plan: 4 hours on Free, 1 hour on Professional, 5 minutes on Enterprise. If the schedule is faster than your plan allows, Lighthouse blocks activation and shows an error in the Schedule section.

General

Description

Optional free-text description of what the metric measures and why it matters. The description is included in default Slack notification templates via {{ metric_description }}. It's not shown as a column in the metrics list, but it appears in the metric editor and in summary tooltips.

AI context

An optional field used by Lighthouse AI assistants — the Metric Assistant and the metric suggestions agent — to generate more relevant suggestions and configuration. Provide any context about this metric that isn't obvious from its definition: what business question it answers, which team owns it, or what counts as a normal vs abnormal value.

Tags

Tags (internally called kpis) are plain text labels for organizing and filtering your metrics. You can assign up to 10 tags per metric. Create new tags inline or pick from existing org-wide tag suggestions.

Where tags appearDetail
Metrics list — Tags columnShown as badges. The list can be filtered by one or more tags via the Tags filter.
Metrics list — filterMulti-select filter: shows metrics that have any of the selected tags.
APIIncluded as kpis[] on metric create, update, and search requests.
Slack alertsTags are not available as notification template variables and are not included in default alert messages.
Note
Tags are organizational labels only. They do not affect permissions, notification routing, scheduling, or alert behavior.

Severity

Assign a severity level to the metric. The severity appears in Slack alert messages and in the metrics list. It defaults to S2 for new metrics.

LevelTypical use
S0Production incidents — payment failure, complete service outage
S1Severe business impact — major revenue drop, critical funnel failure
S2Significant change — the default. Unusual but not necessarily urgent.
S3Notable variance — worth knowing but not waking anyone up for
S4Low-priority trend monitoring
S5Informational — logged for context, no action expected

Severity is a label only. Lighthouse does not route alerts to different channels or escalation paths based on severity — that logic lives in your Slack configuration.

Access control

Inside an Access Control accordion within General, you configure two independent dimensions: who can view the metric and who can edit it.

Access levelWho has access
EveryoneAll org members (default for new metrics)
OwnerOnly the metric creator and the user assigned as metric owner. Org admins always have full access.
Selected peopleSpecific users you add to the viewer or editor lists

Set both Who can view and Who can edit independently. For example, you can make a metric visible to everyone but editable only by selected users.

Note
Org admins always have full access to all metrics regardless of these settings. Access control only restricts non-admin members.

Owner

A single user picked from your org. Defaults to whoever created the metric. The owner is displayed as a column and avatar in the metrics list, and is filterable via the Owners filter.

Ownership is primarily operational: it determines who can edit or delete a metric when they don't have org-wide edit permissions. It does not automatically add the owner as a Slack or email recipient.

Creator

Read-only display in Access Control showing who created the metric. The creator is always locked into viewer and editor lists when access is set to Selected people — they cannot be removed.

Notification

Slack destination

Pick the Slack workspace from the App dropdown (only connected workspaces appear). Then set at least one destination:

FieldBehavior
Send to channelPosts alerts to a public or private Slack channel. Bot must be invited to private channels.
Send to userSends a Slack DM to a specific user.

At least one of channel or user is required before the metric can go live. A warning appears if the selected channel or user no longer exists in Slack.

Notification message template

The notification template controls the body of the Slack message. It's per-metric (not org-wide) and uses Slack markdown. Click Insert a variable to pick from the available template variables.

The default template for a new metric:

:bell: *{{ metric_name }}* is triggered! *Description*: {{ metric_description }} *Severity*: {{ severity }} *Segment*: {{ segment_name }} *Value*: {{ current_value }}

Template variables

VariableLabelSegment-specific?
{{ metric_name }}Metric NameNo
{{ metric_description }}Metric DescriptionNo
{{ severity }}SeverityNo
{{ execution_time }}Execution TimeNo
{{ current_value }}Current ValueYes — changes per segment
{{ segment_name }}Segment NameYes — the segment combination that fired

Additional variables are generated dynamically:

  • SQL metrics: one variable per mapped result column, named after the column.
  • Calculated columns: one variable per calculated column, named after the column.
  • Threshold filters: named threshold conditions generate variables like {{ filter name }}, {{ filter name }} - Compared Value, {{ filter name }} - Threshold Value, and (for standard deviation) {{ filter name }} - Standard Deviation.
Note
Segment-specific variables (like {{ current_value }} and {{ segment_name }}) are hidden in the variable picker for the main aggregated message when aggregated mode is on — use them in the Per Segment Notification Message instead.

Aggregated mode

When segments are enabled on the metric, you can toggle Aggregate segments into 1 message. When on, one Slack message is sent per metric run — all breaching segments are listed within that single message using the Per Segment Notification Message template.

When aggregated mode is off (default), each breaching segment sends its own Slack message. For metrics with many segments, aggregated mode reduces noise significantly.

Default per-segment template (rendered once per breaching segment inside the aggregated message):

*Segment*: {{ segment_name }} *Value*: {{ current_value }}

Email notifications

Toggle Also send to email to send an email alongside the Slack alert. Configure:

FieldRequiredDescription
Email RecipientsYes (if email on)Comma-separated email addresses
Email SubjectNoDefaults to {{ metric_name }}
Email BodyNoPlain text. If left empty, the Slack notification message text is used.

Trigger configuration

The Trigger Configuration accordion inside the Notification section controls when alerts actually fire and how they behave during sustained threshold breaches.

Allow snoozing (default: on)

This setting controls what happens when a threshold stays breached across multiple consecutive runs:

SettingBehavior
On (default)Lighthouse fires an alert on the first run that breaches the threshold, then stays silent for as long as that segment remains in breach. A new alert fires only when the breach clears and then occurs again in a later run.
OffLighthouse fires an alert on every scheduled run where the threshold is breached. A metric running every hour could send dozens of alerts for a single sustained incident.
Tip
Leave Allow snoozing on unless you specifically need to track how long a threshold stays breached or need repeated escalations. With it off and a fast schedule, you can easily flood a Slack channel during an incident.

Action execution behavior

OptionBehavior
Always (on first match)Default. Alert fires the first time the threshold is breached in a run.
After consecutive triggersAlert fires only after N consecutive metric runs all breach the threshold. Filters out short-lived anomalies.

When After consecutive triggers is selected, set a trigger threshold of N (minimum 1). For example, with N = 3 and an hourly schedule, you'll only get alerted after 3 straight hours of threshold breach — a single bad data point won't fire.

Test notification

The Test button in the editor footer (not inside the Notification accordion) sends a test Slack message using the current form values. The form must be valid before the test runs. Test messages are labeled in Slack so they're distinguishable from real alerts.

Summary

The Summary section is a read-only review panel — not a save step. It surfaces validation errors and shows a human-readable preview of your configuration before you go live.

Metric configuration summary

Runs validation on the metric builder fields. If the configuration is invalid, a red error card lists the specific issues. If it's valid, it shows a sentence-form summary of the metric definition — aggregation, time window, filters, and thresholds in plain language.

Schedule summary

Runs validation on the schedule. If invalid, an error card lists the issues. If valid, displays the schedule in plain language: frequency, days of week, time range, timezone. Badges appear for Snoozing enabled and Rounds to nearest hour when those options are on.

Note
The Summary section shows errors early but does not block saving. Full validation — including notification channel, timezone, SQL test status, access control, and plan limits — runs when you click Save or Save and Go Live.

Going live

A metric can be enabled (status → Live) only when all three are complete:

RequirementDetail
ScheduleA valid schedule with an interval at or above your plan's minimum.
ThresholdAt least one threshold condition configured in the Metric Builder.
Notification destinationAt least one Slack channel or DM user in the Notification section.

Save the metric first if you want to stay in Draft while you configure it. Use Save and Go Live to enable it immediately.

Metrics list

The metrics list at /metrics shows all metrics your account has access to. Filters and table columns are both customizable.

Filters

FilterMatches on
SearchMetric name or numeric ID
SeverityS0–S5 (multi-select)
TagsMetrics that have any of the selected tags
OwnersMetrics assigned to any of the selected users
StatusDraft / Live / Paused / Invalid (in 'Show more')
Data sourceWhich warehouse connection the metric belongs to (in 'Show more')
Data setWhich dataset the metric is built on (in 'Show more')
Slack appWhich Slack workspace the metric sends to (in 'Show more')
Slack channelWhich Slack channel (in 'Show more')
Slack userWhich DM user (in 'Show more')
Note
There is no group-by in the metrics list — only multi-select filters. Filters across different types are AND-ed; within the same filter (e.g. multiple tags), any match is sufficient.

Table columns

ColumnContent
TypeBusiness or SQL icon
StatusDraft / Live / Paused / Invalid
IDSequential numeric identifier
NameMetric name (link to editor)
SeverityS0–S5 badge
TagsKPI tag badges (up to 10; overflow shows +N)
ScheduleHuman-readable schedule summary
Last RunExecution status and timestamp of most recent run
AI SuggestionsSuggestion run status and quick actions
Metric SummaryInfo icon → tooltip with the plain-language metric definition
OwnerUser avatar
Next RunScheduled time of next execution
Last TriggerWhen the metric last fired an alert

Columns are hideable and reorderable via the column settings control in the table header. Description is not available as a column.

Overview page

The /overview page shows active alert states — segments that are currently in breach — not the full metrics catalog. It's the landing page after onboarding and is the fastest way to see what's actively triggered right now.