Server-to-Server - Guía de implementación de Web S2S

Descripción general

Web Server-to-Server (Web S2S) envía eventos web de conversión e interacción a Singular directamente desde tu servidor, usando el mismo endpoint EVENT que la integración móvil V1. La ruta web se diferencia por el parámetro de plataforma p=Web .

Web S2S es una arquitectura asistida por el navegador . Varios valores relevantes para la atribución solo están disponibles en el navegador — location.href , document.referrer y el userAgent del navegador no pueden reconstruirse en el backend. Un fragmento ligero del lado del cliente debe recopilar estos valores y llamar al endpoint directamente o reenviarlos a tu backend, que luego realiza la llamada S2S.

No existe ningún endpoint web SESSION . El primer evento de conversión __PAGE_VISIT__ reemplaza la llamada móvil launch y establece la línea base de atribución para la visita.

Web S2S comparte las convenciones de autenticación, codificación y parámetros comunes con el resto del conjunto S2S. Consulta el centro de Fundamentos de S2S y la referencia del endpoint EVENT .


Endpoint

Web S2S usa el mismo host y ruta que el endpoint móvil EVENT de V1. Establece p=Web para enrutar la solicitud a través de la ruta de atribución web.

GET https://s2s.singular.net/api/v1/evt

Generación y persistencia del SDID

El ID de dispositivo de Singular ( sdid ) vincula todos los eventos de un navegador a un único dispositivo web. En la primera carga de la página, si no existe ningún global_singular_id en localStorage , genera un UUID v4 y guárdalo. Reutiliza el mismo valor como sdid en cada evento de ese navegador hasta que se borre localStorage .

Si el Web SDK está presente en la página, reutiliza el valor que ya estableció en global_singular_id en lugar de generar uno nuevo.

function getOrCreateSDID() {
  var KEY = 'global_singular_id';
  var sdid = localStorage.getItem(KEY);
  if (!sdid) {
    sdid = crypto.randomUUID(); // UUID v4
    localStorage.setItem(KEY, sdid);
  }
  return sdid;
}

El patrón __PAGE_VISIT__

El primer evento de cualquier visita nueva DEBE ser __PAGE_VISIT__ con conversion_event=true . Esto establece la línea base de atribución que los eventos posteriores heredan.

Envía un nuevo __PAGE_VISIT__ con conversion_event=true cada vez que el mismo navegador regrese desde una campaña diferente (UTM o partner distinto). Reutiliza el mismo sdid y envía el __PAGE_VISIT__ antes de cualquier otro evento de esa visita.

Los eventos que no son de conversión (por ejemplo sng_registration_complete o sng_purchase ) usan conversion_event=false y omiten attribution_data . Heredan la atribución del __PAGE_VISIT__ más reciente.

Un evento que no es de conversión y que llega antes de su evento de conversión se aplaza un minuto mientras el backend espera una coincidencia.

Reglas de custom_user_id

  • Incluye custom_user_id después del registro o inicio de sesión, y en todos los eventos posteriores.
  • Persístelo en localStorage o en una cookie propia (first-party).
  • Elimínalo al cerrar sesión.
  • Nunca incluyas PII. Usa un ID interno o hasheado.

Parámetros

El Web SDK envía aproximadamente 40 parámetros en __PAGE_VISIT__ , pero la mayoría son telemetría interna del SDK que los desarrolladores de S2S no deberían replicar. Las tablas siguientes cubren solo los conjuntos requeridos y recomendados.

La autenticación ( a ) y otras convenciones compartidas se documentan una sola vez en el centro. Consulta Parámetros comunes en Fundamentos de S2S .

Parámetros requeridos

Parámetro Detalles
a

string

La API key de Singular de tu panel. Consulta Parámetros comunes .

Ejemplo: myapikey_123

p

string

Plataforma. Siempre Web para Web S2S. Este valor enruta la solicitud a través de la ruta de atribución web.

Ejemplo: Web

i

string

El Bundle ID de la app/sitio web en Singular. Debe coincidir con el Product ID del Web SDK. Encuéntralo en Settings > Apps > expande la app web > Bundle ID.

Ejemplo: com.example.site

n

string

Nombre del evento. El primer evento de una visita debe ser __PAGE_VISIT__ .

Ejemplo: __PAGE_VISIT__

sdid

UUID

El ID de dispositivo de Singular. Usa el mismo valor establecido por el Web SDK ( global_singular_id ). Si lo estableces tú mismo, genera un UUID v4 y reutilízalo para todos los eventos del navegador.

Ejemplo: 3730aecb-47ba-4d13-bd17-52b4b700956f

conversion_event

boolean

Establece true solo para un evento de atribución ( __PAGE_VISIT__ ). Un evento que no es de conversión y que llega antes del evento de conversión se aplaza un minuto mientras el backend espera una coincidencia.

Ejemplo: true

attribution_data

JSON

Datos de click-through de las ad networks, JSON codificado en URL. Requerido en __PAGE_VISIT__ ; omítelo en eventos que no son de conversión. Consulta attribution_data .

