Server-to-Server - Guia de implementação do Web S2S

Visão geral

O Web Server-to-Server (Web S2S) envia eventos de conversão e engajamento da web para o Singular diretamente do seu servidor, usando o mesmo endpoint EVENT da integração móvel V1. O caminho da web é diferenciado pelo parâmetro de plataforma p=Web .

O Web S2S é uma arquitetura assistida pelo navegador . Vários valores relevantes para atribuição estão disponíveis apenas no navegador — location.href , document.referrer e o userAgent do navegador não podem ser reconstruídos no backend. Um trecho de código leve no lado do cliente precisa coletar esses valores e chamar o endpoint diretamente ou encaminhá-los para o seu backend, que então faz a chamada S2S.

Não há endpoint SESSION da web . O primeiro evento de conversão __PAGE_VISIT__ substitui a chamada launch móvel e estabelece a linha de base de atribuição para a visita.

O Web S2S compartilha as convenções de autenticação, codificação e parâmetros comuns com o restante da suíte S2S. Consulte o hub de S2S Fundamentals e a referência do endpoint EVENT .


Endpoint

O Web S2S usa o mesmo host e caminho do endpoint EVENT móvel V1. Defina p=Web para rotear a requisição pelo caminho de atribuição da web.

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

Geração e persistência do SDID

O ID de dispositivo do Singular ( sdid ) vincula todos os eventos de um navegador a um único dispositivo web. No primeiro carregamento da página, se nenhum global_singular_id existir no localStorage , gere um UUID v4 e armazene-o. Reutilize o mesmo valor como sdid em todos os eventos daquele navegador até que o localStorage seja limpo.

Se o Web SDK estiver presente na página, reutilize o valor que ele já definiu em global_singular_id em vez de gerar um novo.

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

O padrão __PAGE_VISIT__

O primeiro evento de qualquer nova visita DEVE ser __PAGE_VISIT__ com conversion_event=true . Isso estabelece a linha de base de atribuição que os eventos posteriores herdam.

Envie um novo __PAGE_VISIT__ com conversion_event=true sempre que o mesmo navegador retornar de uma campanha diferente (UTM ou parceiro diferente). Reutilize o mesmo sdid e envie o __PAGE_VISIT__ antes de quaisquer outros eventos daquela visita.

Eventos de não conversão (por exemplo sng_registration_complete ou sng_purchase ) usam conversion_event=false e omitem attribution_data . Eles herdam a atribuição do __PAGE_VISIT__ mais recente.

Um evento de não conversão que chega antes do seu evento de conversão é adiado por um minuto enquanto o backend aguarda uma correspondência.

Regras de custom_user_id

  • Inclua custom_user_id após o registro ou login, e em todos os eventos subsequentes.
  • Persista-o no localStorage ou em um cookie de primeira parte.
  • Remova-o no logout.
  • Nunca inclua PII. Use um ID interno ou com hash.

Parâmetros

O Web SDK envia aproximadamente 40 parâmetros no __PAGE_VISIT__ , mas a maioria é telemetria interna do SDK que os desenvolvedores de S2S não devem replicar. As tabelas abaixo cobrem apenas os conjuntos obrigatórios e recomendados.

A autenticação ( a ) e outras convenções compartilhadas estão documentadas uma vez no hub. Consulte Common Parameters em S2S Fundamentals .

Parâmetros obrigatórios

Parâmetro Detalhes
a

string

Chave de API do Singular do seu dashboard. Consulte Common Parameters .

Exemplo: myapikey_123

p

string

Plataforma. Sempre Web para Web S2S. Este valor roteia a requisição pelo caminho de atribuição da web.

Exemplo: Web

i

string

Bundle ID do app/site web no Singular. Deve corresponder ao Product ID do Web SDK. Encontre-o em Settings > Apps > expanda o app web > Bundle ID.

Exemplo: com.example.site

n

string

Nome do evento. O primeiro evento de uma visita deve ser __PAGE_VISIT__ .

Exemplo: __PAGE_VISIT__

sdid

UUID

ID de dispositivo do Singular. Use o mesmo valor definido pelo Web SDK ( global_singular_id ). Se você mesmo definir, gere um UUID v4 e reutilize-o em todos os eventos do navegador.

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

conversion_event

boolean

Defina true apenas para um evento de atribuição ( __PAGE_VISIT__ ). Um evento de não conversão que chega antes do evento de conversão é adiado por um minuto enquanto o backend aguarda uma correspondência.

Exemplo: true

attribution_data

JSON

Dados de click-through de ad networks, JSON codificado em URL. Obrigatório em __PAGE_VISIT__ ; omita em eventos de não conversão. Consulte attribution_data .

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

custom_user_id

string

Seu ID de usuário interno. Sem PII. Inclua após o registro/login e em eventos subsequentes; remova no logout.

Exemplo: pid123abc

ip

string

IP do dispositivo no momento do evento.

Exemplo: 104.220.23.123

web_url

string

A URL da landing page de conversão, incluindo seus parâmetros de marketing. Esta é a última URL que continha parâmetros de marketing, armazenada como o SDID e reutilizada. É usada pelo backend para criar o touchpoint de atribuição. Distinta de web_page_url .

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

Parâmetro Detalhes
device_user_agent

string

O user agent do navegador ( navigator.userAgent ). Apenas no navegador; colete-o no lado do cliente.

Exemplo: Mozilla/5.0 ...

web_page_referrer

string

O referrer da página atual ( document.referrer ). Ingerido e usado para atribuição (classificação de source/type orgânica). Apenas no navegador; colete-o no lado do cliente. Distinto de document_referrer , que é apenas para event-logging.

Exemplo: https://www.google.com/

timezone

string

O fuso horário do dispositivo.

Exemplo: America/New_York

os

string

