Skippable in-stream bills at 30 seconds: cut a 30-second version

Google bills skippable in-stream per view at 30 seconds watched, or full length if shorter. Cut a 30-second version of a long master with video-trim.

4 min readSume
All posts

A skippable in-stream ad has no maximum length, but the bill has a 30-second hinge. Google's video specs page says skippable in-stream uses CPV bidding, where you pay when a viewer watches 30 seconds, or the whole video if it is shorter than 30 seconds, or interacts with it (read 2026-10-07). A 30-second version of your master means the view is complete at the point you pay for it.

Sume's video-trim makes that version for $0.02 and leaves the long master untouched.

The lengths and billing on Google's page

From Google Ads video ad specs.

YouTube ad length and billing lines (read 2026-10-07)
FormatLength on the pageBilling on the page
Skippable in-streamno max (under 3 minutes recommended)CPV: 30 s watched, or full length if shorter, or interaction
Non-skippable in-stream15-60 s depending on campaign subtypeTarget CPM (impressions)
Bumper6 s (5 s minimum)Target CPM (impressions)
YouTube Shorts adsunder 60 s recommendedTarget CPM, or TrueView views

Decide with the hinge

A view is paid at 30 seconds or on interaction, so a 3-minute ad and a 30-second ad pay on the same event. The difference is what the viewer sees by then. If the first 30 seconds of the long master carry the offer and a clean ending, cut at a natural stop; if the story needs two minutes, keep the long one and accept that the pay point lands mid-story.

I am not claiming either choice costs less or converts better. The page defines the trigger, and nothing else.

Cut the 30-second version

Video trim takes a clip hosted on media.sume.com, start, and one of end or duration. The source can be up to 1800 seconds, so a 3-minute master is no problem. The script builds the body and refuses nonsense before you spend a call.

import json


def trim_body(url, start, seconds, master_seconds):
    if start < 0 or start + seconds > master_seconds:
        raise ValueError("range outside the master")
    return {"video_url": url, "start": start, "duration": seconds}


body = trim_body("https://media.sume.com/artifacts/artf_demo/master-180s.mp4", 0, 30, 180)
print(json.dumps(body))

Check the result

Poll the job as described in Jobs and results, then use video inspect to confirm duration_seconds is 30 or a little under. A trim that runs past the source end clamps and adds trim_clamped_to_source to warnings[], so read the warnings.

A cautionary note

Google's line concerns what triggers the charge. It says nothing about how well each length performs, and I have no numbers. Test the two cuts against each other in your own account rather than assuming the shorter one wins.

Also keep the first five seconds in mind for skippable formats: the viewer can skip early, so the opening matters more than the length. A related post covers sampling those first frames with video-inspect.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume