This module enables bidder targeting and tracking at the ad server ad slot level.
This module is enabled by default if it’s compiled into your PBJS package. It will add the Prebid Ad Slot and GPID along with the matching GAM ad unit name to each ad unit’s first-party data before bid requests are sent to the adapters.
The Prebid Ad Slot didn’t get broad adoption, so it’s likely that someday we’ll deprecate it in favor of the more standard GPID.
Unlike many other modules, the GPT Pre-Auction Module is on by default if it’s compiled into the Prebid.js package.
Optional initialization parameters:
Param | Required? | Type | Description | Example |
enabled | no | boolean | allows turning off of module. Default value is true | true |
customGptSlotMatching | no | function | GPT slot matching function should match the customSlotMatching function sent to setTargetingForGptAsync | |
customPbAdSlot | no | function | Custom PB AdSlot function | |
mcmEnabled | no | boolean | Removes extra network IDs when Multiple Customer Management is active. Default is false. | true |
For example:
pbjs.setConfig({
gptPreAuction: {
enabled: true, // enabled by default
customPbAdSlot: function(adUnitCode, adServerAdSlot) {
...
return "customPbAdSlot";
},
customGptSlotMatching: function(gptSlotObj) {
...
return true; // or false
},
mcmEnabled: true
}
});
When this module is turned on, it uses the BEFORE_REQUEST_BIDS event to insert functionality that:
If GPT slot matching succeeds:
The customPbAdSlot function is called if it was specified, writing the results to ortb2Imp.ext.data.pbadslot.
If there’s no customPbAdSlot function, a default algorithm is used to determine ortb2Imp.ext.data.pbadslot:
Here’s what the module does to define GPID:
The following customPbAdSlot function will work for many publishers. Assumptions:
If either of these isn’t the case, you’ll need to supply your own function.
// Use adunit.ortb2Imp.ext.data.pbadslot if it exists.
// compare adunit.code to find a single matching slot in GPT
// if there is a single slot match, just use that slot name
// finally, there must be multiple slots that match. Define pbadslot as slot#div
pbjs.setConfig({
gptPreAuction: {
enabled: true, // enabled by default
customPbAdSlot: function(adUnitCode, adServerAdSlot) {
// get adunit object
au=pbjs.adUnits.filter(au => au.code==adUnitCode);
if (au.length==0) {
return;
}
// use pbadslot if supplied
if (au[0].ort2bImp && au[0].ort2bImp.ext && au[0].ort2bImp.ext.data && au[0].ort2bImp.ext.data.pbadslot) {
return au[0].ort2bImp.ext.data.pbadslot;
}
// confirm that GPT is set up
if (!(googletag && googletag.apiReady)) {
return;
}
// find all GPT slots with this name
var gptSlots = googletag.pubads().getSlots().filter(function(gpt) {
return gpt.getAdUnitPath() == adServerAdSlot;
});
if (gptSlots.length==0) {
return; // should never happen
}
if (gptSlots.length==1) {
return adServerAdSlot;
}
// else the adunit code must be div id. append it.
return adServerAdSlot+"#"+adUnitCode;
}
});
};