-
Notifications
You must be signed in to change notification settings - Fork 42
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Instream video ad in a Protected Audience multi-seller auction demo #242
Conversation
a7f0710
to
6795a1c
Compare
e7625ba
to
4d27b27
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added some minor comments. Nothing major, but some clarifications seem useful from my perspective.
You should add to this demo or make an independent demo showing publisher video content running after the video ad. Video ad is quite vague; most people refer to ads with content, but this appears to be in banner video. The piece we're curious to see is analogous to this https://googleads.github.io/googleads-ima-html5/vsi/ . Am I reading this accurately? Can the postmessage out of the frame support pre-roll? If so lets make that crystal. |
Hi @patmmccann! Yes, this is a preroll ad and the publisher's video will play after the preroll ad finishes. This is where the publisher's video is: https://github.com/privacysandbox/privacy-sandbox-demos/blob/video-ad/services/news/src/views/index.ejs#L42
Yes, the finalized VAST XML (DSP+SSP VASTs) is post-messaged out a Protected Audience ad iframe to the top-level frame to support a preroll ad.
I've posted the finalized VAST XML that is post-messaged out of the iframe in the descriptions. You can copy-paste that XML into that VAST XML text box on the IMA inspector page to see the preroll ad. Also, we are in the process of trying to deploy this ASAP, and we are targeting sometime next week. However, you can pull down the branch and play around with it yourself locally. |
Hey @kevinkiklee This is a great demo! I think we should also put together an example of this same idea but where the SSP (component seller) does the work, and the DSP buyer's ad server just serves the same XML bytes that they have always served. Seems like the easiest way to support that would be for the renderURL itself to be the thing that changes. Instead of the Interest Group carrying around a renderURL like Edit to add: This would mean the IG needs to carry around different renderURLs for the same ad served through each different SSP the DSP buys through; maybe SSPs can cooperate to reduce that overhead. But let's at least have a demo that shows how to do this with a single SSP and DSP pair, and leave the multiple-buying-paths question for another day. |
@kevinkiklee thanks for clarifying! I recommend you re-title the PR 'Video Pre-roll ad...' Nice work! |
@michaelkleber Sounds good. I'll get that demo started once I wrap up the open PRs. SSP-supplied Render URL approach
The render URL points to the SSP’s video ad serving endpoint, and the DSP’s VAST URI is added as query params. The SSP is now responsible for serving the actual ad that is rendered inside the iframe, and it also contains the finalized VAST XMLs (SSP+DSP VAST XMLs).
|
That seems like a very reasonable implementation, though another choice would be for the SSP's video-ad.html code to fetch the VAST XML directly from the browser and do the wrapping browser-side. I don't know which approach SSPs would like better; it seems to me like they would both work. |
Yea, client-side transformation is definitely doable. For the demo, wrapping on the client-side would be easier to implement, so I'll just go with that now, but I can easily switch the implementation if I receive feedback that SSPs prefer server-side processing. |
Hi, how does this support video fallback? https://support.google.com/admanager/answer/3007370?hl=en This is a highly used feature in video advertising for publishers |
@adamleslie Hi there! The goal of this demo is to show one way to get VAST output from a Protected Audience auction, and the VAST XML can include the fallback video ad information: https://support.google.com/admanager/answer/4517679#:~:text=Fallback%2C%20also%20known%20as%20%22waterfall%22 Then, the SDK implements the fallback logic based on this VAST, like the GAM video fallback flow you linked to. |
Hey, thank you. Just to confirm; the VAST output from a Protected Audience top-level auction would come back as essentially a stitched playlist of multiple VAST XML documents from the various Protected Audience component auctions. The playlist of multiple VAST XML documents would be handled by the renderer, e.g. the IMA SDK - as is done today. Is that correct? Just to confirm.. In the posed scenario I may have 5 or more completely different component auction demand sources expected to be written into a single playlist for delivery and this would also need to include direct advertising which may not be using any Privacy Sandbox components - how all that functions in parallel is not super clear to me |
Hi @adamleslie: No, the Protected Audience auction only allows a winner to come from a single Interest Group buying through a single component auction. Since this demo is based on using the Protected Audience API in the form that is already available in Chrome today, it cannot combine things across multiple IGs. |
Curious about the transition from an opaque URN to VAST XML that can be loaded by a player -- neither |
The method used in Kevin's demo is for the URN, which renders inside an iframe, to cause the XML to load within the rendering iframe and then get postMessage'd out (after some wrapping or transformation). The variants have to do with who takes care of the JS/HTML to load/transform/postMessage the XML: it could be in the hands of the buyer, or the component seller server-side, or the component seller browser-side. |
Ok, so lots of demand goes into the top-level auction; only one demand source comes out of the top-level auction - this would be an issue if that understanding is correct. Summarising, moving to this model may have notable impacts to video advertising fill for Publishers - up to say 50% less fill and thus revenues. Detail: Furthermore, In short,
If you have any further questions on the points I've made - let me know! |
Hi @adamleslie. We have started a discussion post for the video ads here: #254. I've migrated your comment and will respond there. |
If anyone has any comments or questions regarding the video ad demo, please use the discussion post: Demo: Instream video ad in a Protected Audience sequential auction setup |
If you have any questions or comments regarding the video demo, feel free to reply to this discussion post.
This PR implements instream video ad rendering in a Protected Audience multi-seller auction.
In this demo, a pre-roll video ad has been implemented, but the same mechanism can be used to render other video ad types that use the VAST XML standard, such as mid-roll and post-roll instream video ads.
This demo shows one of the ways of handling VASTs in Protected Audience. There are other methods for Protected Audience to handle VAST XMLs, and we will publish more demos of different approaches in the future.
This PR is dependent on the multi-seller PR: #241
The following features have been implemented:
To see the demo:
Description
In this demo, the DSP/SSP VASTs are transformed inside the creative, then post-messaged out of the iframe to provide the finalized VAST to the IMA SDK.
The video ad creative that is served contains the DSP VAST URI and the SSP's endpoint URL that transforms the VAST. From inside the creative, a request to the SSP's VAST endpoint is sent and the DSP VAST URI is included in the request. On the server, SSP wraps its VAST around the DSP's VAST URI and responds back to the creative with the finalized VAST. That VAST is post-messaged from the creative iframe to the top-level frame, and passed to the IMA SDK to render the video ad.
Sequence
DSP's code for interest group config: Code
Note that this is a temporary mechanism until
deprecatedReplaceInUrn()
for component sellers become available in M123: WICG/turtledove#286 (comment).After M123, the buyer can set a macro in the render URL:
https://privacy-sandbox-demos-dsp-a.dev/html/video-ad-creative.html?sspVastUrl=%%SSP_VAST_URL%%
.Then in the component auction config, the seller can define the following:
And at the render time, Protected Audience will replace the
%%SSP_VAST_URI%%
of the winning render URL with the value ('https://privacy-sandbox-demos-ssp-a.dev/vast') that the seller specified in the component auction config.SSP's code for component auction config: Code
However, this functionality is not available for component sellers until M123, and therefore, in this demo, we are adding a render URL for each SSP as a temporary mechanism.
This step will be unnecessary once
deprecatedReplaceInURN()
is supported for component sellers.Bid generation code: https://github.com/privacysandbox/privacy-sandbox-demos/blob/dev/services/dsp-a/src/public/js/bidding-logic.js#L33
The code inside the creative parses the SSP VAST URL and requests the finalized VAST from the SSP's server. The DSP's VAST URI and a unique ID is passed along in the request.
The SSP transforms the VAST and wraps the DSP VAST URI with the SSP VAST XML, along with appending a unique ID to each reporting URL. The response back to the creative frame contains the finalized VAST XML.
Code of interest
Publisher
Ad server (top-level seller)
runAdAuction()
is called)Component SSP
Component DSP
Transformation
The transformation happens on the SSP's server: https://github.com/privacysandbox/privacy-sandbox-demos/blob/dev/services/ssp-a/src/index.js#L184
DSP's VAST URI: https://github.com/privacysandbox/privacy-sandbox-demos/blob/dev/services/dsp-a/src/public/js/video-ad-creative.js#L6
SSP's VAST WRAPPER: https://github.com/privacysandbox/privacy-sandbox-demos/blob/dev/services/ssp-a/src/public/vast/preroll.xml
Finalized VAST XML: