Loading analytics...
Querying session and engagement data
Analytics
Session quality, behavioral signals, and user engagement. Click any chart segment to filter the dashboard.
AI Session Analysis
Auto-generated from live data- --Analyzing session patterns...
Hover any metric for the ClickHouse query powering it
i
Total Sessions
Unique trace IDs (one per browser session) over the last 7 days
Powered by:
Unique trace IDs (one per browser session) over the last 7 days
Powered by:
uniqExact(TraceId)SELECT uniqExact(TraceId) FROM otel_traces WHERE ServiceName = 'clickstack-portal' AND Timestamp >= now() - INTERVAL 7 DAY
Celonis equivalent: Session Analytics ($50K/yr Amplitude)
Total Sessions
--
last 7 days
i
Unique Users
Distinct visitor IPs across all sessions
Powered by:
Distinct visitor IPs across all sessions
Powered by:
uniqExact()SELECT uniqExact(SpanAttributes['visitor.ip']) FROM otel_traces WHERE ServiceName = 'clickstack-portal' AND Timestamp >= now() - INTERVAL 7 DAY
Celonis equivalent: User analytics ($50K/yr Amplitude)
Unique Users
--
last 7 days
i
Dead Clicks
Click on a non-interactive element (no navigation or state change within 500ms)
Powered by:
Click on a non-interactive element (no navigation or state change within 500ms)
Powered by:
uniqExact(TraceId)SELECT uniqExact(TraceId) FROM otel_traces WHERE ServiceName = 'clickstack-portal' AND SpanName = 'dead_click' AND Timestamp >= now() - INTERVAL 7 DAY
No Celonis equivalent — unique to ClickStack RUM
Dead Clicks
--
last 7 days
i
Rage Clicks
3+ clicks on the same element within 2 seconds
Powered by:
3+ clicks on the same element within 2 seconds
Powered by:
uniqExact(TraceId)SELECT uniqExact(TraceId) FROM otel_traces WHERE ServiceName = 'clickstack-portal' AND SpanName = 'rage_click' AND Timestamp >= now() - INTERVAL 7 DAY
No Celonis equivalent — unique to ClickStack RUM
Rage Clicks
--
last 7 days
i
Quick Backs
Navigation followed by browser back within 3 seconds
Powered by:
Navigation followed by browser back within 3 seconds
Powered by:
uniqExact(TraceId)SELECT uniqExact(TraceId) FROM otel_traces WHERE ServiceName = 'clickstack-portal' AND SpanName = 'quick_back' AND Timestamp >= now() - INTERVAL 7 DAY
No Celonis equivalent — unique to ClickStack RUM
Quick Backs
--
last 7 days
i
Excessive Scroll
>80% page scroll depth without meaningful interaction
Powered by:
>80% page scroll depth without meaningful interaction
Powered by:
uniqExact(TraceId)SELECT uniqExact(TraceId) FROM otel_traces WHERE ServiceName = 'clickstack-portal' AND SpanName = 'excessive_scroll' AND Timestamp >= now() - INTERVAL 7 DAY
No Celonis equivalent — unique to ClickStack RUM
Excessive Scroll
--
last 7 days
i
Avg Session Duration
Mean time between first and last event per session
Powered by:
Mean time between first and last event per session
Powered by:
avg(dateDiff())SELECT avg(dateDiff('second', min(Timestamp), max(Timestamp))) FROM otel_traces WHERE ServiceName = 'clickstack-portal' AND Timestamp >= now() - INTERVAL 7 DAY GROUP BY TraceId
Celonis equivalent: Session duration analytics ($50K/yr Amplitude)
Avg Session Duration
--
last 7 days
i
Behavioral Insights
Percentage of sessions affected by each frustration signal
Powered by:
Percentage of sessions affected by each frustration signal
Powered by:
uniqExact(TraceId) / total sessionsSELECT SpanName, uniqExact(TraceId) as sessions
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND SpanName IN ('rage_click','dead_click','excessive_scroll','quick_back')
AND Timestamp >= now() - INTERVAL 7 DAY
GROUP BY SpanName
Celonis equivalent: Smart Tags — behavioral signal summary
Insights
Last 7 days
i
Smart Events
Top operator events by unique session count
Powered by:
Top operator events by unique session count
Powered by:
uniqExact(TraceId) GROUP BY SpanNameSELECT SpanName, uniqExact(TraceId) as sessions
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND Timestamp >= now() - INTERVAL 7 DAY
AND SpanName NOT LIKE 'page.%'
AND SpanName NOT IN ('dead_click','rage_click','quick_back','excessive_scroll')
GROUP BY SpanName ORDER BY sessions DESC LIMIT 10
Celonis equivalent: Smart events — top user actions
Smart Events
Last 7 days
i
Order Lifecycle Funnel
Conversion through the EXOS order pipeline using ClickHouse windowFunnel()
Powered by:
Conversion through the EXOS order pipeline using ClickHouse windowFunnel()
Powered by:
windowFunnel()SELECT level, count() as cnt FROM (
SELECT TraceId,
windowFunnel(2592000)(Timestamp,
SpanName = 'order.created',
SpanName = 'inspection.scheduled',
SpanName = 'report.submitted',
SpanName = 'review.completed',
SpanName = 'order.closed'
) as level
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND Timestamp >= now() - INTERVAL 30 DAY
GROUP BY TraceId
) GROUP BY level ORDER BY level
Celonis equivalent: Process funnel visualization ($100K+/yr)
Order Lifecycle Funnel
Last 30 days
Conversion: --
Median time: --
i
Correlation Analysis
Events that correlate with order completion vs drop-off, using ClickHouse windowFunnel()
Powered by:
Events that correlate with order completion vs drop-off, using ClickHouse windowFunnel()
Powered by:
windowFunnel() + countIf()WITH funnel AS (
SELECT TraceId,
windowFunnel(2592000)(Timestamp,
SpanName = 'order.created',
SpanName = 'order.closed'
) >= 2 AS converted
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND Timestamp >= now() - INTERVAL 30 DAY
GROUP BY TraceId
),
all_events AS (
SELECT TraceId, SpanName
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND Timestamp >= now() - INTERVAL 30 DAY
)
SELECT e.SpanName as event_name,
countIf(f.converted) as completed,
countIf(NOT f.converted) as dropped,
round((countIf(f.converted) / greatest(sum(toUInt32(f.converted)), 1))
/ greatest(countIf(NOT f.converted) / greatest(sum(toUInt32(NOT f.converted)), 1), 0.001), 1)
as likelihood_ratio
FROM all_events e
JOIN funnel f ON e.TraceId = f.TraceId
GROUP BY e.SpanName
HAVING completed + dropped > 5
ORDER BY likelihood_ratio DESC
PostHog equivalent: Correlation Analysis ($50K+/yr)
| Event | Completed | Dropped | Correlation |
|---|---|---|---|
i
Operator Retention
Cohort retention: % of operators from each weekly cohort still active N weeks later
Powered by:
Cohort retention: % of operators from each weekly cohort still active N weeks later
Powered by:
dateDiff('week') + toStartOfWeek()WITH cohorts AS (
SELECT SpanAttributes['operator.id'] as operator,
toStartOfWeek(min(Timestamp)) as cohort_week
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND SpanAttributes['operator.id'] != ''
AND Timestamp >= now() - INTERVAL 60 DAY
GROUP BY operator
),
activity AS (
SELECT SpanAttributes['operator.id'] as operator,
toStartOfWeek(Timestamp) as activity_week
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND SpanAttributes['operator.id'] != ''
AND Timestamp >= now() - INTERVAL 60 DAY
GROUP BY operator, activity_week
)
SELECT c.cohort_week,
count(DISTINCT c.operator) as cohort_size,
dateDiff('week', c.cohort_week, a.activity_week) as weeks_since,
count(DISTINCT a.operator) as active_count,
round(count(DISTINCT a.operator) / count(DISTINCT c.operator) * 100, 0) as retention_pct
FROM cohorts c
LEFT JOIN activity a ON c.operator = a.operator
AND a.activity_week >= c.cohort_week
GROUP BY c.cohort_week, weeks_since
ORDER BY c.cohort_week, weeks_since
PostHog/Amplitude equivalent: Retention analysis ($50K+/yr)
Advanced: Audience Breakdown (Browser, OS, Device) ▸
i
Audience Breakdown
Session distribution by browser, OS, and device type. Click any segment to cross-filter the dashboard.
Powered by:
Session distribution by browser, OS, and device type. Click any segment to cross-filter the dashboard.
Powered by:
uniqExact() GROUP BYSELECT ResourceAttributes['visitor.browser'] as val,
uniqExact(ResourceAttributes['rum.sessionId']) as cnt
FROM hyperdx_sessions
WHERE Timestamp >= now() - INTERVAL 7 DAY
GROUP BY val ORDER BY cnt DESC
Celonis equivalent: Audience segmentation ($50K/yr Amplitude)
Audience Breakdown
Click a segment to filter
i
Browser Breakdown
Session count grouped by browser from RUM visitor data
Powered by:
Session count grouped by browser from RUM visitor data
Powered by:
uniqExact() GROUP BYSELECT ResourceAttributes['visitor.browser'] as val,
uniqExact(ResourceAttributes['rum.sessionId']) as cnt
FROM hyperdx_sessions
WHERE Timestamp >= now() - INTERVAL 7 DAY
GROUP BY val ORDER BY cnt DESC LIMIT 6
Celonis equivalent: Audience segmentation ($50K/yr Amplitude)
Browser
i
OS Breakdown
Session count grouped by operating system
Powered by:
Session count grouped by operating system
Powered by:
uniqExact() GROUP BYSELECT ResourceAttributes['visitor.os'] as val,
uniqExact(ResourceAttributes['rum.sessionId']) as cnt
FROM hyperdx_sessions
WHERE Timestamp >= now() - INTERVAL 7 DAY
GROUP BY val ORDER BY cnt DESC LIMIT 7
Celonis equivalent: Audience segmentation ($50K/yr Amplitude)
Operating System
i
Device Breakdown
Session count grouped by device type
Powered by:
Session count grouped by device type
Powered by:
uniqExact() GROUP BYSELECT ResourceAttributes['visitor.device_type'] as val,
uniqExact(ResourceAttributes['rum.sessionId']) as cnt
FROM hyperdx_sessions
WHERE Timestamp >= now() - INTERVAL 7 DAY
GROUP BY val ORDER BY cnt DESC LIMIT 4
Celonis equivalent: Audience segmentation ($50K/yr Amplitude)
Device Type
i
Behavioral Cohort Comparison
Compares retention of operators who performed a specific action vs those who didn't. Blue = behavioral cohort, Gray = control group.
Powered by:
Compares retention of operators who performed a specific action vs those who didn't. Blue = behavioral cohort, Gray = control group.
Powered by:
dateDiff('week') + LEFT JOIN actorsWITH actors AS (
SELECT DISTINCT SpanAttributes['operator.id'] as operator
FROM otel_traces
WHERE SpanName = '{selected_event}'
AND Timestamp >= now() - INTERVAL 60 DAY
),
weekly AS (
SELECT SpanAttributes['operator.id'] as operator,
toStartOfWeek(Timestamp) as week
FROM otel_traces WHERE SpanAttributes['operator.id'] != ''
AND Timestamp >= now() - INTERVAL 60 DAY
GROUP BY operator, week
),
first_seen AS (
SELECT operator, min(week) as cohort_week FROM weekly GROUP BY operator
)
SELECT
dateDiff('week', f.cohort_week, w.week) as weeks_since,
countIf(a.operator IS NOT NULL) as cohort_active,
countIf(a.operator IS NULL) as control_active,
count() as total
FROM weekly w
JOIN first_seen f ON w.operator = f.operator
LEFT JOIN actors a ON w.operator = a.operator
WHERE w.week >= f.cohort_week
GROUP BY weeks_since
ORDER BY weeks_since
PostHog/Amplitude equivalent: Behavioral cohort retention ($50K+/yr)
Behavioral Cohort Comparison
Retention of operators who performed an action vs those who didn't
Last 60 days
Predictive Intelligence
Each card below shows a real-time prediction computed by ClickHouse Materialized Views and multiIf() — no ML pipeline, no batch jobs, no separate model server. Hover any card for the exact query.
i
Churn Risk Score
Classifies operators as high/medium/low churn risk based on inactivity days and error rate
Powered by:
Classifies operators as high/medium/low churn risk based on inactivity days and error rate
Powered by:
multiIf() + dateDiff()SELECT
risk_level,
count() as operator_count,
groupArray(operator) as operators
FROM (
SELECT
SpanAttributes['operator.id'] as operator,
dateDiff('day', max(Timestamp), now()) as days_inactive,
count() as total_events,
countIf(StatusCode = 'ERROR') as error_events,
CASE
WHEN days_inactive > 14 THEN 'high'
WHEN days_inactive > 7 OR (error_events / greatest(total_events, 1)) > 0.2 THEN 'medium'
ELSE 'low'
END as risk_level
FROM otel_traces
WHERE (ServiceName = 'clickstack-portal' OR ServiceName LIKE 'exos-%')
AND SpanAttributes['operator.id'] != ''
AND Timestamp >= now() - INTERVAL 30 DAY
GROUP BY operator
)
GROUP BY risk_level
ORDER BY risk_level
Pendo Predict equivalent: $50K/yr enterprise contract
Churn Risk Score
Pendo Predict: XGBoost → EXOS: multiIf()
High: --
Medium: --
Low: --
i
Behavioral Sequences
Uses ClickHouse sequenceMatch() to detect operators who follow the order completion pattern
Powered by:
Uses ClickHouse sequenceMatch() to detect operators who follow the order completion pattern
Powered by:
sequenceMatch()SELECT
countIf(has_pattern) as matched_operators,
count() as total_operators,
round(countIf(has_pattern) / count() * 100, 1) as match_pct
FROM (
SELECT
SpanAttributes['operator.id'] as operator,
sequenceMatch('(?1).*(?2).*(?3)')(
Timestamp,
SpanName = 'order.created',
SpanName = 'inspection.scheduled',
SpanName = 'order.closed'
) as has_pattern
FROM otel_traces
WHERE (ServiceName = 'clickstack-portal' OR ServiceName LIKE 'exos-%')
AND SpanAttributes['operator.id'] != ''
AND Timestamp >= now() - INTERVAL 30 DAY
GROUP BY operator
)
Pendo Predict equivalent: $50K/yr enterprise contract
Behavioral Sequences
Pendo: Tree-based clickstream → EXOS: sequenceMatch()
--of --
operators (--%) follow the completion sequence
i
Real-Time Signal Pipeline
Shows how many spans were ingested in the last hour — no batch retraining needed
Powered by:
Shows how many spans were ingested in the last hour — no batch retraining needed
Powered by:
count() + uniqExact()SELECT
count() as spans_last_hour,
uniqExact(SpanAttributes['operator.id']) as active_operators,
uniqExact(SpanName) as event_types
FROM otel_traces
WHERE (ServiceName = 'clickstack-portal' OR ServiceName LIKE 'exos-%')
AND Timestamp >= now() - INTERVAL 1 HOUR
Pendo Predict equivalent: $50K/yr enterprise contract
Real-Time Signal Pipeline
Pendo: Batch retraining → EXOS: Materialized Views
--
spans in the last hour across -- operators and -- event types. No batch job. No retraining delay.
i
Feature Compression
ClickHouse columnar storage + AggregatingMergeTree achieves dimensionality reduction at the storage level, not query level
Powered by:
ClickHouse columnar storage + AggregatingMergeTree achieves dimensionality reduction at the storage level, not query level
Powered by:
uniqExact() + columnar storageSELECT
count() as raw_events,
uniqExact(SpanAttributes['operator.id']) as unique_operators,
uniqExact(SpanName) as unique_event_types,
round(count() / greatest(uniqExact(SpanAttributes['operator.id']) * uniqExact(SpanName), 1), 1) as events_per_dimension
FROM otel_traces
WHERE (ServiceName = 'clickstack-portal' OR ServiceName LIKE 'exos-%')
AND Timestamp >= now() - INTERVAL 7 DAY
Pendo Predict equivalent: $50K/yr enterprise contract
Feature Compression
Pendo: PCA preprocessing → EXOS: AggregatingMergeTree
-- raw events
compressed to -- operator x -- event dimensions. --:1 compression via columnar storage.
i
Operator Health Score
The Pendo score, in one SQL query. Formula: 40% active days + 30% feature breadth + 30% error-free rate
Powered by:
The Pendo score, in one SQL query. Formula: 40% active days + 30% feature breadth + 30% error-free rate
Powered by:
round() + least() + greatest()SELECT
SpanAttributes['operator.id'] as operator,
count() as total_events,
countIf(StatusCode = 'ERROR') as errors,
uniqExact(toDate(Timestamp)) as active_days,
uniqExact(SpanName) as feature_breadth,
round(
(least(active_days, 30) / 30.0 * 40) +
(least(feature_breadth, 20) / 20.0 * 30) +
((1 - least(errors / greatest(total_events, 1), 1)) * 30)
, 0) as health_score
FROM otel_traces
WHERE (ServiceName = 'clickstack-portal' OR ServiceName LIKE 'exos-%')
AND SpanAttributes['operator.id'] != ''
AND Timestamp >= now() - INTERVAL 30 DAY
GROUP BY operator
ORDER BY health_score ASC
LIMIT 10
Pendo Predict equivalent: $50K/yr enterprise contract
Operator Health Score
The Pendo score, in one SQL query
| Operator | Score |
|---|---|
| Loading... | |
i
Popular Pages
Top pages by view count and unique session reach
Powered by:
Top pages by view count and unique session reach
Powered by:
count() GROUP BY SpanNameSELECT SpanName as page, count() as views,
uniqExact(TraceId) as sessions
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND Timestamp >= now() - INTERVAL 7 DAY
AND SpanName LIKE 'page.%'
GROUP BY page ORDER BY views DESC LIMIT 10
Celonis equivalent: Page analytics ($50K/yr Amplitude)
Popular Pages
Last 7 days
| # | Page | Volume | Views | Unique Sessions |
|---|---|---|---|---|
i
Engagement Over Time
Daily session count with frustration overlay (sessions containing rage clicks, dead clicks, or quick backs)
Powered by:
Daily session count with frustration overlay (sessions containing rage clicks, dead clicks, or quick backs)
Powered by:
uniqExact() GROUP BY toDate()SELECT toDate(Timestamp) as day,
uniqExact(ResourceAttributes['rum.sessionId']) as sessions
FROM hyperdx_sessions
WHERE Timestamp >= now() - INTERVAL 30 DAY
GROUP BY day ORDER BY day
Celonis equivalent: Session trend analytics ($50K/yr Amplitude)
Engagement Over Time
All Sessions
Frustration Sessions
Daily · last 30 days
i
Operator Lifecycle
Weekly cohort analysis: new, returning, resurrecting, and dormant operators
Powered by:
Weekly cohort analysis: new, returning, resurrecting, and dormant operators
Powered by:
windowFunnel + weekly cohortsWITH weekly AS (
SELECT SpanAttributes['operator.id'] as operator,
toStartOfWeek(Timestamp) as week
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND SpanAttributes['operator.id'] != ''
AND Timestamp >= now() - INTERVAL 60 DAY
GROUP BY operator, week
),
first_seen AS (
SELECT operator, min(week) as first_week FROM weekly GROUP BY operator
),
classified AS (
SELECT w.week, w.operator,
CASE
WHEN f.first_week = w.week THEN 'new'
WHEN prev.operator IS NOT NULL THEN 'returning'
ELSE 'resurrecting'
END as lifecycle
FROM weekly w
JOIN first_seen f ON w.operator = f.operator
LEFT JOIN weekly prev ON w.operator = prev.operator
AND prev.week = w.week - INTERVAL 1 WEEK
)
SELECT week, lifecycle, count(DISTINCT operator) as cnt
FROM classified GROUP BY week, lifecycle ORDER BY week, lifecycle
Celonis equivalent: User lifecycle analysis ($50K/yr Amplitude)
Operator Lifecycle
New
Returning
Resurrecting
Dormant
Weekly · last 60 days
i
Stickiness Histogram
Distribution of how many days each operator was active in the last 30 days. Power users (15+ days) highlighted.
Powered by:
Distribution of how many days each operator was active in the last 30 days. Power users (15+ days) highlighted.
Powered by:
uniqExact(toDate()) GROUP BY operatorSELECT active_days, count() as operator_count
FROM (
SELECT SpanAttributes['operator.id'] as operator,
uniqExact(toDate(Timestamp)) as active_days
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND SpanAttributes['operator.id'] != ''
AND Timestamp >= now() - INTERVAL 30 DAY
GROUP BY operator
)
GROUP BY active_days ORDER BY active_days
Celonis equivalent: Stickiness & DAU/MAU analytics ($50K/yr Amplitude)
Stickiness Histogram
Active days per operator in the last 30 days. Blue = power users (15+ days)
Last 30 days
i
Engagement Matrix
Which operators use which features — a heatmap of operator×feature usage intensity over the last 30 days
Powered by:
Which operators use which features — a heatmap of operator×feature usage intensity over the last 30 days
Powered by:
count() GROUP BY operator, SpanNameSELECT
SpanAttributes['operator.id'] as operator,
SpanName as feature,
count() as usage
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND SpanAttributes['operator.id'] != ''
AND Timestamp >= now() - INTERVAL 30 DAY
GROUP BY operator, feature
ORDER BY operator, usage DESC
Celonis equivalent: Feature adoption matrix ($50K+/yr Pendo)
Engagement Matrix
Operator × Feature usage intensity. Darker = more usage
Last 30 days
Advanced: Scroll Depth Distribution ▸
i
Scroll Depth Distribution
How far users scroll on each page, bucketed by 10% increments
Powered by:
How far users scroll on each page, bucketed by 10% increments
Powered by:
floor(toFloat64OrZero() / 10) * 10SELECT floor(toFloat64OrZero(
SpanAttributes['page.scroll_depth_pct']) / 10) * 10 as depth_bucket,
count() as sessions
FROM otel_traces
WHERE SpanAttributes['page.scroll_depth_pct'] != ''
AND Timestamp >= now() - INTERVAL 7 DAY
GROUP BY depth_bucket ORDER BY depth_bucket
No Celonis equivalent — unique to ClickStack RUM
Scroll Depth Distribution
Last 7 days
i
Errors
Grouped error messages from traces with StatusCode = ERROR
Powered by:
Grouped error messages from traces with StatusCode = ERROR
Powered by:
count() GROUP BY StatusMessageSELECT StatusMessage, count() as cnt
FROM otel_traces
WHERE ServiceName = 'clickstack-portal'
AND StatusCode = 'ERROR'
AND Timestamp >= now() - INTERVAL 7 DAY
GROUP BY StatusMessage
ORDER BY cnt DESC LIMIT 10
Celonis equivalent: JavaScript errors dashboard
Errors
Last 7 days
-- of sessions had errors
-- total errors