Guide

The CTV monetization stack for a small streaming app: what you need, in what order

Five layers sit between a video stream and an invoice. This is what each one does, what it costs, how long it really takes to connect, and which to build first.

Nick Stark · GoGo CTV

The short answer

A connected TV monetization stack has five layers, in this order.

  1. Player and packaging. Encodes your video, packages it as HLS or DASH, marks where breaks fall, and plays it on each device.
  2. Ad insertion. Puts an ad into a break, either server-side by rewriting the stream manifest or client-side by having the player fetch and play the ad itself.
  3. Ad server and decisioning. Receives a request for a break, decides which ads fill it and in what order, and returns them to the insertion layer.
  4. Demand. The sources of paid ads: supply-side platforms that run auctions on your behalf, and direct deals you sell yourself.
  5. Measurement and reporting. Records what was requested, filled, played to completion and earned, reconciled across the layers above.

Most small apps do not need to buy all five as separate products on day one. The rest of this article explains each layer, then sets out an order that gets you to revenue without locking in a structure you will regret.

Layer 1: player and packaging

Everything else depends on the stream being shaped for advertising. Your packager has to emit break markers the insertion layer can read: SCTE-35 cues for live and linear channels, or a break schedule for on-demand content. Your player has to handle what the insertion method requires: honouring discontinuity tags for server-side insertion, or running an ad module on every device for client-side.

What to require. HLS or DASH output with segment durations you control, break signalling that survives your CDN, and a player that behaves the same on Roku, Fire TV, Android TV, Apple TV and the smart TV platforms you support.

What it costs. Packaging is priced per hour of output or as part of a video platform subscription. Players are open source, licensed per active user, or bundled. Commercial terms vary by provider and bundle.

Integration time. If you already stream, adding break markers is typically a week or two. If you do not, this layer is a project in its own right.

Common mistake. Choosing a player because it ships easily, then finding it cannot handle discontinuities. Ask the ad questions before picking the player.

Layer 2: ad insertion

Server-side ad insertion rewrites the playlist so ad segments sit inline with content while the player follows the resulting manifest. Client-side insertion has the player request the ad and play it through a separate module. Our SSAI explainer covers the mechanism and trade-offs, so this stays brief: for connected TV, server-side is the default. It can reduce playback transitions and client-side ad SDK work, but does not eliminate buffering or device-specific validation.

What to require. Manifest-level insertion for HLS and DASH, a documented model for how quartile beacons are inferred from segment requests, creative conditioning that matches your encoding ladder, and session-level logging.

What it costs. Standalone SSAI is priced per stitched stream hour or per thousand ad impressions. When the ad server performs insertion itself, it is normally included in that fee.

Integration time. Pointing the player at a manifest endpoint is a small change. Getting conditioning, beaconing and break-fitting right on every device is where the time goes; two to six weeks is realistic for a small team.

Common mistake. Treating beaconing as solved because impressions appear in a dashboard. Discrepancies against buyer numbers surface weeks later, after the money has been invoiced.

Layer 3: ad server and decisioning

The ad server answers the question the insertion layer asks: this viewer has a ninety-second break starting now, what should fill it? It holds your direct deals, calls your demand sources, applies your rules and assembles the pod. The difference between an ad server and an SSP is explained in CTV SSP vs ad server; in one line, the SSP finds buyers and the ad server decides.

What to require. VAST 4.x in and out, OpenRTB 2.6 with pod signalling so bidders see slot positions and durations, competitive separation and frequency capping applied across the whole pod, priority for direct deals over programmatic, and request-level reporting.

What it costs. Three models: a CPM fee on served impressions, a percentage of revenue through the platform, or ad serving bundled with an SSP without a separate serving fee, subject to commercial terms such as first call on your inventory. A bundled model may lower initial setup cost, but compare minimums, revenue share, portability and migration effort before committing.

Integration time. A standards-based integration onto an existing SSAI setup is often two to four weeks. Migrating from another ad server takes longer, because a baseline, a shadow test and a staged ramp should not be compressed.

Common mistake. Letting the first SSP you sign become your ad server without deciding that on purpose.

Layer 4: demand

A supply-side platform connects your inventory to buyers and runs the auction. Direct deals are sold by you or an agency and delivered as guaranteed campaigns or as deal IDs through an SSP.

What to require. Before any SSP sends meaningful spend you need a published app-ads.txt at the developer URL listed in each app store, so buyers can verify the SSP is authorised to sell your inventory. You also need accurate content and device signals in every request, and pod bidding rather than slot-by-slot requests.

What it costs. SSPs take a percentage of the media spend that clears through them. There is rarely a licence fee.

Integration time. The most underestimated layer. It has its own section below.

Common mistake. Adding a fourth and fifth SSP to chase fill before the first two perform. Each source adds timeouts, discrepancies and reporting work, and duplicated demand rarely lifts price.