Ejemplo: %7B%22partner_name%22%3A%22Snapchat%22%2C%22is_attributed%22%3A%22true%22%7D

custom_user_id

string

Tu ID de usuario interno. Sin PII. Inclúyelo después del registro/inicio de sesión y en los eventos posteriores; elimínalo al cerrar sesión.

Ejemplo: pid123abc

ip

string

La IP del dispositivo al momento del evento.

Ejemplo: 104.220.23.123

web_url

string

La URL de la landing page de conversión, incluidos sus parámetros de marketing. Es la última URL que contuvo parámetros de marketing, almacenada como el SDID y reutilizada. El backend la usa para crear el touchpoint de atribución. Distinto de web_page_url .

Ejemplo: http://my.landing.page/?utm_campaign=test&utm_source=test

Parámetro Detalles
device_user_agent

string

El user agent del navegador ( navigator.userAgent ). Solo disponible en el navegador; recopílalo del lado del cliente.

Ejemplo: Mozilla/5.0 ...

web_page_referrer

string

El referrer de la página actual ( document.referrer ). Se ingiere y se usa para atribución (clasificación de origen/tipo orgánico). Solo disponible en el navegador; recopílalo del lado del cliente. Distinto de document_referrer , que es solo para registro de eventos.

Ejemplo: https://www.google.com/

timezone

string

La zona horaria del dispositivo.

Ejemplo: America/New_York

os

string

El sistema operativo del dispositivo.

Ejemplo: iOS

screen_width

integer

Ancho de la pantalla en píxeles.

Ejemplo: 390

screen_height

integer

Alto de la pantalla en píxeles.

Ejemplo: 844

utime

integer

Hora del evento en tiempo UNIX (segundos).

Ejemplo: 1751500800

Parámetros de URL y referrer: no los confundas. web_url y web_page_referrer son relevantes para la atribución y los usa el pipeline. web_page_url (la página actual, window.location.href ) y document_referrer son solo para registro de eventos y se descartan silenciosamente para la atribución. No envíes web_page_url ni document_referrer esperando que afecten la atribución.

Para la identidad del dispositivo y otros parámetros compartidos que no se enumeran arriba, consulta Parámetros comunes en Fundamentos de S2S en lugar de volver a documentarlos aquí.


attribution_data

El parámetro attribution_data transporta los datos de click-through de las ad networks como JSON codificado en URL. Envíalo solo en eventos de conversión __PAGE_VISIT__ .

{
  "partner_name": "Snapchat",
  "is_attributed": "true",
  "touch_timestamp": "",
  "partner_campaign_id": "",
  "partner_campaign_name": "Snap_campaign_1234",
  "partner_creative_id": "",
  "partner_creative_name": "",
  "partner_keyword": "",
  "partner_site": "",
  "partner_site_id": "",
  "partner_site_name": "",
  "partner_sub_site": "",
  "partner_sub_site_name": "",
  "partner_subcampaign_id": "",
  "partner_subcampaign_name": "",
  "_p": ""
}

Campos requeridos

Campo Detalles
partner_name

string

Mapeado desde el parámetro web wpsrc o utm_source .

Ejemplo: Snapchat

is_attributed

string

Establece true para eventos atribuidos.

Ejemplo: true

partner_campaign_name

string

Mapeado desde el parámetro web wpcn o utm_campaign .

Ejemplo: Snap_campaign_1234

Campos opcionales

Campo Detalles
touch_timestamp

integer

Hora del touchpoint en segundos UNIX.

Ejemplo: 1751500800

partner_campaign_id

string

Mapeado desde el parámetro web wpcid .

partner_creative_id

string

Mapeado desde el parámetro web wpcrid .

partner_creative_name

string

Mapeado desde el parámetro web wpcrn .

partner_keyword

string

Mapeado desde el parámetro web wpkwn .

partner_site_id

string

Mapeado desde el parámetro web wpsid .

partner_site_name

string

Mapeado desde el parámetro web wpsn .

partner_sub_site_name

string

Mapeado desde el parámetro web wpssn .

partner_subcampaign_id

string

Mapeado desde el parámetro web wpscid .

partner_subcampaign_name

string

Mapeado desde el parámetro web wpscn .

IDs de clic web en el parámetro e

Compatibilidad con Conversion API de partners: Para reenviar estos eventos a los partners de redes publicitarias mediante las integraciones de Conversion API de Singular, incluye los atributos de evento opcionales estándar (datos propios con hash, como eventId y ehash). Consulta Atributos de evento estándar para integraciones de Conversion API.

Pasa los click IDs de la network en el payload e del evento usando la clave JSON que cada partner espera:

Partner Clave(s) del click ID
Snapchat ScCid
TikTok ttclid
Google gclid , gbraid , wbraid
DV360 dclid
Facebook fbclid
Reddit rdt_uuid

