Viewer-side QoE
Streamwake + Conviva Analytics

Streamwake + Conviva Analytics.
Session-scoped QoE, correlated against the same frame as CloudFront + CloudWatch.

TESTED

Claim status labels: see definitions.

Conviva instruments the player SDK and emits a session-scoped identity (session id) alongside the QoE catalog — buffering ratio, exits-before-video-start, video-start failures, bitrate-ladder conformance scores, session QoE drops, and an alert notification tier. Streamwake reads the export relay as a per-tenant push-only source and pairs each session-scoped Conviva regression with the Bitmovin + CDN-edge + AWS-side chart on the same investigation timeline.

To enable, toggle the Streamwake → Conviva path on /app/integrations, paste the Conviva Insights workspace + organization label + (optionally) viewer region on the source card, wire one Conviva export relay + alert relay to point at the per-source inbound URL, then click Send test event on the same setup card so the recent-events log lights up before the relay is even configured.

Inbound traffic travels over a single production endpoint — the/api/v1/conviva-events/inbound webhook — which the page-to-tenant resolution maps from the?token=<routerToken> query parameter on every POST. No outbound dispatcher, no vendor-side API key, no shared admin cookie.

Conviva QoE kinds Streamwake receives

Six session-scoped kinds,
one inbound webhook.

One row per discriminator kind the inbound route + correlator read. Each row names the Conviva-side kind, the Streamwake-side classification slug it surfaces as, and the upstream signal that triggers the write.

Conviva kindStreamwake classificationSurfaceTrigger
rebuffer
viewer_side_buffering
/api/v1/conviva-events/inbound?token=<routerToken>Per-session seconds-buffered / seconds-played. Surfaces when the ratio crosses the 0.05 typed baseline. Highest-volume QoE signal on the inbound route.
ebvs
viewer_side_exits_before_video_start
/api/v1/conviva-events/inbound?token=<routerToken>Per-session count of exits-before-video-start. Surfaces on any positive count; a small burst is coalesced into a single record by the Conviva transport itself.
vsf
viewer_side_video_start_failure
/api/v1/conviva-events/inbound?token=<routerToken>Per-session video-start-failure carrying a vendor `reasonCode` (MANIFEST_PARSE_ERROR / LICENSE_FAIL / …). Highest weight in the Conviva heuristic set.
conformance
viewer_side_conformance_drop
/api/v1/conviva-events/inbound?token=<routerToken>Per-session bitrate-ladder conformance (0..1, 1.0 = perfect ladder adherence). Surfaces when conformanceScore lands below 0.6.
sessionQoe
viewer_side_session_qoe_drop
/api/v1/conviva-events/inbound?token=<routerToken>Per-session Conviva QoE score (0..100). Surfaces when the score lands below 70 — pairs against the Bitmovin `qualityScore` family on the same window.
alert
viewer_side_alert_raised
/api/v1/conviva-events/inbound?token=<routerToken>Conviva alert notifications tagged by severity (critical / major / minor / info) + a vendor `alertCode` (CDN_FAILOVER / PLAYBACK_ERROR_RATE / …). Never collapses with Bitmovin telemetry.
Source-card + per-tenant router token

Five fields on the Conviva source card,
one seam that scopes every inbound POST.

The Conviva source card renders five fields. The first four are operator-supplied — Streamwake never diffuses a copy to anywhere else; the fifth is Streamwake-minted and is the seam that scopes every inbound POST to a single tenant. Match the order the source card's expanded form walks through them.

FieldOwned byNotes
accountName
You
Free-form Conviva workspace label an operator on the same tenant can tell apart from a second workspace. Necessary to enable the inbound webhook.
organizationLabel
You
Optional — the mirror of Conviva's organization field on the insights workspace, so a multi-org tenant can label each webhook target.
region
You
Optional viewer-region hint (us-east-1 / eu-west-1 / ap-southeast-1). Anchors the correlator's reason when a Conviva event's `region` matches it.
ingestEndpointUrl
You
Optional — operator-supplied Conviva insights endpoint description. Surfaced on the setup card for visibility; the inbound route is the only required integration.
routerToken
Streamwake
A 24-byte hex token Streamwake mints server-side on the first save. The relay copies it onto `?token=<routerToken>` and into the `sourceToken` envelope field. Resolves the tenant BEFORE HMAC verification (seam reserved for a future `webhookSecret` HMAC integration without a schema change).
One token per source, both sides

The same routerTokenyou copy into the Conviva export relay's URL is what Streamwake resolves the owning tenant from in the inbound pipeline — one token per source row, never shared across tenants, never re-minted (replace by deleting the source row + re-saving). The future webhookSecret surface is reserved but unused on first pass.

How it's wired

Five steps from a blank source card
to a verified QoE event landing on the timeline.