Layer 5: measurement and reporting

Every layer produces numbers, and they will not agree. The ad server counts decisions, the insertion layer counts segments played, the SSP counts impressions it was paid for, and the buyer counts something else again. Reporting is the work of reconciling them.

What to require. Request-level logs from the ad server, daily impression and revenue exports from each SSP, completion data from the insertion layer, and one place where they are joined by date and demand source.

What it costs. The dashboards inside your ad server and SSPs may be included; confirm access, export limits and any additional fees in the commercial terms. A separate business intelligence tool is a licence plus someone's time to maintain it.

Integration time. A weekly spreadsheet can exist in a day. An automated pipeline is a few weeks and only pays off with several demand sources.

Common mistake. Watching revenue alone. Revenue can rise while eCPM falls and fill rises, which is a different business from the one you thought you were running.

In what order

This sequence assumes a small team with a working stream and no monetization yet. All timing ranges in this guide are illustrative planning estimates, not measured benchmarks or vendor commitments. Confirm scope, certification, inventory review and engineering availability with your providers.

  1. Make the stream ad-ready

    Add break markers, confirm the player handles discontinuities on every device, and publish app-ads.txt.

  2. Stand up insertion

    Server-side for most CTV apps. Get a test creative stitching cleanly everywhere before involving demand.

  3. Decide who decides

    A dedicated ad server, or your first SSP's bundled serving with a written intention to revisit. Get VAST 4 flowing end to end with house ads first.

  4. Connect one SSP, then a second

    Start with the one that already has a certified path into your ad server. Add a second only once the first fills at a stable rate and reconciles.

  5. Build the weekly report

    Before a third demand source or direct sales. The report tells you whether the next step is worth doing.

  6. Add direct deals and tighten the pod

    Once there is a baseline, this is where the yield gains live.

StepIllustrative planning rangeWhat stretches it
Stream ad-ready1 to 3 weeksUnusual player behaviour; live cues that do not survive the CDN
Insertion stood up2 to 6 weeksWide encoding ladder; beaconing validation
Ad server live2 to 4 weeksMigrating from an existing ad server
First SSP live1 to 4 weeksInventory review, app-ads.txt gaps, creative approvals
Second SSP live2 to 8 weeksServer-to-server build with no certified path
Weekly reporting1 to 3 weeksExport formats that differ per SSP

End to end that is roughly one to two quarters from an ad-free stream to two demand sources and a working report. Teams that already stream and already have an ad server land at the short end.

Integration speed, honestly

The question we hear most from small operators is which SSP goes live fastest. The vendor is rarely the bottleneck. Five things determine speed, and four are on your side.

  • Existing certification with your ad server. If the SSP has already integrated with your ad server, the connection is configuration. If not, it is a build with test traffic and sign-off on both sides.
  • app-ads.txt in place. Buyers will not spend against inventory they cannot verify. An SSP can be connected in days and deliver nothing for weeks if this file is missing.
  • Tag-based versus server-to-server. A VAST tag can be serving the same afternoon. A server-to-server OpenRTB integration takes longer to build but returns richer bids, can carry richer pod information when both endpoints support it; timeout behavior still needs testing.
  • Podding support. If your ad server requests whole pods and the SSP answers single slots, someone has to bridge that gap, and yield suffers until they do.
  • Creative approvals. Every new source brings creative that must be conditioned for your stream and sometimes reviewed for compliance. The first weeks of any SSP are slower for this reason alone.

Magnite, FreeWheel, Amazon Publisher Services and Google Ad Manager offer services to evaluate for CTV monetization, subject to eligibility and integration requirements. Publica belongs in the ad-serving and auction-orchestration evaluation rather than being classified as another SSP, which is why the SSP versus ad server distinction matters when comparing them. We are not ranking them, because the right one depends on your content, regions and ad server.

Why the fastest integration is rarely the best

A tag into an SSP-bundled ad server may be a quick starting path if it supports your playback setup. Ad serving may be available without a separate serving fee, subject to commercial terms. For a very small app that can be a suitable start. But it puts one demand source in charge of your decisioning, pod construction and reporting, and every later change has to be negotiated with a party whose revenue depends on the current arrangement. Choose it knowingly, and set a date to review it.

Reporting and yield: what to watch weekly

Five numbers, every week, by demand source and by device platform.

  • Fill rate in seconds filled against seconds available, not just slots. A ninety-second break with one thirty-second ad in it is a third full.
  • eCPM by demand source, so you see who pays for what rather than a blended figure that hides a falling price behind rising volume.
  • Pod completion, the share of pods watched to the end. A break that empties the room is worth less than its impression count suggests.
  • Ad errors by VAST error code and device. A rising count on one platform usually means a creative or player problem you can fix.
  • Timeouts by demand source. A source that bids high but times out often is costing you the breaks it never answers.

