Skip to content
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

Add pubProvided to userId.md #2357

Merged
merged 9 commits into from
Sep 30, 2020
Merged
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 79 additions & 2 deletions dev-docs/modules/userId.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ The User ID module supports multiple ways of establishing pseudonymous IDs for u
* **Merkle Merkury ID** - Merkury enables marketers, media owners, and publishers to own, build, and control a cookie-less Private Identity Graph. Merkury uses an organization’s first-party CRM data and valuable interactions such as logins, outbound email campaigns and media reach to create and grow a universe of person-based IDs for cross-channel targeting, personalization, measurement and more.
* **Parrable ID** - an encrypted pseudonymous ID that is consistent across all browsers and webviews on a device for every publisher the device visits. This module contacts Parrable to obtain the Parrable EID belonging to the specific device which can then be used by the bidder.
* **PubCommon ID** – an ID is generated on the user’s browser and stored for later use on this publisher’s domain.
* **PubProvided** - A simple first party publisher provided user id, set and distributed to bid adapters.
* **Quantcast ID** - an ID independent of third-party cookies for publishers with Quantcast Measure tag.
* **Unified ID** – a simple cross-vendor approach – it calls out to a URL that responds with that user’s ID in one or more ID spaces (e.g. adsrvr.org).
* **netID** – provides an open, standardized, EU-GDPR compliant, IAB TCF aware, cross-device enabled Advertising Identifier Framework, which can be leveraged by publishers and advertisers (and vendors supporting them) to efficiently deliver targeted advertising bought through programmatic systems.
Expand Down Expand Up @@ -73,7 +74,7 @@ of sub-objects. The table below has the options that are common across ID system
{: .table .table-bordered .table-striped }
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | May be: `"britepoolId"`, `"criteo"`, `"id5id"`, `identityLink`, `"intentIqId"`, `"liveIntentId"`, `"lotamePanoramaId"`, `"merkleId"`, `"parrableId"`, `"quantcastId"`, `"netId"`, `"pubCommonId"`, `"unifiedId"`, `"zeotapIdPlus"` | `"unifiedId"` |
| name | Required | String | May be: `"britepoolId"`, `"criteo"`, `"id5id"`, `identityLink`, `"intentIqId"`, `"liveIntentId"`, `"lotamePanoramaId"`, `"merkleId"`, `"parrableId"`, `"quantcastId"`, `"netId"`, `"pubCommonId"`, `"pubProvidedId"`,`"unifiedId"`, `"zeotapIdPlus"` | `"unifiedId"` |
| params | Based on User ID sub-module | Object | | |
| storage | Optional | Object | The publisher can specify some kind of local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage. This is not needed when `value` is specified or the ID system is managing its own storage | |
| storage.type | Required | String | Must be either `"cookie"` or `"html5"`. This is where the results of the user ID will be stored. | `"cookie"` |
Expand Down Expand Up @@ -745,6 +746,71 @@ pbjs.setConfig({
});
{% endhighlight %}

### PubProvided ID

The PubProvided Id module allows publishers to set and pass a first party user id into the bid stream. This module has several unique characteristics:

1. The module supports a user defined function, that generates an eids-style object:

```
pbjs.setConfig({
userSync: {
userIds: [{
name: "publisherProvided",
params: {
eidsFunction: getIdsFn // any function that exists in the page
}
}]
}
});
```

Or, the eids values can be passed directly into the `setConfig` call:
```
pbjs.setConfig({
userSync: {
userIds: [{
name: "example.com",
params: {
eids: [{
source: "domain.com",
uids:[{
id: "value read from cookie or local storage",
atype: 1,
ext: {
stype: "ppuid"
}

}]
},{
source: "3rdpartyprovided.com",
uids:[{
id: "value read from cookie or local storage",
atype: 3,
ext: {
stype: "sha256email"
}
}]
}]
}
}]
}
});
```

In either case, bid adapters will receive the eid values after consent is validated.

