The problem is a supporter paying into dead air
Picture a viewer who tips for a TTS message at the exact second a midroll break begins. The message reads, the voice is great, the overlay animates, and a chunk of the audience sees an ad instead of any of it. The streamer never reacts because they are waiting out the break too. The viewer who paid gets the worst version of the feature, and they will remember it.
Ads are one of the few things on a Twitch stream that change what viewers see without changing what your OBS scene looks like. Your browser source keeps playing. Your queue keeps advancing. Everything looks healthy on your side while the public experience is something else. That mismatch is the whole reason ad breaks deserve their own rule in a paid-moment setup instead of being treated as general pacing.
What Twitch actually tells your tools
Twitch's EventSub reference documents a channel.ad_break.begin notification that fires when a midroll commercial break runs, whether the streamer started it by hand or the Ads Manager scheduled it. The payload includes duration_seconds, started_at, an is_automatic flag, and the requester. Reading it needs the channel:read:ads scope on the broadcaster's authorization.
Two details in the docs shape every decision below. First, Twitch warns there can be a delay between the event, the moment the streamer requested the break, and the moment viewers actually see ads. Second, the subscription types list has a begin event for ad breaks and no matching end event. Anything that wants to know when the break is over has to compute it, and the computed answer is only an estimate.
The Get Ad Schedule endpoint fills the planning side. It returns next_ad_at (empty if nothing is scheduled or the channel is offline), last_ad_at, the duration of the upcoming break, preroll_free_time, and snooze_count with snooze_refresh_at. Twitch also notes that a new ad cannot run until eight minutes after the previous one, which gives you a floor for how often this problem can come back.
- Begin event: tells you a break started and how long was requested.
- No end event: you estimate the release time and verify it by eye.
- Ad schedule: tells you when the next automatic break is planned, so long items can be scheduled around it.
- Eight-minute gap: after a break, you have a guaranteed quiet stretch to run longer paid moments.
Three policies: hold, shorten, shift
Hold means nothing new starts while the break runs. Items keep their place in line and play after the break. This is the right default for paid TTS and Upload Corner images because the viewer's purchase is preserved without being wasted.
Shorten means the queue stays open but items that normally run long get trimmed, such as capping TTS reads shorter or skipping the long entrance animation. This is a decent fit for the few seconds before a scheduled break, when a full read might straddle the start.
Shift means the queue does not move at all but your pricing or availability moves with it. If a streamer knows a big ad block is coming, they can close the expensive tier early and reopen it after. Most channels will not bother, but for charity streams or sponsor segments where every paid message is a featured moment, it is worth doing.
- Default for paid TTS and viewer images: hold.
- Default for the last 20 to 30 seconds before next_ad_at: shorten.
- For marquee segments: shift or close the tier ahead of time.
The release math, with a real example
Say your tool receives channel.ad_break.begin with duration_seconds of 90 and started_at at 20:14:00. Hold immediately. Do not wait for viewers to see the ad before holding, because the documented delay means the break may already be reaching viewers while your tool is still deciding.
For release, add a buffer to the requested length. Twitch's Start Commercial reference says it tries to serve the requested length but the result may be shorter or longer, so the requested number is a target rather than a guarantee. A buffer of 15 to 20 seconds is a reasonable starting point that you should tune after watching a few real breaks. That makes the release time about 20:15:45 to 20:15:50 in this example.
Then do one human check. The streamer or a moderator watches the public stream or a second device. If the stream is back and the host is talking, release the hold. If the ad is still running, extend. Treat the computed time as a prompt for someone to look, not as the trigger that decides the outcome on its own.
Use next_ad_at to stop starting long items
The ad schedule is the quieter half of the setup. If next_ad_at is two minutes away, a 40-second TTS read plus a 15-second overlay is safe. If it is 25 seconds away, the same item will land across the boundary and half of it will be wasted.
A workable rule is simple arithmetic: do not start an item whose full runtime would cross next_ad_at minus a lead of 10 seconds. Items that do not fit stay at the front of the queue instead of being skipped. When a break starts, they are first in line to play afterward.
Streamers on Ads Manager can also snooze the next automatic break. Twitch's API describes the snooze as pushing the upcoming automatic mid-roll back by five minutes, and it mirrors the snooze control in the creator dashboard. Use snooze to protect a live game moment or a scheduled segment, not as a way to squeeze in one more paid read. Supporters will forgive an ad. They will not forgive a streamer who clearly bent the show around monetization.
What to do with something already playing
Breaks do not always arrive when the queue is idle. A TTS voice may be halfway through a sentence when the begin event lands. For text-to-speech, let the current read finish, because cutting audio mid-word is more jarring than a short overlap, and hold everything behind it.
Timed visuals are different. A viewer image that is set to display for 15 seconds will keep its timer running during the ad. If your tool supports it, pause the display timer along with the queue. If it does not, accept the loss on the item that was already on screen and make sure the next one does not suffer the same fate.
Whatever you pick, write it down as one sentence in the moderator notes, such as: finish the current read, hold the rest, replay the interrupted image after the break. Without that sentence, two moderators will make two different calls on the same night.
Who flips the switch
Twitch's Start Commercial reference says only the broadcaster can start a commercial through the API, and that editors and moderators may not start one that way. Twitch's roles help is a little broader. It lists running commercial breaks among the things an editor can do from the dashboard, while the moderator duties it describes cover chat, polls, and Predictions rather than ads. So a manual break begins with the streamer or an editor, and everyone else only learns about it if that person says so or the tools do.
That makes the signal the weak point. A streamer or editor who runs ads by hand should say something short on voice or in the mod channel before pressing the button, such as: ad in 20 seconds, hold the queue. A streamer who relies on Ads Manager can check the schedule before the stream and give the team the likely window.
Whether a paid queue can react to an ad event automatically depends on your tooling. If your paid queue has a moderator hold state, which is the kind of control a moderated queue in StreamableBot is meant to give your team, then a human can flip it on cue. Do not assume anything reacts to Twitch ad events by itself unless you have tested exactly that in your own setup.
Use the break to clear the backlog
A hold sounds like lost time, but for moderators it is the quietest stretch of the show. Nothing new is going out, which means the pending list can be reviewed without a clock running. Approve what is clearly fine, reject what is clearly not, and flag the borderline items for the streamer before the break ends.
The payoff is a shorter queue and decisions that are already made, so the streamer comes back from the break to a clean list. If your moderators keep falling behind, ask whether they are using ad time at all.
Say it to viewers in one line
A short line on the overlay or in chat prevents most complaints. Something like: ad break running, paid messages are saved and will play right after. That is more honest than silence and costs nothing.
Keep a second line ready for the case where something expired anyway: that one got caught by the ad, it will replay at the top of the queue. Replaying the interrupted item first is the cheapest way to keep a supporter happy. It also protects your refund workload, because most complaints come from viewers who feel ignored rather than from viewers who lost money.
A short test before you rely on it
Run the whole path once while no supporters are watching closely. Confirm which authorization your tooling uses and whether it has the ad scope. Start a short break, watch the begin event arrive, and time how long the public output actually takes to change. Compare that against your buffer. Twitch's developer tools include an event command for sending mock events, but check that the ad break type is supported before depending on it.
Then run one scheduled-ad drill. Queue a long item shortly before next_ad_at and confirm it does not start across the boundary. If it does, your lead is too small. If everything waits too long, your lead is too large. Two or three drills is enough to tune it.
- Check that the ad scope is granted for the channel you are testing.
- Time the gap between the begin event and the public output.
- Confirm held items keep their place and replay in order.
- Confirm the viewer-facing line appears and disappears with the hold.
Quick answers
Does Twitch send an event when an ad break ends?
Not in the EventSub subscription types list we checked. There is a begin notification with duration_seconds and started_at, so your tool has to estimate the end and someone should confirm on the public output.
Who can start an ad break?
The streamer, and an editor from the dashboard according to Twitch's roles help. Twitch's Start Commercial API is broadcaster-only, and regular moderators are not listed with ad duties. Moderators should get a heads-up from whoever runs the break, or plan around the Ads Manager schedule.
Should I snooze ads to protect a big paid moment?
Rarely. Snooze is better used to protect a live segment or a scheduled event. If you snooze for every paid read, the show starts to bend around monetization and viewers can tell.
What if my tool cannot read ad events?
Use a human cue. The streamer announces the break, a moderator puts the paid queue on hold, and the same moderator releases it after confirming the stream is back. The policy matters more than whether the switch is automatic.
