fix(analytics): Attribute Awin affiliate sales even when the server conversion fails - #841
Conversation
…onversion fails Send the captured click id (`awc`) as `cks` on the `sread.img` fallback pixel, so a sale that misses the S2S call is still attributed deterministically instead of relying on Awin third-party cookies. Awin confirmed `sread.img` accepts `cks` the same way `sread.php` does. Add an opt-in test session, marked with `?awin_testmode=1` and kept on sessionStorage: the pixel then fires with `testmode=1` and the server skips the S2S conversion, which has no test flag on the REST API and would otherwise register a real order. On such a session the pixel always fires, as it becomes the only tracking channel. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Revisão adversarialEscopoA PR deveria: (1) mandar o Premissas verificadas
AchadosRequired
Optional
Nit
Eixos sem achado
VereditoAPROVAR COM RESSALVAS. O código de produção está correto. O item 1 compromete o objetivo declarado da PR e deve entrar antes do passo 2 do rollout, senão a homologação pode gerar outro pedido real. Não verificado: ESLint e |
The test mode check now runs after the purchase filter, so a test session logs once per test order instead of on every page view batch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HYm5krXU4pnuPzynSUMQUg
Drops the duplicated "REST API has no test flag" explanation, kept on the SSR send-to-awin.ts where the S2S call is skipped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HYm5krXU4pnuPzynSUMQUg
leomp12
left a comment
There was a problem hiding this comment.
O caminho da flag está redondo: ?awin_testmode=1 → sessionStorage → trackingIds → /_analytics → skip do S2S, sem whitelist no meio e sem estado dividido entre pixel e servidor (os dois leem o mesmo objeto, gravado na mesma chamada). O cks com o awc bate com o que a Awin usa nas integrações deles, e o guard !trackingIds.awc já garante que ele nunca sai vazio. Pular o S2S em vez de tentar um "modo teste" na API é a escolha certa, dado que ela não tem um.
Empurrei no branch:
- merge do
main(estava 6 commits atrás; só o #842 tocavavbeta-app.ts, em trecho separado); eea68ae— o check deisTestmodeemsend-to-awin.tsagora vem depois do filtro depurchase, então a sessão de teste loga o skip uma vez por pedido de teste, não a cada lote depage_view/view_item. Comportamento idêntico fora o log;c3f405a— o comentário deset-tracking-ids.tsdeixou de repetir a justificativa "API REST sem test flag" e aponta para osend-to-awin.ts, onde a decisão acontece.
🟠 A flag de teste não acompanha o awc numa aba nova
set-tracking-ids.ts:55 grava o awc também em cookie de 30 dias, exatamente porque sessionStorage doesn't survive a manually-opened tab, e :82/:107 o recuperam desse cookie. A analytics_awin_testmode fica só no sessionStorage.
Se quem estiver testando abrir o checkout ou a confirmação numa aba nova (ou retomar a compra em outra janela), essa aba tem o awc via cookie e não tem a flag. O servidor então faz o S2S e o pixel sai com testmode=0: o pedido de teste vira conversão real comissionada — o mesmo cenário que obrigou a loja a cancelar o pedido de teste anterior, que é justamente o que a PR quer evitar.
No fluxo normal da SPA na mesma aba não acontece, então não seguro o merge por isso. Mas como a validação com a Awin é o próximo passo, vale fechar agora: persistir a flag do mesmo jeito que o awc (cookie, com vida igual ou menor — de sessão já resolve), ou, no mínimo, deixar explícito no roteiro do rollout que o teste tem que ser feito do clique ao pedido na mesma aba.
🟢 Minors
- CodeFactor acusou 2 issues novas; o ESLint local passa limpo nos 4 arquivos, então provavelmente é métrica de complexidade do
getTrackingIds. Não bloqueia. - O follow-up de teste que você propôs (extrair o builder da URL do pixel) não tem issue ainda; o
packages/ssrsegue sem nenhum teste, como já apareceu na #811.
Aprovando — o ponto da aba nova fica a seu critério entre corrigir aqui ou só documentar no roteiro de teste.
Why
Awin homologation for Tia Sônia (advertiser 128977) is blocked on the fallback pixel. The S2S conversion is validated and working, but Awin won't launch with S2S only: the
sread.imgfallback fires without the click id today, so if the S2S call ever misses, attribution falls back to Awin's third-party cookies, which browsers increasingly block. Awin confirmedsread.imgacceptscksthe same waysread.phpdoes and asked for atestmode=1firing to validate.What
ckson the fallback pixel (vbeta-app.ts): theawccaptured on the click landing is now sent ascks, so the fallback attributes the sale deterministically without depending on cookies.?awin_testmode=1(set-tracking-ids.ts): kept onsessionStorage, flows to/_analyticswith the other tracking ids. On such a session:testmode=1;Nothing here is temporary. The test flag is scoped to one browser session and is meant to be reused on any future Awin validation without touching code.
Verification
no-consolewarnings invbeta-app.tsare pre-existing).tsc --noEmitonpackages/storefrontandpackages/ssr: no errors on the changed files (remaining output is the usualimport.meta.env/ alias noise outside Astro).emitAwinFallbackPixelisn't exported. Can be covered in a follow-up by extracting the URL builder.Rollout
@cloudcommerce/*ontiasonia/functions/ssr→ deploy.&awin_testmode=1, place an order, confirm on DevTools thatsread.imgcarriescksandtestmode=1.🤖 Generated with Claude Code