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 V2. 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 a referência do endpoint EVENT para autenticação e parâmetros comuns, e o hub de S2S Fundamentals para os conceitos básicos de S2S.
Endpoint
O Web S2S usa o mesmo host, caminho e método POST do endpoint EVENT V2 para dispositivos móveis. Defina p=Web para rotear a solicitação pelo caminho de atribuição web.
POST https://s2s.singular.net/api/v2/evt
V2 obrigatório a partir de 15 de julho de 2026. Contas criadas em 15 de julho de 2026 ou depois devem usar o Event Endpoint V2 (baseado em SDID); a V1 não está disponível para novas contas. Clientes existentes já integrados na V1 não são afetados. Entre em contato com seu Customer Success Manager da Singular se quiser migrar para a V2.
Cabeçalho obrigatório:
Content-Type: application/x-www-form-urlencoded
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_idapós o registro ou login, e em todos os eventos subsequentes. -
Persista-o no
localStorageou 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 na referência do endpoint EVENT, não aqui.
Parâmetros obrigatórios
| Parâmetro | Detalhes |
|---|---|
a
|
Tipo: String |
p
|
Tipo: String
|
i
|
Tipo: String
|
n
|
Tipo: String
|
sdid
|
Tipo: UUIDv4
|
conversion_event
|
Tipo: Boolean
|
attribution_data
|
Tipo: JSON
|
custom_user_id
|
Tipo: String
|
ip
|
Tipo: String
|
web_url
|
Tipo: String
|
Parâmetros recomendados
| Parâmetro | Detalhes |
|---|---|
device_user_agent
|
Tipo: String
|
web_page_referrer
|
Tipo: String
|
timezone
|
Tipo: String
|
os
|
Tipo: String
|
screen_width
|
Tipo: Integer
|
screen_height
|
Tipo: Integer
|
utime
|
Tipo: Integer
|
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 a referência do endpoint EVENT 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
|
Tipo: String
|
is_attributed
|
Tipo: String
|
partner_campaign_name
|
Tipo: String
|
Campos opcionais
| Campo | Detalhes |
|---|---|
touch_timestamp
|
Tipo: Integer
|
partner_campaign_id
|
Tipo: String
|
partner_creative_id
|
Tipo: String
|
partner_creative_name
|
Tipo: String
|
partner_keyword
|
Tipo: String
|
partner_site_id
|
Tipo: String
|
partner_site_name
|
Tipo: String
|
partner_sub_site_name
|
Tipo: String
|
partner_subcampaign_id
|
Tipo: String
|
partner_subcampaign_name
|
Tipo: String
|
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
|
gclid
,
gbraid
,
wbraid
|
|
| DV360 |
dclid
|
fbclid
|
|
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
|
_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
-
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" }
-
-
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
-
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" }
-
-
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_idpersistido -
Sem
attribution_data
-