Open Analytics - Video Player Analytics
Own your video player analytics: your data stays in your own ClickHouse database with no forced retention window, for a flat monthly price. Query it with SQL or an AI assistant, powered by the EPAS open standard with zero vendor lock-in.
Open Analytics is a video QoE analytics solution built on Open Source Cloud (OSC), a managed platform for open source services with zero vendor lock-in. Deploy and manage your full analytics stack via OSC at app.osaas.io.
Get Started Already on OSC? Sign in€199/mo · Billed from day one · Cancel anytime
Up and running in minutes.
Analyze millions of player sessions across live and on-demand workflows.
See a live demo dashboard here
Real-time QoE monitoring dashboard
Who Uses Open Analytics
Built for video streaming teams who need real-time insight into player quality, viewer engagement, and delivery performance.
OTT Platforms
Monitor real-time QoE across 10K+ concurrent viewers. Track startup time, buffering, and errors by device and content.
- Startup time by device & content
- Concurrent viewer QoE score
- Error rate & rebuffering ratio
Live Streaming Events
Ensure broadcast-grade reliability. Track QoS against your SLA thresholds, and build alerts on top in Grafana. Before you do, read the No-Data routing note.
- Live latency & dropped frames
- SLA threshold tracking (alertable in Grafana)
- Bitrate stability over time
Content Creators
Understand viewer behavior. Which videos have the highest completion rates? Where do viewers drop off?
- Video completion rate by title
- Drop-off points & engagement depth
- Play events & pause patterns
Video CDN Operators
Measure CDN performance. Compare bitrate delivery across regions and identify edge server issues.
- Bitrate delivery by edge region
- CDN-to-CDN performance comparison
- Edge server error correlation
Built for AI-Generated Video Apps
AI writes the code. Open Analytics monitors the quality.
AI-generated video code behaves unpredictably: unexpected rebuffering, startup failures, error spikes from edge cases the AI didn't handle. Open Analytics gives you real-time QoE monitoring so you know exactly when and why your video pipeline breaks.
- Real-time player error detection
- Startup failure tracking
- Rebuffering and stall monitoring
- Catch playback regressions after every deploy
Built to Integrate
- Players
- The EPAS Web SDK attaches to any HTML5
<video>element, so it works with any player built on one, including hls.js, dash.js, Video.js, Shaka Player and native HTML5 video. Native Android (ExoPlayer, Kotlin/Java) and iOS (Swift) SDKs are published separately. - Self-hosting
- The full EPAS pipeline (Eventsink, Worker, ClickHouse, Grafana) ships as open source and can run on your own infrastructure. Each component publishes a Dockerfile; see the eventsink and worker repos.
- Data format
- Events follow the open EPAS specification.
Track What Matters Most: Startup Time & Buffering
Open Analytics tracks the critical Quality of Experience (QoE) metrics that directly impact viewer retention and revenue.
Higher playthrough rates. Viewers abandon if >2s.
Longer sessions. >3% indicates serious delivery problems.
Lower churn. Track quality shifts and playback errors.
Instant visibility. ClickHouse queries return in milliseconds.
Features
Real-time Analytics
Track playback events, errors, and user behavior in real-time with ClickHouse.
Grafana Dashboards
Visualize your analytics data with pre-built Grafana dashboards.
EPAS Standard
Built on the open Eyevinn Player Analytics Specification. No vendor lock-in. Instrument once with EPAS: if you ever want to switch analytics backends, your player code stays unchanged. One config line, not a re-instrumentation project. Export destinations: ClickHouse (included), BigQuery, Snowflake, or any SQL-compatible database.
Open Source
Full transparency. Contribute, customize, and own your analytics stack.
AI-Powered QoE Monitoring You Can Audit
Open Analytics combines AI-powered natural language querying (via Claude, Cursor, Windsurf, or any MCP-compatible client) with direct SQL access to raw QoE metrics. Unlike proprietary AI monitoring tools, you can audit every decision: no black boxes, no vendor interpretation layers.
Compliant by Design
Open Analytics meets EU Data Act (September 2025) requirements from day one, no additional compliance work needed.
Data Portability
EPAS open format: export your analytics to any backend (Datadog, Splunk, or your own infrastructure) without data conversion.
Zero Lock-in
Full SQL access: ClickHouse credentials included. Run custom queries and export via CSV or JSON at any time.
Interoperability
ClickHouse MCP: AI agents can migrate your data to any destination automatically, interoperability built in.
Proprietary analytics platforms (using closed formats) will require costly compliance work. Open Analytics is compliant from day one, zero migration risk for European enterprises.
Simple, Transparent Pricing
Hosted player analytics for streaming services and broadcasters. Your events land in your own ClickHouse, and you decide how long they stay.
Business
Billed from day one. Cancel anytime.
Player analytics for one production service, stored in your own ClickHouse, at one flat monthly price instead of a bill per view.
- One production pipeline, with room for test and staging pipelines
- Fixed monthly price means very favourable scaling potential
- No forced retention window: you decide how long to keep your data. 30 GB of storage included, more on request at extra cost
- SDKs for web, iOS and tvOS, and Android
- SQL access to your own ClickHouse database
- Built-in QoE dashboard and Grafana included
- Fully managed: ingest, queue, worker, ClickHouse and Grafana set up and run for you
- Built on EPAS, an open standard, with an open source pipeline you can also run yourself
Running at very high volume, or need custom development work? Contact sales@eyevinn.se.
Open Analytics vs per-view pricing
Flat rate. No per-view billing. No surprise invoices.
| Monthly views | Open Analytics | Typical per-view platform |
|---|---|---|
| 500K views/month | €199 | $240+ |
| 1M views/month | €199 | $499 |
| 2M views/month | €199 | $999+ |
| 10M views/month | €199 | $4,999+ |
Pricing based on publicly available rates as of October 2026. Per-view platform figures reflect Mux Data pricing: Media plan ($499/mo for 1M views, $0.50/1K overage); pay-as-you-go tier ($0.60/1K views, first 100K free). 500K-views figure uses the pay-as-you-go tier (100K free + 400K × $0.60/1K = $240).
Your data trains nothing.
Analytics are stored in your ClickHouse instance. We never access or use your data for AI training.
Self-healing infrastructure on Kubernetes.
Services run on managed Kubernetes with automatic restarts and health checks. No manual intervention required.
What's Included
Complete Analytics Stack
Everything deployed automatically
- Player Analytics Eventsink - Ingest events from players
- SmoothMQ - Message queue for reliable processing
- Analytics Worker - Process and store events
- ClickHouse - Real-time analytics database
- Grafana - Visualization dashboards
Deploy with one click. Auto-configured and ready to use.
Frequently Asked Questions
EPAS (Eyevinn Player Analytics Specification) is an open standard for video player telemetry. It defines a common format for collecting and exchanging player analytics data, ensuring your metrics are portable across different platforms and tools. Unlike proprietary formats, EPAS gives you complete control over your data with zero vendor lock-in.
Open standards eliminate vendor lock-in and ensure data portability. With EPAS, you can export your analytics data to any backend or switch providers without losing historical data or rewriting your instrumentation. Your data remains yours, in a format that's universally readable and future-proof.
Unlike proprietary platforms that lock your data in their ecosystem, Open Analytics gives you complete freedom. You get direct access to your ClickHouse database, can export data in standard formats, and aren't tied to a single vendor's visualization tools or pricing model. It's the same powerful analytics capabilities without the restrictions.
Track all essential video player metrics including play/pause events, buffering, bitrate changes, video quality, error events, and playback completion. You can also capture custom metadata like content ID, user ID, device type, and any business-specific attributes. All data is stored in real-time for immediate analysis.
Yes! Open Analytics provides SDKs for Web (JavaScript), Android (Kotlin/Java), and iOS (Swift) that integrate with any video player. The SDKs handle event collection and transmission automatically, so you can instrument your player with just a few lines of code regardless of your player technology.
Absolutely not. You have full export capabilities and direct access to your ClickHouse database. Your data is stored in the open EPAS format, making it completely portable. You can export to CSV, integrate with other tools via SQL, or migrate to another platform without any data conversion required.
One hosted analytics pipeline for your production service, with room for test and staging pipelines. Player events from our web, iOS, tvOS and Android SDKs land in a ClickHouse database that is yours, with SQL access and Grafana included. There is no forced retention window: nothing is deleted after a fixed period, and you decide how long to keep your data. Each pipeline includes 30 GB of storage; more is available on request at extra cost. €199 per month, excl. VAT.
Business is one flat monthly price, however much your audience grows. If you run several large services or very high peak traffic, contact sales@eyevinn.se and we will set up a custom plan.
Monthly, through Open Source Cloud (OSC), Eyevinn's cloud platform. You sign in with an OSC account and pay by card; payments are processed by Stripe. Billing starts from day one, VAT is calculated at checkout based on your location, and you can cancel anytime.
Yes. EPAS is published under Apache 2.0, and the SDKs, eventsink and worker are MIT-licensed. You run and pay for your own infrastructure. Business is for teams that want the same pipeline hosted and run for them.
No installation or management required. Open Analytics is a fully managed deployment - we handle provisioning, configuration, updates, backups, and scaling automatically. You get production-ready analytics infrastructure without DevOps overhead, letting you focus on insights instead of infrastructure.
Yes. Open Analytics meets EU Data Act (September 2025) requirements from day one - no additional compliance work needed. The EPAS open format ensures data portability (export to any backend), direct ClickHouse SQL access eliminates lock-in (custom queries, CSV/JSON exports anytime), and ClickHouse MCP enables interoperability (AI agents can migrate data to any destination automatically). Proprietary platforms using closed formats will need costly compliance work; Open Analytics is compliant from day one.
More from Open Source Cloud
Open Analytics is part of Open Source Cloud: open source tools for video and media, run as managed services.
- Open Intercom — browser-based intercom for remote production crews
- Open Media Convert — cloud-native media transcoding and packaging
- Open SGAI — server-guided ad insertion
Your Analytics Pipelines
Open Analytics needs the Business plan
or Enterprise
Your OSC account is on the plan. Business is €199/month excl. VAT, billed from day one, cancel anytime.
The pipeline is open source, so you can run it on your own infrastructure to try it.
Create New Pipeline
Need help integrating? Check the documentation for SDK setup.
SQL Access
Query from dashboard
This is the exact query behind that card. Run it unchanged against your pipeline's ClickHouse, using the connection credentials below, to reproduce the displayed numbers.
Every Open Analytics pipeline includes direct SQL access to your ClickHouse database. Query your raw event data, build custom reports, and connect BI tools - all without vendor lock-in.
Connection Credentials
Per PipelineSelect a pipeline to view its ClickHouse connection details.
Schema Reference
epas_<shardId>Table: epas_<shardId>
The worker writes player events to one table per shard in the
default database. The table name is
epas_ followed by the shardId of the
event, or its host if no shardId is
set. If the SDK sets neither, events go to
epas_default. Run
SHOW TABLES FROM default to see the tables in
your pipeline, and replace epas_default in the
examples below with your table name.
CREATE TABLE default.epas_default (
event String, -- EPAS event name, e.g. 'playing', 'buffering'
sessionId String, -- Unique session ID per viewer
timestamp DateTime64(3), -- Event timestamp (UTC)
playhead Float64, -- Playback position in seconds
duration Float64, -- Content duration in seconds
live Boolean, -- From the event payload
contentId String, -- From the event payload
userId String, -- From the event payload
deviceId String, -- From the event payload
deviceModel String, -- From the event payload
deviceType String, -- From the event payload
payload String, -- Full event payload as a JSON string
event_date Date DEFAULT toDate(timestamp),
event_hour DateTime DEFAULT toStartOfHour(timestamp)
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (sessionId, timestamp);
live, contentId, userId,
deviceId, deviceModel and
deviceType are copied from the payload of each
individual event when the row is inserted. They are only set
on events that carry those keys, which in practice is the
metadata event, and only if your player reports
them with reportMetadata(). The example queries
therefore read these columns from the session's
metadata event. Other values, such as
bitrate and the error code, are not
columns and are read from payload with
JSONExtract* functions.
Event names follow the EPAS specification:
init, metadata,
heartbeat, loading,
loaded, playing,
paused, buffering,
buffered, seeking,
seeked, bitrate_changed,
stopped, error and
warning.
Example Queries
ClickHouse SQLAverage Startup Time by Device Type
Startup time is the time between the
loading and loaded events of a
session. Device type comes from the
metadata event, so sessions without reported
metadata are grouped under an empty device type. Target:
under 2 seconds.
SELECT
device,
round(avg(startup_ms)) AS avg_startup_ms,
round(avg(startup_ms) / 1000, 2) AS avg_startup_s,
count() AS sessions
FROM (
SELECT
sessionId,
anyIf(deviceType, event = 'metadata' AND deviceType != '') AS device,
dateDiff('millisecond',
minIf(timestamp, event = 'loading'),
minIf(timestamp, event = 'loaded')) AS startup_ms
FROM default.epas_default
WHERE timestamp > now() - INTERVAL 7 DAY
GROUP BY sessionId
HAVING countIf(event = 'loading') > 0 AND countIf(event = 'loaded') > 0
)
GROUP BY device
ORDER BY avg_startup_ms DESC;
Buffering Events per Session
Count buffering events per day relative to the
number of sessions. The pipeline does not store buffering
duration or CDN, so this shows how often buffering occurs, not
how long it lasts.
SELECT
toDate(timestamp) AS day,
countIf(event = 'buffering') AS buffering_events,
uniqExact(sessionId) AS sessions,
round(buffering_events / sessions, 2) AS buffering_per_session
FROM default.epas_default
WHERE timestamp > now() - INTERVAL 7 DAY
GROUP BY day
ORDER BY day DESC;
Error Rate by Content
Find which content items trigger the most playback errors.
Content ID comes from the metadata event and the
error code from the error event payload.
SELECT
content,
sum(errors) AS total_errors,
countIf(errors > 0) AS affected_sessions,
topKArray(5)(error_codes) AS top_error_codes
FROM (
SELECT
sessionId,
anyIf(contentId, event = 'metadata' AND contentId != '') AS content,
countIf(event = 'error') AS errors,
groupArrayIf(JSONExtractString(payload, 'code'), event = 'error') AS error_codes
FROM default.epas_default
WHERE timestamp > now() - INTERVAL 7 DAY
GROUP BY sessionId
)
GROUP BY content
HAVING total_errors > 0
ORDER BY total_errors DESC
LIMIT 20;
Concurrent Viewers (Last Hour)
Approximate concurrent viewer count over the past hour in 5-minute buckets.
SELECT
toStartOfFiveMinutes(timestamp) AS bucket,
uniqExact(sessionId) AS concurrent_viewers
FROM default.epas_default
WHERE event IN ('heartbeat', 'playing')
AND timestamp > now() - INTERVAL 1 HOUR
GROUP BY bucket
ORDER BY bucket ASC;
Bitrate Distribution
Understand what quality levels your viewers are experiencing.
Bitrate is only recorded if your player reports
bitrate_changed events. The payload value is in
Kbps, so dividing by 1000 gives Mbps.
SELECT
round(JSONExtractFloat(payload, 'bitrate') / 1000, 1) AS bitrate_mbps,
count() AS event_count,
uniqExact(sessionId) AS sessions
FROM default.epas_default
WHERE event = 'bitrate_changed'
AND JSONExtractFloat(payload, 'bitrate') > 0
AND timestamp > now() - INTERVAL 7 DAY
GROUP BY bitrate_mbps
ORDER BY bitrate_mbps ASC;
Export & BI Tools
IntegrationsExport to CSV (HTTP API)
Use the ClickHouse HTTP interface to download query results directly as CSV:
curl "https://{host}/?database=default&user={username}&password={password}" \
--data "SELECT * FROM epas_default WHERE timestamp > NOW() - INTERVAL 1 DAY FORMAT CSV" \
-o events.csv
Connect BI Tools
ClickHouse supports JDBC and ODBC drivers for connecting BI tools:
Query with SQL or an AI assistant
Connect AI Assistants to Your Analytics Database
Open Analytics is built on ClickHouse, the open-source analytics database, chosen for real-time analytics at any scale.
Open Analytics includes ClickHouse MCP (Model Context Protocol) support - AI assistants like Claude, Cursor, and GitHub Copilot can query your analytics database directly using natural language.
Your player analytics are already queryable by AI agents - no data warehouse to connect. Claude, Cursor, or GitHub Copilot can query session data, rebuffering events, and startup times directly via the pre-configured ClickHouse MCP.
What You Can Do
Setup: Local MCP Client (Claude Desktop / Cursor)
Add this to your Claude Desktop or Cursor MCP configuration. Replace the placeholders with your pipeline's connection credentials from the section above.
{
"mcpServers": {
"clickhouse": {
"command": "uv",
"args": ["run", "--with", "mcp-clickhouse", "--python", "3.10", "mcp-clickhouse"],
"env": {
"CLICKHOUSE_HOST": "{host}",
"CLICKHOUSE_PORT": "443",
"CLICKHOUSE_USER": "{username}",
"CLICKHOUSE_PASSWORD": "{password}",
"CLICKHOUSE_DATABASE": "default",
"CLICKHOUSE_SECURE": "true"
}
}
}
}
mcp-clickhouse runs read-only by default
(CLICKHOUSE_ALLOW_WRITE_ACCESS=false), but the SQL
Access user has write grants, so do not enable write access in
the MCP config.
SDK Documentation
Integrate video player analytics into your applications with our official SDKs. Built on the Eyevinn Player Analytics Specification (EPAS) for standardized, vendor-neutral event tracking.
Getting Started
All Open Analytics SDKs follow the same pattern: initialize with your Eventsink URL, attach to your player, and analytics data flows automatically to your dashboard.
- Automatic event tracking for play, pause, seek, buffering, and errors
- Periodic heartbeat events for engagement metrics
- Bitrate and quality change monitoring
- Custom metadata support for content identification
Configuring SLA Alerts in Grafana
Alerting Pitfall
When you build a Grafana-managed alert rule against your Open
Analytics metrics, note that its
DatasourceNoData and
DatasourceError cases evaluate as
independent alert instances with their own labels.
Silences, mute timings, and notification policies applied to
the primary rule may not apply to them. To be notified when
the pipeline goes quiet (not just when a threshold
breaches) configure routing for the No-Data / Error
instances explicitly.
See Grafana’s create Grafana-managed alert rule and alert rule state and health docs.
Installation
npm install @eyevinn/player-analytics-client-sdk-web
Quick Start
The PlayerAnalyticsConnector automatically captures events from your HTML5 video element:
import { PlayerAnalyticsConnector } from "@eyevinn/player-analytics-client-sdk-web";
const analytics = new PlayerAnalyticsConnector("YOUR_EVENTSINK_URL");
await analytics.init({
sessionId: crypto.randomUUID(),
heartbeatInterval: 30000
});
analytics.reportMetadata({
contentId: "YOUR_CONTENT_ID",
contentTitle: "YOUR_CONTENT_TITLE",
deviceType: /Mobi/i.test(navigator.userAgent) ? "mobile" : "desktop",
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
});
const videoElement = document.querySelector("video");
analytics.load(videoElement);
// When playback ends
analytics.reportStop();
analytics.destroy();
Device and content breakdowns need this call; the
timeZone key fills the Country breakdown from the
device time zone, since hosted pipelines get no client IP.
Features
Installation
Add JitPack repository and dependency:
// settings.gradle
maven { url 'https://jitpack.io' }
// build.gradle
implementation("com.github.Eyevinn:player-analytics-client-sdk-android:v1.1.2")
JitPack versions are the git tags (with the v
prefix). For the latest, see the
releases page.
Quick Start with ExoPlayer
val tracker = VideoAnalyticsTracker.Builder(context, exoPlayer)
.setEventSinkUrl("YOUR_EVENTSINK_URL")
.setContentTitle("Video Title")
.setDeviceType("Android")
.setHeartbeatInterval(30_000L)
.build()
tracker.startTracking()
exoPlayer.play()
// In onDestroy()
tracker.stopTracking("user_exit")
tracker.release()
Device and content breakdowns need this call; country needs geo, which hosted pipelines do not collect yet.
Features
Installation (Swift Package Manager)
File → Swift Packages → Add Package Dependency...
https://github.com/Eyevinn/player-analytics-client-sdk-swift
Quick Start with AVPlayer
import VideoStreamTracker
class VideoPlayerViewController: UIViewController {
var player: AVPlayer!
var logger: AVPlayerEventLogger!
override func viewDidLoad() {
super.viewDidLoad()
player = AVPlayer(url: videoURL)
logger = AVPlayerEventLogger(
player: player,
eventSinkUrl: URL(string: "YOUR_EVENTSINK_URL")!
)
}
}