Cache useLocal and IMA params
We recently rolled out an experiment using cache.useLocal. As player for our ads we integrate with IMA directly.
Before this change the high-level flow is:
- Prebid auction
- Create GAM url through Prebid
pbjs.adServers.gam.buildVideoUrl - Feed that URL into IMA, which reaches out to GAM
In this last step IMA adds a bunch of additional params
These include, but are not limited to, supported SDK versions, but also a3p which is some userId provider.
Most of these params are not documented by IMA, and are hard to replicate or set ourselves.
With the change to using cache.useLocal the flow changes:
- Prebid Auction
- Use Prebid
pbjs.adServers.gam.getVastXml - Feed VAST XML into IMA
As Prebid is now doing the network call to GAM ( so it can modify the response and inject the cache blob ) the params that IMA adds are missing.
As a result:
- We saw good results for Prebid partners, and the local cache is a definitive improvement
- Google their share tanked: number of requests are stable, but Google is bidding a lot less ( due to missing userIds etc. )
There is no easy ( or maybe not even a hard ) way to replicate all the params IMA adds to the request to GAM.
So the question is: how are people addressing this, or how can this be improved?
We're corresponding with the GAM team to see if there is anything necessary for adx to bid prebid could add or if the gam team could support blob instead of just http in creatives.
as of dec 2024, this is what ima team said: "As of now, it is not possible for IMA to change its architecture to avoid the iframe from being an issue as described. My recommendation would be to use the PAL SDK to create a nonce for an ad request. Then you could handle ad's VAST directly. Before integrating PAL, consult with your account representative if they are able to use PAL and what signals they should set in their nonce request."
the givn mentioned here might be useful https://developers.google.com/ad-manager/pal/html5/get-started#attach_your_nonce_to_the_ad_request
Thanks for some of these references @patmmccann Dont know whether PAL would solve our problems, as we'd still need to figure out how to pass user ids to google. By delving into this I bumped into this: https://support.google.com/admanager/answer/15509589?hl=en&ref_topic=10728657&sjid=15415451566367020363-EU
Instead of letting IMA send over things through a3p you can also add a query param ssj ( which is not in the list of params https://support.google.com/admanager/answer/10678356?sjid=4216190722298163853-EU ). This seems to be a different way to pass user ids to GAM.
We can implement this ourselves, but seems like something that would be useful to have as an option with Prebid
Whether that actually solves the google demand problem is still to be seen though, as a bunch of other params are also added by IMA.
Ssj looks great! Maybe we should set that instead of a3p. If you base64 decode a3p you can see what's in there, but it mostly just goes to ob partners, not dv3 on adx
One possibility is to basically only let adx fill when prebid fails to bid a certain amount, basically treating adx as a fallback tag instead of letting them compete with prebid.
We suspect given the large revenue improvements some tests have shown that this technique may become popular.
@ReinoutStevens did the improvements justify eliminating adx from your stack?
@patmmccann I work together with @ReinoutStevens so I can answer that question.
The improvements aren't good enough for us to eliminate AdX from our stack.
We also noticed that, while the improvements are very good for bidders that use the public cache, the opposite is true for bidders that use their own cache (like Rubicon). When we experimented with the local cache, those bidders took a hit (quite severe in some cases).
Still not sure what exactly is causing this. But if we could avoid this, we can re-visit our calculations to see if it is worth removing AdX from the stack.
@patmmccann
Has anything come out of your conversation with the GAM team:
We're corresponding with the GAM team to see if there is anything necessary for adx to bid prebid could add or if the gam team could support blob instead of just http in creatives.
@robin-crazygames the GAM team is aware of this thread but hasn't let us know what query string params we need to add for them to bid or given us a timeline for gam to support blobs natively so we don't need to bypass IMA. It seems they remain in an assess and discuss phase.
Hopefully the realization that some publishers, unfortunately not you, find this feature so useful they would consider abandoning adx for video, gets them to engage more closely. cc @zhengweiwithoutthei
@zhengweiwithoutthei we got this advice from the IMA team:
"My recommendation would be to use the PAL SDK to create a nonce for an ad request. Then you could handle ad's VAST directly. Before integrating PAL, consult with your account representative if they are able to use PAL and what signals they should set in their nonce request."
Is the missing nonce the only problem here? @robin-crazygames @ReinoutStevens any chance you guys could try generating the nonce>
@mkomorski can you try adding a PAL generated nonce to the givn parameter in the request? See https://developers.google.com/ad-manager/pal/html5/get-started ? That just might work
@robin-crazygames - we saw drops for Rubicon Xandr and Nativo. I wonder if Microsoft will let people use prebid cache for microsoft bids. One thought is if Rubicon wins (or no one bids), just call without local cache, otherwise call with it
https://github.com/prebid/Prebid.js/issues/14014#issuecomment-3552581669
@patmmccann
we saw drops for Rubicon Xandr and Nativo
I wonder if the reason these drops happen for bidders that use their own cache is the fact that the cache.useLocal flag affects all bids, not just the ones that were using the cache.url to store their bids.
In auction.ts on line 611, all bids get stored in the local cache without looking at whether the bid is already cached on the server side.
If that line is indeed the problem, I don't know if
One thought is if Rubicon wins (or no one bids), just call without local cache, otherwise call with it
would help, or how it would work. After all, I only know that Rubicon won after the auction, by which point that line has already been triggered.
I will start an experiment next week to test this hypothesis of auction.ts being the culprit.