The wire sequence the operator runs to attach Conviva Analytics to Streamwake as a session-scoped viewer-side QoE source. No OAuth flow, no app registration — the connection is one inbound webhook plus a per-tenant router token. Five steps from a blank workspace to the recent-events log below.

  1. 1

    Pick the Conviva Insights workspace + organization label

    In your Conviva analytics account, pick the workspace + organization you want to mirror into Streamwake. The free-form `accountName` + optional `organizationLabel` on the source card are the labels Streamwake renders inline — pick labels an operator on the same tenant can tell apart from a second Conviva workspace.

  2. 2

    Set the viewer region hint (optional)

    If your Conviva insights export relay fans sessions out per-region (us-east-1 / eu-west-1 / ap-southeast-1 / …), set the source card's `region` field to the dominant region so the correlator's region-anchor reason surfaces when a Conviva event's `region` matches. Leave empty to skip the cross-vendor region reason and rely on the typed rebuffer / ebvs / vsf / conformance / sessionQoe / alert classifications.

  3. 3

    Wire the Conviva insights + alerts export relay

    Configure one Conviva insights export endpoint + a Conviva alerts relay to point at the Streamwake inbound URL. The relay POSTs one record per session QoE or alert event with `{ as, sourceToken, envelope }` JSON. Wire it to redirect per event type (rebuffer / ebvs / vsf / conformance / sessionQoe / alert) so a single relay handles all six — the discriminated `envelope.kind` discriminator narrows per event.

  4. 4

    Save the source + mint the router token

    Save the source row on /app/integrations/conviva. The first save mints a per-source `routerToken` server-side (24 bytes hex) — copy the token into your Conviva export relay's URL as `?token=<routerToken>`. Conviva alerts relays do not natively sign HTTP transports, so the `routerToken` is the seam that scopes the relay to the right Streamwake tenant.

  5. 5

    Send a test event + verify the inbound lands

    Click `Send test event` on the setup card. The test-fixture route synthesizes a canonical `rebuffer=0.18` event on the configured account + region + CDN and POSTs it through the same inbound pipeline a relay would land. The recent-events log on the same page lights the moment the inbound closes; the InvestigationCorrelationsPanel on /app/incidents/[id] surfaces the candidate the moment you run the correlation pass with a `convivaCandidateCount === 0 → seed correlator` flow.

No credentials on file

Conviva insights alerts don't sign — the per-source routerToken keyed onto ?token=<routerToken> is the seam. The token is replaced only by deleting the source row + re-saving (the asset stays stable across re-renders — re-generating would break already-deployed relays that point at the old token). The future webhookSecret surface is reserved but unused on first pass.

Live setup

Configure the source,
ship your first QoE event, light the inbound.

The in-page setup island mounts the push-sideConvivaSourceCard and a companion inbound webhook card. Configure the source first, copy the per-tenantrouterToken, wire your Conviva insights export relay to POST to/api/v1/conviva-events/inbound?token=<routerToken>, and hit Send test event to verify the inbound lands on the same investigation timeline the merged panel reads.

Loading Conviva source…
Conviva Analytics webhook
Subscribe a Conviva Insights / Alerts export relay to push per-session QoE events to Streamwake
Webhook not configured

Wire your Conviva insights export relay so a vendor-side HTTP transport POSTs one record per QoE / alert event to the Streamwake endpoint. The webhook shares the per-source routerToken, so the inbound route resolves your tenant from ?token=<routerToken> first and drops the QoE event onto the same investigation timeline the merged panel reads.

Subscription URL
(empty)
Router token
(not configured)
Conviva relay transport hint
(empty)
Viewer region hint
(unset)
Last inbound
(no events yet)
Configure the source first — the inbound route resolves routerToken from that row.
curl smoke line
curl -X POST '?token=<routerToken>' \
  -H 'content-type: application/json' \
  -d '{"as":"__test_fixture__","sourceToken":"<routerToken>","envelope":{"kind":"rebuffer","upstreamId":"smoke-1","eventTime":"2026-09-07T07:02:15.470Z","sessionId":"smoke-session-1","assetId":"topgear-ep05","region":"us-east-1","cdnProvider":"cloudfront","playerType":"conviva-player-web","rebufferRatio":0.18,"durationSeconds":600}}'

Recent QoE events

0 total

Loading…

See the loop run

Run the Free Stream Check,
land a Conviva QoE event on the timeline.

Paste a playback URL into /stream-check — five checks in under a minute, no login. Pair it with the Book-a-demo block below for a guided walkthrough of the per-source router token, the Conviva insights + alerts relay pointer, and the typed session-scoped surfaces the InvestigationCorrelationsPanel reads on the same timeline the Bitmovin + CloudFront pairing already lands on.

Talk to engineering

Book a 20-minute walkthrough on your Conviva Analytics workspace.

We're happy to walk through how the per-sessionrebuffer / ebvs / vsf / conformance / sessionQoe / alertdiscriminator signals map onto your existing Bitmovin + CloudFront + CloudWatch + AWS MediaLive pairing — and how the typed session-scoped classifications surface on the same investigation timeline the merged panel reads. Drop your details below and we'll follow up within 1 business day.