-
Notifications
You must be signed in to change notification settings - Fork 2.1k
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
Floors module enhancement: support hasUserId dimension #10617
Comments
This seems not well chosen; for many publishers there will always be a sharedid. |
Your counter-proposal would be to say "hasUserId" means any EID beyond sharedId? Or go super-surgical and make it highly configurable by the floors provider? e.g. includesUserId: ["idA", "idB", "idC"] That seems a little too much? |
if the goal is to identify if the user is addressable, acceptance of third party cookies or a deterministic identifier are the best choices. Many id modules always answer and just entirely break the logic in your proposal. |
It seems the two id-related factors driving cpm the most are acceptance of 3rd party cookies or the presence of certain eids (eg rampid, uid2) that are email based. I think we still need a proposal following these cuts. I think 'e.g. includesUserId: ["idA", "idB", "idC"]' makes a lot of sense. if I understand Bret's proposal, the outcome would be binary, rather than having different floors for all combinations, one would split floors on 'hasValuableID' or not, right? |
Hello all! Allow me to chime in on a proposed solution(s) There are many ways to do so, here are a couple examples:
{
"modelWeight": 50,
"modelVersion": "List of userIds present",
"schema": {
"fields": [
"mediaType",
"includesUserIds"
],
"delimiter": "|"
},
"values": {
"banner|liveintent,pairId,sharedId": 0.83,
"banner|liveintent": 0.68,
"banner|sharedId": 0.3,
"banner|*": 0.1
}
}
{
"modelWeight": 50,
"modelVersion": "Each User ID own Field",
"schema": {
"fields": [
"mediaType",
"userId.liveintent",
"userId.pairId",
"userId.sharedId"
],
"delimiter": "|"
},
"values": {
"banner|1|1|1": 0.43,
"banner|1|1|0": 0.43,
"banner|1|0|1": 0.43,
"banner|0|1|1": 0.43,
"banner|1|*|*": 0.43
}
}
{
"modelWeight": 50,
"modelVersion": "Each User ID own Field",
"valuableIds": [
"liveintent",
"pairId"
],
"schema": {
"fields": [
"mediaType",
"hasValuableId"
],
"delimiter": "|"
},
"values": {
"banner|1": 0.43,
"banner|0": 0.43,
"banner|*": 0.43
}
} FWIW I think 1 or 2 are the more flexible approaches and better (With number 2 being my favorite due to its shortened number of characters total in a large rule file) But number one may be the most explicit and easiest to integrate with. NOTE: This is a proposal to add this to the default "supported" fields in the priceFloors module. All of these implementations can already be accomplished using the Curious to hear peoples feedback |
Thanks for trying to move this forward @robertrmartinez . One issue is in how to identify different userIds. There's no standard, but there ought to be one so that a floors provider can build floors files for both PBJS and Prebid Server without disjoint IDs for the IDs. The table at https://docs.prebid.org/dev-docs/modules/userId.html#prebidjs-adapters shows 2 possible ways to identify
So either the client-side floors module should refer to the "EID source" to name the user IDs or the server-side floors module is going to have to map from EID source to the arbitrary mess that is bidRequest.userId. FWIW, Magnite already had to implement this mapping for analytics purposes, so it's mostly possible, though annoying and will require maintenance. Are there runtime implications for any of these choices? My understanding of the runtime lookup makes me lean towards option 2. |
Ah yes forgot to add a bit on this good call. I think the right thing is to use EID Source (Even though I have already made the mistake of using Option 1) It is just much more consistent, even if less readable at times where company names change all the time! If needed, floor and analytic providers can / should do the mapping on their end when showing to users I guess. (We prob will need to do so...) |
We decided to do at least option 2 in #10617 (comment) and also option 3 conditional on the implementor wanting to take that on |
A generalization of (3) could look like:
If the criteria is more likely to be "if any of these IDs" (rather than "if at least N of these IDs"), the calculated value could be kept a binary 1/0 for any/none. If both are valuable (and we want to optimize size) we could also do:
|
Nice! Willing to implement both Option 2 and @dgirardi suggestion here. @patmmccann @bretg Any input? Specifically around the A: Value is B: Value is Boolean: Once chosen I think we can do a single PR which introduces BOTH {
"modelWeight": 50,
"modelVersion": "Each User ID own Field",
"schema": {
"fields": [
"mediaType",
"userId.liveintent",
"userId.pairId",
"userId.sharedId"
],
"delimiter": "|"
},
"values": {
"banner|1|1|1": 0.43,
"banner|1|1|0": 0.43,
"banner|1|0|1": 0.43,
"banner|0|1|1": 0.43,
"banner|1|*|*": 0.43
}
} And the tier one Or maybe we just want to only support one? Thanks! |
My take is that Demetrio's "Option 4" is the best compromise. It handles all the use cases. I think the value should be boolean: any ID existing in that tier means that the bid value should be higher, therefore the floor might be raised. I don't see a use case where having 2-of-4 IDs in a tier should result in a different floor from the scenario where there's 3-of-4 IDs available. This is already complicated enough. |
Ok - so your input is we should ONLY implement Option 4 - Boolean? I am fine with that. Can workaround the limitation by having many tiers ;) |
Yes, only 4. I can't see a use case where it makes sense to set individual floors for 50 different user IDs. |
Type of issue
enhancement
Description
In the interest of improving publisher and floor-provider flexibility, we want to add the ability to set different floors for scenarios where there's a user ID available vs when there's not.
While it's understood that this is already possible through custom floors dimensions in Prebid.js, it's not possible in Prebid Server, and is worth community discussion.
hasUserId floor dimension
In addition to the existing dimensions (AdUnit, GPT Slot Name, MediaType, Ad Size, Domain, etc), we propose a new schema dimension that can be used by floors providers:
hasUserId
: true or false.true
value.false
value.And of course floor enforcement for a bidder is done against the value of the floor that's sent to the bidder.
For example, say this is the floors config:
And this is the EIDs config:
In this example, bidderA's floor would be 2.0 assuming the EID is actually set, and the floor for bidderB would be 1.5.
Prebid Floor Rule
We ought to discuss the rules for Prebid Floors. Originally, there was a simple rule:
Then #10410 came along and changed the rule to:
And now this new dimensions prompts a generalization of the essence of the rule:
Commentary
The spirit of the original floors rule was that we don't want publishers accepting only high-value bids from a given bidder for any reason. Prebid should be a level playing field where bidder name is not a factor in setting a floor.
However, publishers ought to be able to tune their floors based on bidder behavior and information given to them.
In the example above, it's not bidderA's name that's making them jump a higher bar, it's that they have access to information that other bidders don't have, so is expected to be able to bid more. In scenarios where an EID is not available, the floor for bidderA and bidderB would be the same.
The text was updated successfully, but these errors were encountered: