SCTE-35 does not insert anything. It marks the opportunity — a timed message saying a break begins here and lasts this long. Everything between that message and an advert on screen is a separate system making four decisions in sequence, and each one is a place the break can go wrong.
It helps to stop thinking of SCTE-35 as ad insertion and start thinking of it as the first of four steps. Only one of them is the marker. The other three are yours to build or buy, and a break that fails almost always failed at a specific one of them.
The upstream feed emits a splice_info_section: a break starts at this timestamp, for this duration, of this type. This is the only part SCTE-35 does.
Something downstream has to actually see it. The cue arrives as a transport-stream section or as a playlist tag, and whatever reads it must understand the form your packager chose to emit.
What fills the break? A fixed sponsor reel, a house promo, or a call to an ad decision server that returns a creative for this viewer, this region, this moment.
The fourth step is splice: put the chosen content into the stream at the marked point and return cleanly when the break ends. On the server side that means the advert becomes ordinary video segments in the same encode as the programme. On the client side it means telling the player to cut away and come back. Those two produce very different viewer experiences, which is the subject of the SSAI versus CSAI comparison.
| Symptom you see | The step that failed | What to check first |
|---|---|---|
| No break at all, ever | Signal or Detect | Pull the media playlist and look for CUE-OUT, DATERANGE and OATCLS. If none are present, nothing downstream can act. |
| Break fires, but seconds early or late | Signal — timing | Segment duration and pre-roll. Rounding to the nearest segment boundary explains most sub-ten-second errors exactly. |
| Break fires on some breaks, not others | Detect | Cue form drift. A packager can emit DATERANGE for one break type and CUE-OUT for another; a reader configured for one sees half. |
| Break opens and never closes | Signal — pairing | A CUE-OUT with no matching CUE-IN. Your insertion system should treat break_duration as a hard timeout so this cannot strand viewers. |
| Right timing, wrong or blank creative | Decide | The ad decision call: timeout, empty response, no fill. A house-promo fallback turns this from dead air into unsold inventory. |
| Viewer sees a stall or black frame at the cut | Splice | Discontinuity handling and encode mismatch. If the advert is a different resolution or frame rate, the player has to re-initialise at the seam. |
| Works in your player, fails on a smart TV | Splice | Client-side insertion depends on the playback surface. Server-side does not, which is the main reason channels move to it. |
SCTE-35 carries no creative and no reference to one. The decision layer is entirely separate and entirely yours.
A cue is a property of the stream, not of a viewer. Per-person targeting has to come from somewhere else — a session, a player, a consent signal.
The marker says an opportunity exists, not that anyone bought it. Yield lives in the decision layer and in your reporting, not in the signalling.
Confirmation is a downstream concern. A cue firing correctly is not evidence that a viewer saw anything.
Nothing in the cue guarantees your advert is the same resolution, frame rate or audio layout as the programme. That mismatch is the usual cause of a visible seam.
Duplicate cues from two hops are common. Deduplicating on event id is your job, and skipping it produces double insertions.
This is the most reported symptom and it is almost always arithmetic rather than a fault. Suppose the cue asks for a splice at 14:32:10.000 and your packager produces six-second segments starting on the minute.
cue pts_time -> 14:32:10.000 (the editorial moment)
segment boundaries -> 14:32:06.000
14:32:12.000 <- the splice actually lands here
observed drift -> +2.000 s
with 2 s segments -> boundary at 14:32:10.000, drift 0.000 s
with 10 s segments -> boundary at 14:32:20.000, drift +10.000 sThe drift is bounded by your segment duration and nothing else. That gives you a real lever: shorter segments buy precision at the cost of more requests, more playlist churn and more CDN overhead. If a two-second miss is acceptable for your channel — and for a sponsor overlay it almost always is — the cheapest fix is to stop chasing it.
Where precision genuinely matters, frame-accurate insertion is a different and considerably more expensive pipeline. It is worth being clear about which one your rights agreement actually requires before paying for the second.
Most of the channels we work with in India do not have usable SCTE-35 at all. The upstream feed never carried it, or it did and three hops later it does not. Waiting until the signalling chain is fixed means waiting to monetise, and that wait has no revenue in it.
Schedule-driven insertion is the pragmatic starting point: a spot every ten minutes, a sponsor L-bar for a whole innings, a lower third every quarter. It needs no markers, no ad decision server and no cooperation from whoever runs the feed upstream. When the cues do become reliable, the same pipeline switches from clock to cue without re-plumbing anything — the decision and splice layers do not care where the trigger came from.
If you want to know what your stream actually carries today, send us one live URL. The checks we would run are listed on the SCTE-35 validator page, and the tags we look for are on the HLS manifest page.
It is ad insertion driven by markers already present in the stream rather than by a clock. The broadcast feed carries SCTE-35 messages that say a break starts here and lasts this long; an ad insertion system reads those messages, decides what to play, and splices it in at that exact point. The alternative — schedule-driven insertion — ignores the stream and inserts on a timer instead.
No, and this is the most common misunderstanding. SCTE-35 carries no video, no audio and no creative. It is purely a timed signal that an opportunity exists. Something else — a server-side ad insertion pipeline, an ad decision server, a splicer — has to decide what fills the opportunity and actually put it there.
Yes. An ad decision server is only needed when the creative choice is dynamic — different viewers, different regions, real-time bidding. If you are running a fixed sponsor reel or a house promo, the cue tells you when and your own scheduler decides what. Many regional channels run exactly this way, and it removes an entire vendor from the chain.
Usually segment-boundary rounding. A splice point can fall anywhere, but an HLS segment is an indivisible unit, so most systems move the actual cut to the nearest segment boundary. With six-second segments your break can land up to six seconds away from where the cue said. Shorter segments reduce the error and increase request overhead; that trade-off is the whole tuning exercise.
The break stays open. A well-built insertion system treats break_duration from the cue-out as a hard timeout and returns to programme when it expires, precisely so a missing cue-in cannot strand viewers in an advertising state. If your system does not do that, a single dropped tag can take a channel off air for the length of a missing return.
No. Server-side insertion works from a schedule with no markers at all, which is how most channels we work with start. SCTE-35 becomes worth the complexity when breaks have to land on real editorial moments, or when a rights agreement obliges you to honour the upstream break exactly.
What the marker is, what it carries, and the six places it goes missing.
The pipeline that acts on the cue and stitches the advert into the live stream.
Why the splice itself is where players stutter, and what to test on your own feed.
You get a plain report: which cues are present, whether every break opens and closes, whether the durations agree, and the first hop where the signal disappears. One URL, one working day, and no obligation to buy anything.

Video-technology engineer in Thane, India. Send me one live stream URL and I will run a free test on your own feed. You get my reply within one working day (IST), from the person who builds it, not a sales queue.
Send us one live URL and what you want on it. We will put a demo on your own feed before you commit to anything.