Implementación Permutive (Multiple Instances)

Indice

Implementación común de permutive

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

Consentimiento

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

Tipo de integración

Esta documentación corresponde a una integración Multi, indicada para páginas en las que existen múltiples instancias de Permutive.

Métodos

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.

Esquemas de validación

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.

Inicialización

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.

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

Enviando atributos de la página al DMP

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:

  • Los nombres de las propiedades son case-sensitive.
  • Este código ha de ser ejecutado en el objeto window superior de la página.
  • Los datos de tipo fecha esperan una fecha de tipo ISO (yyyy-mm-ddThh:mm:ss.milisZ)

: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>

Enviando identidades al DMP

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:

  • id: el id del usuario en sí mismo.
  • tag: el identificador legible para la gestión en el DMP.

Se debe tener en cuenta los siguientes puntos:

  • Si el identificador se encuentra disponible cuando carga la página, se de llamar a Identify antes de la ejecución de __wmass.dmp.addon. Tal y como se ve en el ejemplo de Enviando atributos de la página.
  • En las páginas donde el identificador no está disponible, se puede obviar esta instrucción.
  • Cuando un usuario se identifique, se debe llamar a identify con el valor correspondiente no es necesario llamar a addon.
  • Una vez que un identificador está mapeado a un usuario, esta relación no es reversible (este problema se vería por ejemplo si dos usuarios tuvieran como id el valor undefined), por lo que se ha de asegurar que solo se ha de llamar a este método cuando se dispone de un id.
  • No se ha de usar valores que permitan identificación personal del usuario (PII) como dirección, Email sin encriptar, id público de perfil, etc...
: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', {... });
});

Scroll infinito

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>"
        }
    });
});

Obteniendo la lista de segmentos

Función getSegments

let segmentList = __wmass.getSegments({ format: "msft" });

getSegments devolverá los segmentos adaptados al formato de msft.

La funcion permite como argumento un objeto de opciones. Las propiedades utilizadas en esta integración son:

  • adunit: String. Aqui se indicará el adunit de la pagina en caso de que se quiera pasar.
  • extraKw: {["*"]:object|string|number}. Objeto cuyas propiedades han de ser un array de strings, un string o un number.
  • format: para esta integración se debe usar el valor "msft".

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.

Activando los segmentos

Se han de pasar los datos de los segmentos de permutive a msft.

Enviando los segmentos a msft

:warning: Este código es un ejemplo: adaptar para cada necesidad

En msft los segmentos se han de pasar dentro del parámetro keywords. En una integración Multi se ha de incluir en la propiedad de keywords una nueva propiedad con los segmentos del publisher.

let wemassDataSegments = __wmass.getSegments({
  format: "msft",
  extraKw: {
    "permutive<PUBLISHER>": ["pubSegment1", "pubSegment2", "pubSegment..."],
  },
});
let adUnits = [
  {
    code: "your prebid AdUnit code here",
    mediaTypes: {
      banner: {
        sizes: [
          [300, 250],
          [300, 600],
        ],
      },
    },
    bids: [
      {
        bidder: "msft",
        params: {
          placementId: 13144370,
          keywords: wemassDataSegments,
        },
      },
    ],
  },
];
pbjs.addAdUnits(adUnits);

Otras posibilidades

Se incluyen aquí otras posibilidades que permite el DMP, para más detalles sobre implementación y uso contacte con wemass.

Obteniendo status de segmentos individuales

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
    }
  });
});

: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({ format: "msft" })

Interacciones o eventos y disparadores

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);
});

Disparadores

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