How to Serve Outstream Video Ads in Banner Slots with Google Ad Manager

Outstream video lets you serve video ads in your normal banner ad units. The BiddingStack video player renders a VAST ad inside the existing slot, so you can bring video demand into display inventory without new placements, a separate player embed, or page changes.

Everything runs inside a Google Ad Manager creative, so no page changes are needed. The slot keeps a fixed 16:9 size for the whole lifecycle, so the page layout never shifts.

If you would rather place the player directly on the page instead of going through a display creative, see How to Serve Outstream Video Ads with Google Ad Manager and BiddingStack Video Player.

How It Competes

The video ad is requested only after the display line item wins the slot. You set a fixed CPM rate on the line item serving this creative, and that rate is what competes in the display auction.

Pick a rate that reflects what your video demand actually pays. Too high and the line item wins impressions it cannot monetize; too low and it rarely serves. Review delivery and revenue after a few days and adjust.

What You Need

  • A Google Ad Manager video ad unit, separate from the display ad unit that serves this creative. Using the same ad unit for both causes a serving loop.
  • A display line item booked at a fixed CPM that can serve a 640x360 (or your preferred 16:9) creative.

Trafficking Checklist

  • Line item: fixed CPM rate, priced to match your expected video revenue.
  • Creative type: Third party / Custom HTML.
  • Booked size: 640x360, 1x1, or another 16:9 size that matches your slot.
  • Video ad unit path: replace iu=/124312541/video01 with your own video ad unit path. It must be different from the display ad unit serving this creative.

The Creative

Paste this into the Custom HTML / third party creative body:

<script src="https://pubtm.com/serve/tag.js" async></script>
<script>
  (function () {
    // Size from GAM macros, fallback to 640x360 (16:9)
    var w = parseInt("%%WIDTH%%", 10) || 640;
    var h = parseInt("%%HEIGHT%%", 10) || Math.round(w * 9 / 16);

    var vastUrl =
      "https://securepubads.g.doubleclick.net/gampad/ads" +
      "?iu=/124312541/video01" +  // your VIDEO ad unit (not the one serving this creative)
      "&env=vp&output=vast" +
      "&sz=" + w + "x" + h +
      "&gdfp_req=1&unviewed_position_start=1" +
      "&url=%%PATTERN:url%%" +
      "&description_url=%%PATTERN:url%%" +
      "&correlator=%%CACHEBUSTER%%";

    async function renderVideo() {
      document.body.style.margin = "0";

      await window.BID_AD.displayAd({
        placement: "banner",
        mediaType: "video",
        data: { vastUrl: vastUrl },
        config: {
          width: w,
          height: h
        },
      });
    }

    (function waitForTag() {
      if (window.BID_AD && window.BID_AD.displayAd) {
        renderVideo().catch(console.error);
      } else {
        setTimeout(waitForTag, 50);
      }
    })();
  })();
</script>

Need help setting up the video ad unit or line items? Contact the BiddingStack team.

Stay ahead in ad monetization

Header bidding, yield, and ad tech insights for publishers. A few emails a month, no spam.

By subscribing you agree to our privacy policy.