El objetivo de esta página es englobar, dar información de uso y transparencia de ejecución a los diferentes equipos de implementación acerca de la implementación común de permutive en entorno web no AMP.
:warning: Para estar al tanto de las ultimas actualizaciones considera suscribirte al repositorio
Se delega la ejecución de cualquier proceso de datos a la obtención de consentimiento del usuario.
Al no ser el DMP un vendor que realice procesamiento per se, sino que simplemente da la herramienta de procesamiento para ser usada por terceros, la forma elegida es preguntar por los propósitos para los que el usuario ha dado consentimiento.
Dependiendo de la versión de implementación:
TCF v2
"1": Store and/or access information on a device
"3": Create a personalised ads profile
"4": Select personalised ads
"7": Measure ad performance
"10": Develop and improve products
TCF v1
"1": Storage and access of information
"2": Personalisation
"3": Ad selection, delivery, reporting
"5": Measurement
En la mayor parte de las implementaciones, se ha de utilizar la implementacion single. En el caso de que en la pagina haya multiples instancias de permutive, habra que usar los ejemplos de codigo indicados como multi.
Todos los métodos wemass están pensados para ejecutarse tras un buffer (__wmass.bff), el cual es inicializado manualmente, por lo que la posibilidad de errores será minimizada.
Existe una excepción a esto, el método getSegments, el cual será inicializado manualmente en una versión básica ya que los segmentos son almacenados en localStorage, y potencialmente podría ser utilizados antes de que el motor del DMP sea inicializado.
El DMP usa un esquema de validación para conjuntos de propiedad-valor y eventos.
Si se incluye una propiedad o nombre de evento no declarados (estos valores son case-sensitive), o un valor no apropiado para el esquema, esto será rechazado con un error 400.
Para añadir o modificar estos valores, por favor contacta con wemass.
Este paso ha de ejecutarse antes de poder usar ningún otro método y debe de ser ejecutado en el objeto window superior de la página. Cuanto más arriba en el propio código fuente de la página, mejor.
<script>
window.__wmass = window.__wmass || {};
window.__wmass.bff = window.__wmass.bff || [];
window.__wmass.getSegments = window.__wmass.getSegments || function(){
let pSegs=[];
try {
pSegs = JSON.parse(window.localStorage._papns || '[]').slice(0, 250).map(String);
} catch (e) {
pSegs = []
}
return {permutive:pSegs};
};
</script>
<script async src="__URLWemassService__"></script>
Los segmentos no se extraen de la propiedad _pnaps como siempre sino de una entrada tras el namespace de wemass
<script>
window.__wmass = window.__wmass || {};
window.__wmass.bff = window.__wmass.bff || [];
window.__wmass.getSegments = window.__wmass.getSegments || function(){
let pSegs=[];
try {
pSegs = JSON.parse(window.localStorage["{NAMESPACE}_papns"] || '[]').slice(0, 250).map(String);
} catch (e) {
pSegs = []
}
return {permutive:pSegs};
};
</script>
<script async src="__URLWemassService__"></script>
:warning: Wemass hará llegar el código correcto. No usar este código en producción.
:warning: No se debe cachear el resultado de la funcion __wmass.getSegments el contenido que devuelve puede variar en funcion de el momento de ejecucion y la propia funcion es sobreescrita una vez que el sdk termina de cargar. Ver Función getSegments
Estos son los atributos que se han de pasar al DMP, en caso de que alguno de ellos no se pueda rellenar se ha de pasar un string vacío. Este código ha de lanzarse lo antes posible en la ejecución, idealmente justo después de la inicialización. Hay que tener en cuenta los siguientes puntos:
:warning: Importante: aqui aplican los Esquemas de validación
<script>
__wmass.bff.push(function () {
/*Si se dispone de algún tipo de identificador del usuario cuando se carga la página se debería ejecutar este código Ver la sección de #enviando-atributos-de-la-página-al-dmp para más información.
if (USER_ID_AVAILABLE) {
__wmass.dmp.identify([
{
id: '<USER_ID>',
tag: '<ID_TAG>'
}
]);
}*/
__wmass.dmp.addon('web', {
page: {
type: "<STRING>",
content: {
categories: ["<LIST>", "<OF>", "<STRINGS>"]
},
article: {
id: "<STRING>",
title: "<STRING>",
description: "<STRING>",
topics: ["<LIST>", "<OF>", "<STRINGS>"],
authors: ["<LIST>", "<OF>", "<STRINGS>"],
modifiedAt: "< DATE / TIME > ",
publishedAt: "< DATE / TIME > ",
premium: "< BOOLEAN >",
wordCount: "< INTEGER >",
paragraphCount: "< INTEGER >",
section: "<STRING>",
subsection: "<STRING>"
},
user: {
type: "<STRING>",
age: "< INTEGER >",
gender: "<STRING>"
}
}
});
});
</script>
Este código es el que se encarga de enviar los identificadores disponibles para el usuario. Identify requiere un array de objetos, cada uno de estos objetos requiere las propiedades:
Se debe tener en cuenta los siguientes puntos:
:warning: Importante: aqui aplican los Esquemas de validación
:warning: Este paso es especialmente necesario en Safari debido a las restricciones de ITP respecto al uso de localStorage.
__wmass.bff.push(function () {
if (USER_ID_AVAILABLE) {
__wmass.dmp.identify([
{
id: '<USER_ID>',
tag: '<ID_TAG>'
}
]);
}
//__wmass.dmp.addon('web', {... });
});
En aquellas páginas con scroll infinito se ha de llamar a la función addon sin pasar los atributos de usuario (a no ser que estos hayan cambiado).
:warning: Importante: aqui aplican los Esquemas de validación
__wmass.bff.push(function () {
__wmass.dmp.addon('web', {
page: {
type: "<STRING>",
content: {
categories: ["<LIST>", "<OF>", "<STRINGS>"]
},
article: {
id: "<STRING>",
title: "<STRING>",
description: "<STRING>",
topics: ["<LIST>", "<OF>", "<STRINGS>"],
authors: ["<LIST>", "<OF>", "<STRINGS>"],
modifiedAt: "< DATE / TIME > ",
publishedAt: "< DATE / TIME > ",
premium: "< BOOLEAN >",
wordCount: "< INTEGER >",
paragraphCount: "< INTEGER >",
section: "<STRING>",
subsection: "<STRING>"
}
});
});
let segmentList= __wmass.getSegments(opciones:undefined|Opciones{});
getSements por defectoi devolverá un objeto con 1 o varios atributos con diferentes grupos de segmentos. Cada propiedad contendrá un array de strings con la información.
Por ejemplo
{segments:["lista","de","segmentos"]}
La funcion permite como argumento un objeto de opciones. Las propiedades permitidas son:
Es importante para obtener los segmentos usar la función __wmass.getSegments() ya que, aunque se inicializa con una funcionalidad estática en el setUp del DMP. Una vez que se inicializa el mismo, su funcionalidad podría cambiar.
Se han de pasar los datos de los segmentos de permutive a los SSP de wemass que permiten este valor. Mas abajo hay ejemplos de envío de datos.
:warning: Este código es un ejemplo: adaptar para cada necesidad
En Appnexus los segmentos se han de pasar dentro del parámetro keywords como se puede ver en el ejemplo.
El parámetro admite un objeto cuyas propiedades tienen un array de strings. La función __wmass.getSegments() devolverá los valores listos para usar.
let
wemassDataSegments=__wmass.getSegments(),
adUnits = [{
code: 'your prebid AdUnit code here',
mediaTypes: {
banner: {
sizes: [ [300, 250], [300, 600] ]
}
},
bids: [{
bidder: 'appnexus',
params: {
placementId: 13144370,
keywords: wemassDataSegments
}
}]
}];
pbjs.addAdUnits(adUnits);
En el caso de que se quiera enviar los segmentos de permutive a wemass para dar servicio a campañas que administremos, se ha de incluir en la propiedad de keywords una nueva propiedad con los segmentos del publisher. De lo contrario usar el ejemplo single.
let wemassDataSegments=__wmass.getSegments({extraKw:{
"permutive<PUBLISHER>":["pubSegment1","pubSegment2","pubSegment..."]
}});
let adUnits = [{
code: 'your prebid AdUnit code here',
mediaTypes: {
banner: {
sizes: [ [300, 250], [300, 600] ]
}
},
bids: [{
bidder: 'appnexus',
params: {
placementId: 13144370,
keywords: wemassDataSegments
}
}]
}];
pbjs.addAdUnits(adUnits);
:warning: Este código es un ejemplo: adaptar para cada necesidad
En google admanager los segmentos se han de pasar dentro del parametro cust_params y codificados para html entities en la url del vast. Como tal han de ser transformados para dicha eventualidad. La funcion getSegments se encarga de ello
let
wemassDataSegments=__wmass.getSegments({format:"gamvideo",adunit="/accountid/nivel1/nivel2/nivel3/nivel4/nivel5"}),
gamVideoUrl = `https://securepubads.g.doubleclick.net/gampad/ads?cust_params=${wemassDataSegments}`
//resultado de wemassDataSegments 'au1%3Dnivel1%26au2%3D%2Fnivel2%26au3%3D%2Fnivel3%26au4%3D%2Fnivel4%26au5%3D%2Fnivel5%26wpm%3D57636%2C61920%2C66785%2C66787%2C66788%2C66811%2C66813%2C66814%2C66816%2C69760%2C71822%2C73933%2C75490%2C75680%2C75959%2C76968%2C76969%2C76979%2C76982%2C77016%2C77018%2C77021%2C77025%2C77057%2C77058%2C77059%2C79454%2C79479%2C79480%2C83146%2C86951%2C87900%2C88023%2C88792%2C89007%2C91596%2C94070%2C94292%2C95302%2C95314%2C95318%2C95319%2C95440%2C95444%2C95445%2C95446%2C95447%2C98982%26wirr%3Doutxgam%2Coutxcon'
:warning: Este código es un ejemplo: adaptar para cada necesidad
En SmartAdserver los segmentos se han de pasar dentro del parámetro target, pero han de ser transformados ya que el parámetro solo admite un string con el formato "target1=segment1,segment2;target2=segment3,segment4"
Si ya existiera un target establecido, se debería concatenar al mismo separando por un ;
Aquí un ejemplo de transformación:
let
wemassDataSegments=__wmass.getSegments({format:"smart"}),
adUnits = [{
code: 'your prebid AdUnit code here',
mediaTypes: {
banner: {
sizes: [ [300, 250], [300, 600] ]
}
},
bids: [{
bidder: 'smartadserver',
params: {
domain: "//prg.smartadserver.com",
formatId: "78109",
pageId: "1078608",
siteId: "293313",
target: wemassDataSegments
}
}]
}];
pbjs.addAdUnits(adUnits);
En el caso de que se quiera enviar los segmentos de permutive a wemass para dar servicio a campañas que administremos, se ha de incluir en la propiedad de keywords una nueva propiedad con los segmentos del publisher. De lo contrario usar el ejemplo single.
let
wemassDataSegments=__wmass.getSegments({format:"smart",extraKw:{
"permutive<PUBLISHER>":["pubSegment1","pubSegment2","pubSegment..."]
}}),
adUnits = [{
code: 'your prebid AdUnit code here',
mediaTypes: {
banner: {
sizes: [ [300, 250], [300, 600] ]
}
},
bids: [{
bidder: 'smartadserver',
params: {
domain: "//prg.smartadserver.com",
formatId: "78109",
pageId: "1078608",
siteId: "293313",
target: wemassDataSegments
}
}]
}];
pbjs.addAdUnits(adUnits);
:warning: Este código es un ejemplo: adaptar para cada necesidad
En Richaudience los segmentos se han de pasar dentro del parámetro keywords, pero han de ser transformados ya que el parámetro solo admite un string con el formato "keyword1=segment1;keyword1=segment2;keyword2=segment3;keyword2=segment4"
Si ya existiera un keyword establecido, se debe añadir otra vez un par de keyword=segment ;
Aquí un ejemplo de transformación:
let
wemassDataSegments=__wmass.getSegments({format:"richaudience"}),
adUnits = [{
code: 'your prebid AdUnit code here',
mediaTypes: {
banner: {
sizes: [ [300, 250], [300, 600] ]
}
},
bids: [{
bidder: 'richaudience',
params: {
pid:"ADb1f40rmo",
supplyType:"site",
bidfloor:0.40,
keywords: wemassDataSegments
}
}]
}];
pbjs.addAdUnits(adUnits);
En el caso de que se quiera enviar los segmentos de permutive a wemass para dar servicio a campañas que administremos, se ha de incluir en la propiedad de keywords una nueva propiedad con los segmentos del publisher. De lo contrario usar el ejemplo single.
let
wemassDataSegments=__wmass.getSegments({format:"richaudience",extraKw:{
"permutive<PUBLISHER>":["pubSegment1","pubSegment2","pubSegment..."]
}}),
adUnits = [{
code: 'your prebid AdUnit code here',
mediaTypes: {
banner: {
sizes: [ [300, 250], [300, 600] ]
}
},
bids: [{
bidder: 'richaudience',
params: {
pid:"ADb1f40rmo",
supplyType:"site",
bidfloor:0.40,
keywords: wemassDataItems.join(";")
}
}]
}];
pbjs.addAdUnits(adUnits);
Se incluyen aquí otras posibilidades que permite el DMP, para más detalles sobre implementación y uso contacte con wemass.
Se puede preguntar por el estado de inclusión de un segmento predefinido para realizar alguna acción en la página
__wmass.bff.push(function () {
__wmass.dmp.segment(idEvento, function(result) {
if (result) {
// El usuario pertenece al segmento indicado
}
});
});
__wmass.bff.push(function () {
__wmass.dmp.segments(callback);
});
Callback recibirá un objeto con los segmentos a los que pertenece el usuario
:warning: Debido a la inmediatez de la ejecución de prebid es mejor, para enviar los segmentos a los SSP usar la funcion estatica __wmass.getSegments()
Es posible hacer seguimiento de acciones que realice el usuario en tiempo real, por ejemplo, rellenando una encuesta, usando la funcion track.
__wmass.bff.push(function () {
__wmass.dmp.track('CustomEventName', {dataItem:true}, opciones);
});
Es posible asociar callbacks a interacciones cuando un usuario es incluido en un segmento a través de un Evento.
__wmass.bff.push(function () {
__wmass.dmp.trigger(idEvento, "result", function(obj){
if(obj.result)
//realizar acciones necesarias
});
});
:warning: Importante: aqui aplican los Esquemas de validación