O sistema operacional do dispositivo.

Exemplo: iOS

screen_width

integer

Largura da tela em pixels.

Exemplo: 390

screen_height

integer

Altura da tela em pixels.

Exemplo: 844

utime

integer

Horário do evento em tempo UNIX (segundos).

Exemplo: 1751500800

Parâmetros de URL e referrer — não confunda. web_url e web_page_referrer são relevantes para atribuição e são usados pelo pipeline. web_page_url (a página atual, window.location.href ) e document_referrer são apenas para event-logging e são descartados silenciosamente para atribuição. Não envie web_page_url ou document_referrer esperando que afetem a atribuição.

Para identidade de dispositivo e outros parâmetros compartilhados não listados acima, consulte Common Parameters em S2S Fundamentals em vez de redocumentá-los aqui.


attribution_data

O parâmetro attribution_data carrega dados de click-through de ad networks como JSON codificado em URL. Envie-o somente em eventos de conversão __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 obrigatórios

Campo Detalhes
partner_name

string

Mapeado a partir do parâmetro web wpsrc ou utm_source .

Exemplo: Snapchat

is_attributed

string

Defina true para eventos atribuídos.

Exemplo: true

partner_campaign_name

string

Mapeado a partir do parâmetro web wpcn ou utm_campaign .

Exemplo: Snap_campaign_1234

Campos opcionais

Campo Detalhes
touch_timestamp

integer

Horário do touchpoint em segundos UNIX.

Exemplo: 1751500800

partner_campaign_id

string

Mapeado a partir do parâmetro web wpcid .

partner_creative_id

string

Mapeado a partir do parâmetro web wpcrid .

partner_creative_name

string

Mapeado a partir do parâmetro web wpcrn .

partner_keyword

string

Mapeado a partir do parâmetro web wpkwn .

partner_site_id

string

Mapeado a partir do parâmetro web wpsid .

partner_site_name

string

Mapeado a partir do parâmetro web wpsn .

partner_sub_site_name

string

Mapeado a partir do parâmetro web wpssn .

partner_subcampaign_id

string

Mapeado a partir do parâmetro web wpscid .

partner_subcampaign_name

string

Mapeado a partir do parâmetro web wpscn .

IDs de clique da web no parâmetro e

Suporte a Conversion API de parceiros: Para encaminhar esses eventos aos parceiros de redes de anúncios por meio das integrações de Conversion API da Singular, inclua os atributos de evento opcionais padrão (dados próprios com hash, como eventId e ehash). Consulte Atributos de evento padrão para integrações de Conversion API.

Passe os IDs de clique da network no payload e do evento usando a chave JSON que cada parceiro espera:

Parceiro Chave(s) do Click ID
Snapchat ScCid
TikTok ttclid
Google gclid , gbraid , wbraid
DV360 dclid
Facebook fbclid
Reddit rdt_uuid

Detecção de parâmetros de marketing. Trate uma landing URL como um touchpoint quando ela contiver qualquer um de: utm_* ; Singular wp* ( wpsrc , wpcn , wpcid e similares); Singular pc* / p* ( pcid , pcn , psrc e similares); clid ; ou kw / an / ud . Em uma correspondência, armazene a URL completa como web_url e dispare um evento de conversão.


Atribuição web-to-app

Para levar o contexto de campanha da web para um clique móvel, crie um Singular Link a partir da sua landing page e anexe a query string de landing capturada. Isso encaminha os parâmetros de marketing para o clique móvel para que a instalação do app possa ser atribuída.

Ao chegar na landing page, capture window.location.search (mais o fragmento) quando ela contiver parâmetros de marketing e persista-o. Ao renderizar o link da app store ou do smart banner, construa:

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 anexado Detalhes
_web_params

Query string codificada em URL (mais o fragmento) da web_url de landing capturada. Encaminha os parâmetros de campanha UTM / wp* / pc* / clid para o clique móvel.

_dl

Argumento de deep link. Opcional.

_p

Argumento de passthrough. Opcional.

_ddl

Argumento de deferred deep link. Opcional.

Precisão: o SDID não é anexado ao link (sem _dsid ou _sdid ). Isso é encaminhamento de parâmetros de campanha, não device-stitching determinístico por SDID.


Atribuição por clipboard (deferred deep link)

A atribuição por clipboard fornece uma correspondência determinística para um deferred deep link. O trecho de código web grava um token único no clipboard; o app recém-instalado o lê de volta e faz a correspondência por igualdade 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);
}

Precisão: o clipboard mantém apenas o token — não o SDID, nem _web_params , e nem o deep link. A correspondência é por igualdade de token ( ecid no clique é igual ao token do clipboard), de modo que o app recém-instalado faz a correspondência de forma determinística.

A gravação no clipboard precisa ser executada dentro de um handler de gesto do usuário (um clique) ou os navegadores a bloqueiam. Observe as restrições de clipboard do iOS Safari.

Ler o clipboard no primeiro launch é responsabilidade do lado do app (sua própria integração de SDK/S2S móvel), não deste trecho de código web.


Exemplos de sequência de eventos

Primeira visita e registro

  1. O usuário chega pelo Google Ads. Envie a page visit 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. O usuário se registra. Envie o evento de registro:

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

Usuário retornante de uma nova campanha

  1. O mesmo navegador retorna de uma campanha diferente. Envie uma nova page visit:

    • n=__PAGE_VISIT__
    • conversion_event=true
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (mesmo SDID)
    • attribution_data={ "partner_name": "facebook", "is_attributed": "true", "partner_campaign_name": "retargeting_Q1" }
  2. O usuário faz uma compra. Envie o evento de compra:

    • n=sng_purchase
    • conversion_event=false
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (mesmo SDID)
    • custom_user_id persistido
    • Sem attribution_data