Pod-level metrics matter because decisioning and pod construction are where yield is actually won or lost. Two apps with identical demand earn very different amounts depending on whether the ad server fits the break exactly, fills the highest-value slots first, separates competitors, and drops a low bid rather than leaving a gap. None of that shows in a revenue total. All of it shows in fill seconds, completion and errors.

Where GoGo CTV fits

GoGo CTV is layer three: the ad server and decisioning layer, with insertion performed by the same system so the auction that picks the pod knows exactly how many seconds it has to fill. It sits between your packaging and your demand sources and replaces neither.

An illustrative architecture, not a claim of certified vendor interoperability: a small FAST channel encodes a linear feed with SCTE-35 cues and packages it as HLS behind a CDN. Its players request a manifest from the insertion endpoint. At a break, the ad server prioritizes eligible direct campaigns, requests bids from approved demand integrations, and applies pod-duration, separation and frequency rules. Validate supported protocols, timeout behavior, creative conditioning and request-level reporting for the specific providers selected before going live.

An AVOD app can use a break schedule such as VMAP rather than live cues, depending on the player and insertion implementation. With a compatible architecture, a demand-source change may stay behind the insertion endpoint, but certification or configuration changes can still be required.

When you don't need all of this yet

If your app has a few thousand monthly viewers, no sales team and one engineer, you do not need five vendors. Sign one SSP that bundles ad serving, publish app-ads.txt, run their tag, and put fill and eCPM in a spreadsheet every Friday. This can be a starting stack if the provider accepts your inventory and supports your playback setup; confirm setup fees, minimum commitments and revenue share before signing. Revisit it when you sell your first direct deal and need it to win over programmatic, when you add a second demand source and need something neutral to arbitrate, or when you cannot answer why a break went unfilled. Those are the signals that decisioning has become your problem rather than your SSP's.

Frequently asked questions

What tools do I need in a CTV monetization stack for a small streaming app?

Five layers: a player and packaging pipeline that emits HLS or DASH with break markers, an ad insertion method, an ad server that decides which ads fill each break, demand from one or more SSPs plus direct deals, and reporting by source. A very small app can start with a single SSP that bundles ad serving.

Which SSP integrates fastest with my CTV ad server?

Usually the one that has already certified against your ad server and can be added as a tag or preset endpoint rather than a bespoke build. Speed depends more on your readiness than on the vendor: a published app-ads.txt and a working VAST 4 ad server remove most of the delay.

How long does a connected TV SSP integration take, and which vendors can go live fast?

A certified tag-based connection may require less engineering than a new server-to-server integration. Actual timing depends on inventory review, commercial approval, protocol compatibility, creative conditioning and testing. Treat the ranges in this guide as planning estimates and obtain a scoped timeline from each provider; no vendor is guaranteed to go live fastest.

What tools should I look at for streaming video ad monetization reporting and yield?

Start with the reporting inside your ad server and each SSP, because those hold the request-level data. Reconcile them weekly on fill rate, eCPM by source, pod completion, ad errors and timeouts. A separate business intelligence layer is worth adding only once you have more than two or three demand sources.

Which CTV ad podding and decisioning platforms are worth evaluating for better yield?

Evaluate any platform on whether it constructs whole pods rather than filling slots one at a time, supports OpenRTB 2.6 pod signals, enforces separation and frequency rules across the pod, and reports unfilled seconds. Candidates include dedicated CTV ad servers such as GoGo CTV, FreeWheel and Publica, and the podding features inside Google Ad Manager and Magnite. Test on a shadow slice of live traffic rather than a demo.

Do I need a separate ad server, or can an SSP do it all?

For a very small app, one SSP's bundled ad serving is enough to start. You need a separate ad server once you have direct deals to prioritise, more than one demand source competing for the same break, or a need to control pod construction and reporting yourself. See CTV SSP vs ad server.

The stack checklist

  • Stream emits HLS or DASH with SCTE-35 cues or a VMAP break schedule
  • Player handles discontinuities cleanly on every supported device
  • app-ads.txt published at the developer URL in every app store listing
  • Insertion method chosen, with a documented beaconing model
  • Ad server chosen deliberately: dedicated, or bundled with a review date
  • VAST 4.x end to end, verified with house ads before live demand
  • First SSP live and reconciling; second SSP only after that
  • Pod signals and protocol versions validated for each programmatic integration
  • Weekly report: fill seconds, eCPM by source, pod completion, errors, timeouts
  • Direct deals prioritised over programmatic in the ad server

Related reading

Get started

See the decisioning layer on your own traffic.

We can run the ad server on a slice of your live inventory, side by side with your current setup, and show you fill, latency and yield before you change anything.