prebid / Prebid.js

Setup and manage header bidding advertising partners without writing code or confusing line items. Prebid.js is open source and free.
https://docs.prebid.org
Apache License 2.0
1.28k stars 2.05k forks source link

Multiple Video adUnit requests result in the same identical winner tag (AppNexus module) #2282

Closed paooolino closed 6 years ago

paooolino commented 6 years ago

Type of issue

Bug?

Description

Consecutive requests issued to prebid.js Video results in the same identical VAST winner tag with AppNexus. The adServer consequently does not compute a lot of valid impressions. The problem was NOT happening in v.1.0.0 or before. I verified it happens with 1.3.0, 1.4.0, 1.5.0. The workaround I found consists of changing the videoAdUnit code appending a progressive integer to any new request.

Steps to reproduce

  1. go to: http://sftnetwork.com/prebid-same-tag-proof/index.html
  2. open Chrome developers console
  3. select the 1.5.0 radio button
  4. click "run test" multiple times
  5. see the tag "s=" parameter in console

Test page

http://sftnetwork.com/prebid-same-tag-proof/index.html workaround: http://sftnetwork.com/prebid-same-tag-proof/index-workaround.html

Expected results

the "s=" parameter should be different for each request. image

Actual results

the prebid-1.5.0 version results in the same tag with the same "s=" parameter multiple times. image

Platform details

Windows 10, Chrome 64. prebid version 1.5.0 (but also tested with 1.3.0, 1.4.0), AppNexus module

Other information

none

mkendall07 commented 6 years ago

@paooolino thanks for the report. Looks like we need a way to mark the bid as "consumed" during the video workflow. Have you thought about what that API would look like? This didn't happen in < 0.x because we cleared all bids every time a new auction was run.

paooolino commented 6 years ago

Hello Matt, it's my pleasure. In my code I remove the adUnit every time and re-add a new one (with the same adUnit.code). The "consumed" flag should be transparent and an API should not be needed as it is an internal check, or am I wrong? Or at least, if possible, there should be an API to clear the bids as you did in the previous versions.

mkendall07 commented 6 years ago

well in the standard banner workflow when we set keys we mark the bids as used but that doesn't work great for video because we don't get a callback letting us know the bid won. I like the idea of a clearing API though. Open to a PR for that.

paooolino commented 6 years ago

One more thing that's not clear to me. Why does it work if the adunit code is different? When I remove the adunit and add a new one with the same code, it shouldn't be enough? Thanks for clarifying.

mkendall07 commented 6 years ago

@paooolino That sounds like another bug :(

I guess that happens because while the adUnit is destroyed, the associated bids are not. So when you add back the adunit with the same code, the bids are associated with it again.

Caspervw commented 6 years ago

Hi @mkendall07 , We're currently running into the same issue where we would like to mark a video advertisement as "consumed". We’re using the IMA3 SDK and can string up the “consumed”-call to one of the events fired. Regarding “Have you thought about what that API would look like?”, a global-scoped function to mark an video-advertisement would do.

We can extract the hb_cache_id or hb_adid from the original call to DFP, so something like this:

pbjs.markVideoBidConsumed(<hb_cache_id> OR <hb_adid>);

What do you think?

P.S. We don't know if the video-ad actually played (it might have lost to another campaign). If we want that, then we’ll need something more elaborate. We could get the cache_id during the vast-parsing process (check if a call is made to prebid-cache) or afterwards by swapping out the vast-tag with a vpaid script (player within a player style).

Caspervw commented 6 years ago

@mkendall07 @jaiminpanchal27 So current TL;DR; There needs to be some way to flag a video-bid as used on pages which run multiple videos (ex. Single page applications).

Bid-cache breaking options:

  1. Make a global function a let it be up to the developer to hook it up to their video system (videojs, ima3 etc.).
  2. Mark the bid consumed if it’s send to DFP.
  3. ….

Bid-cache maintaining options:

  1. Create a custom vast-parser that sends a pulse to prebid if the video is retrieved from the cache.
  2. Use a VPAID player within a player style solution.

I think both of these are outside of the current scope of Prebid. I might be able to help the development, but I need to know which solutions are possible and preferred.

mkendall07 commented 6 years ago

@Caspervw Thanks for bringing this back up to our attention. I think your correct that other options are out of scope of prebid. #1 and #2 above sound good to me. Are you able to contribute a solution fro this?

Caspervw commented 6 years ago

@mkendall07 Sure thing, we’re actually already running a test with #1. First result suggests it fixes our issues (https://github.com/poki/Prebid.js/commit/36843acd94900885ecd9004fb689b76f362a9281). I’ll read the contribution guide and send a pull-request somewhere in the upcoming days.

Caspervw commented 6 years ago

@mkendall07 Here you go, see if you like it.

jaiminpanchal27 commented 6 years ago

Merged #2777

spormeon commented 4 years ago

@Caspervw ( from the info you put on the #5368 ) how do I use this then to just mark the winning outstream bid as used when using bidcache= true and multi boxes bids (banner, native & outstream), if i mark adId , don't i "wipe" banner and native out of bidcache?