2. This design allows for the setting of any number of uuids in the eids object. Publishers may work with multiple ID providers and nest their own id within the same eids object. The opportunity to link a 1st party uuid and a 3rd party generated UUID presents publishers with a unique ability to address their users in a way demand sources will understand.

3. Finally, this module allows publishers to broadcast their user id, derived from in-house tech, directly to buyers within the confines of existing compliance (CCPA & GDPR) frameworks.

4. The `eids.uids.ext.stype` "source-type" extension helps downstream entities know what do with the data. Currently defined values are:

- dmp - this uid comes from the in-page dmp named in eids.source
- ppuid - this uid comes from the publisher named in eids.source
- sha256email - this uid is based on an email hash from the entity named in eids.source
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jdwieland8282 maybe this is a discussion for identity committee, but do we really want to support passing the actual hashed email through the bidstream like this? a hashed email is like a fingerprint in that you can't "reset" it - once you have it, you will always have the same link to a set of user data, even if they've asked someone upstream to reset/clear their data. since there's no efficient way (today) to tell EVERY platform in the industry to wipe data for a user, the best way today is simply to generate a new user id. this is just like apple and android allowing you to reset your MAID. identity providers that base an ID off of a hashed email are fine since they can change the ID they generate if the user has asked to reset/opt out at some point.

my suggestion for now is to not include mentions of passing sha256email directly today, and we can discuss in committee meeting next week to see if anyone else agrees with me or if i'm just being overly precautious. thoughts?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thats a fair @smenzer, I can strip that example out for now. I would like to have this discussion in 5775 though. I think defining what types of ids a given user id module generates is worth while.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thats a fair @smenzer, I can strip that example out for now. I would like to have this discussion in 5775 though. I think defining what types of ids a given user id module generates is worth while.

ok cool, i'll copy my comment above to that issue for discussion...thanks, @jdwieland8282 !



### Quantcast ID

Quantcast ID enables publishers that use Quantcast Measure tag to uniquely identify
Expand Down Expand Up @@ -979,7 +1045,8 @@ Bidders that want to support the User ID module in Prebid.js, need to update the
| IntentIQ ID | IntentIQ | bidRequest.userId.intentiqid | `"1111"` |
| Lotame Panorama ID | Lotame | bidRequest.userId.lotamePanoramaId | `"e4b96a3d9a8e8761cef5656fb05f16d53938069f1684df4b2257e276e8b89a0e"` |
| Parrable ID | Parrable | bidRequest.userId.parrableId | `{"eid":"01.1594654046.cd0972d861e98ff3723a368a6efa69287a0df3f1cac9142afc2e7aed1caa8dd1b7fc0590b3baf67525f53e1228024c2805b6041206c7a23e34bb823b0659547d7d1d0dac2a11938e867f"}` |
| PubCommon ID | n/a | bidRequest.userId.pubcid | `"1111"` |
| PubCommon ID | n/a | bidRequest.userId.pubProvidedId | `"1111"` |
| PubProvided ID | n/a | bidRequest.userId.pubcid | `"1111"` |
| Unified ID | Trade Desk | bidRequest.userId.tdid | `"1111"` |
| netID | netID | bidRequest.userId.netId | `"fH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg"` |
| Shared ID | SharedId | bidRequest.userId.sharedid | `{"id":"01EAJWWNEPN3CYMM5N8M5VXY22","third":"01EAJWWNEPN3CYMM5N8M5VXY22"}` |
Expand Down Expand Up @@ -1063,6 +1130,16 @@ Bidders that want to support the User ID module in Prebid Server, need to update
"third": "01EAJWWNEPN3CYMM5N8M5VXY22"
}
}]
},
{
"source": "pub.com", // Publisher must configure their domain here
"uids": [{
"id": "01EAJWWNEPN3CYMM5N8M5VXY22",
"atype":1 //ADCOM - Type of user agent the match is from
"ext": {
"stype": "dmp" //currently supported values (dmp,ppuid,sha256email)
}
}]
}]
}
}
Expand Down