Detección de parámetros de marketing. Trata una URL de landing como un touchpoint cuando contenga cualquiera de: utm_* ; wp* de Singular ( wpsrc , wpcn , wpcid y similares); pc* / p* de Singular ( pcid , pcn , psrc y similares); clid ; o kw / an / ud . Al coincidir, almacena la URL completa como web_url y dispara un evento de conversión.


Atribución web-a-app

Para llevar el contexto de la campaña web a un clic móvil, construye un Singular Link desde tu landing page y agrega la query string de landing capturada. Esto reenvía los parámetros de marketing al clic móvil para que la instalación de la app pueda atribuirse.

Al aterrizar, captura window.location.search (más el fragmento) cuando contenga parámetros de marketing y persístelo. Al renderizar el enlace a la tienda de apps o al smart banner, construye:

function buildWebToAppLink(baseLink, webUrl, deeplink, passthrough, deferredDeeplink) {
  var url = new URL(baseLink); // preserves existing base-link params
  if (webUrl) {
    var q = new URL(webUrl);
    var captured = q.search.slice(1) + (q.hash || ''); // landing query string (+fragment)
    url.searchParams.set('_web_params', captured); // URL-encoded on serialization
  }
  if (deeplink)         url.searchParams.set('_dl', deeplink);
  if (passthrough)      url.searchParams.set('_p', passthrough);
  if (deferredDeeplink) url.searchParams.set('_ddl', deferredDeeplink);
  return url.toString();
}
Parámetro agregado Detalles
_web_params

La query string (más el fragmento) codificada en URL del web_url de landing capturado. Reenvía los parámetros de campaña UTM / wp* / pc* / clid al clic móvil.

_dl

Argumento de deep link. Opcional.

_p

Argumento de passthrough. Opcional.

_ddl

Argumento de deferred deep link. Opcional.

Precisión: el SDID no se agrega al enlace (sin _dsid ni _sdid ). Esto es reenvío de parámetros de campaña, no un device-stitching determinístico por SDID.


Atribución por portapapeles (Deferred Deep Link)

La atribución por portapapeles proporciona una coincidencia determinística para un deferred deep link. El fragmento web escribe un token único en el portapapeles; la app recién instalada lo lee de vuelta y hace la coincidencia por igualdad de token.

function openAppWithClipboardDdl(baseLink, deeplink, passthrough, deferredDeeplink) {
  // 1. Build the web-to-app link (see Web-to-App Attribution).
  var link = buildWebToAppLink(baseLink, capturedWebUrl, deeplink, passthrough, deferredDeeplink);

  // 2. Generate a UUID v4 and form the token.
  var uuid = crypto.randomUUID();
  var tokenUrl = location.protocol + '//' + location.hostname + '/__singular_ddl__/' + uuid;

  // 3. Write ONLY the token to the clipboard (execCommand fallback).
  copyToClipboard(tokenUrl);

  // 4. Append the token to the click as ecid.
  var url = new URL(link);
  url.searchParams.set('ecid', tokenUrl);

  // 5. Open the app / store.
  window.open(url.toString());
}

function copyToClipboard(text) {
  if (navigator.clipboard && navigator.clipboard.writeText) {
    navigator.clipboard.writeText(text);
    return;
  }
  var ta = document.createElement('textarea');
  ta.value = text;
  document.body.appendChild(ta);
  ta.select();
  document.execCommand('copy');
  document.body.removeChild(ta);
}

Precisión: el portapapeles contiene únicamente el token — no el SDID, ni _web_params , ni el deep link. La coincidencia es por igualdad de token (el ecid del clic es igual al token del portapapeles), de modo que la app recién instalada coincide de forma determinística.

La escritura en el portapapeles debe ejecutarse dentro de un manejador de gesto del usuario (un clic) o los navegadores la bloquean. Ten en cuenta las restricciones del portapapeles de iOS Safari.

Leer el portapapeles en el primer inicio es responsabilidad del lado de la app (su propia integración móvil SDK/S2S), no de este fragmento web.


Ejemplos de secuencia de eventos

Primera visita y registro

  1. El usuario llega desde Google Ads. Envía la visita de página inicial:

    • n=__PAGE_VISIT__
    • conversion_event=true
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f
    • attribution_data={ "partner_name": "googleadwords_int", "is_attributed": "true", "partner_campaign_name": "brand_us_en" }
  2. El usuario se registra. Envía el evento de registro:

    • n=sng_registration_complete
    • conversion_event=false
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (el mismo SDID)
    • custom_user_id=user_12345abc
    • Sin attribution_data

Usuario recurrente desde una nueva campaña

  1. El mismo navegador regresa desde una campaña diferente. Envía una nueva visita de página:

    • n=__PAGE_VISIT__
    • conversion_event=true
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (el mismo SDID)
    • attribution_data={ "partner_name": "facebook", "is_attributed": "true", "partner_campaign_name": "retargeting_Q1" }
  2. El usuario realiza una compra. Envía el evento de compra:

    • n=sng_purchase
    • conversion_event=false
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (el mismo SDID)
    • El custom_user_id persistido
    • Sin attribution_data