Server-Side Ad Insertion (SSAI) and SCTE-35 Explained
How SSAI stitches ads into the manifest, what SCTE-35 and HLS DATERANGE/CUE-OUT actually signal, and why beaconing is the hard part.
Ads in streaming come in two flavors. Client-Side Ad Insertion (CSAI) has the player pause content, fetch an ad, and play it — easy to build, easy to block, and prone to buffering at the ad boundary. Server-Side Ad Insertion (SSAI), sometimes called ad stitching, splices ad segments directly into the content stream so the player sees one continuous timeline. This post explains how SSAI works, the signaling it relies on, and the tracking problem it creates.
What SSAI actually does
At its core, SSAI is manifest manipulation. An SSAI service sits between the origin and the viewer. For each session it:
- Reads the content manifest and finds the ad break markers.
- Calls an ad decision server (ADS) — typically returning VAST/VMAP — to decide which ads to play in each break.
- Transcodes/packages those ads to match the content's rendition ladder (same resolutions, codecs, and segment duration — conditioning).
- Rewrites the manifest so the ad segments appear inline, then serves a per-session, personalized manifest to that viewer.
Because the ad segments are the same format as the content and live on the same CDN, the player cannot tell them apart — which is exactly why ad blockers struggle against SSAI.
Signaling: where the breaks are
SCTE-35
SCTE-35 is the broadcast standard for marking ad opportunities. In a live
transport stream it rides as cue messages carrying a splice_info_section with
a splice_insert or time_signal command, segmentation_descriptors (e.g.
Provider Ad Start / Distributor Ad Start), and timing. When that content is
packaged into HLS or DASH, the SCTE-35 payload is carried into the manifest.
HLS: DATERANGE and CUE-OUT/CUE-IN
In HLS you will see ad opportunities expressed two ways:
#EXT-X-CUE-OUT:30.000
#EXTINF:6.000,
ad_0.ts
...
#EXT-X-CUE-IN
or, carrying the raw SCTE-35, as a DATERANGE:
#EXT-X-DATERANGE:ID="ad-1",START-DATE="2026-03-10T12:00:00Z",DURATION=30.0,SCTE35-OUT=0xFC30...
CUE-OUT/CUE-IN mark the span; DATERANGE is the modern, richer carrier that
preserves the SCTE-35 binary. In DASH the equivalent is a new Period (or an
EventStream with scte35:Signal).
HLS Interstitials
Apple's EXT-X-DATERANGE with CLASS="com.apple.hls.interstitial" is a
newer, increasingly common approach that points the player at a secondary
asset (the ad pod) to play at a primary timeline offset — a hybrid that gives
SSAI-like UX while keeping ad tracking client-side and accurate.
You can surface all of these — DATERANGE, SCTE-35, interstitials, and DASH ad periods — on a timeline with the SSAI / ad markers tool, and unwrap the ad responses with the VAST viewer.
Tracking, VAST, and beaconing — the hard part
An ad isn't "served" until the buyer's tracking events fire. VAST creatives
define tracking URLs for impression, start, firstQuartile,
midpoint, thirdQuartile, and complete. With CSAI the player fires these
directly. With SSAI the player isn't aware of ad boundaries, so something else
must beacon.
This is genuinely hard:
- Who beacons? Either the SSAI server fires events based on segment delivery (server-side beaconing — but delivery is not playback), or the client uses a tracking metadata endpoint that maps timeline positions to events and fires them as playback crosses them (client-side beaconing — more accurate, requires SDK cooperation).
- In-band timing. SSAI often injects ID3 /
emsgtimed metadata at ad boundaries so the client can detect "an ad just started" at the right PTS; you can capture that with the ID3 / timed-metadata tool. - Quartile accuracy. A server can't know the viewer paused, seeked, or lost the connection mid-ad, so server-side quartiles overcount. Most premium SSAI deployments converge on client-side beaconing driven by a tracking endpoint for measurement that buyers will accept.
Takeaways
SSAI buys you ad-block resistance and a seamless viewer experience at the cost of per-session manifest generation and a non-trivial tracking pipeline. The signaling (SCTE-35 → DATERANGE/CUE-OUT or interstitials) is the easy, standard part; getting accurate impression and quartile beacons is where real SSAI engineering effort goes.
Try it yourself
Reading about streaming is one thing — pull apart a real manifest, play a stream, and measure its QoE with the toolkit.
Browse all tools