Sistema de remarketing first-party com UUID v4 estável + audience tags do funil, brand-aware via feature flag (app/config/features/remarketing.ts). Vera ativa com cookie rmkvera (365 dias sliding TTL, Domain=.vera.bet.br, SameSite=None, Secure); demais brands fazem opt-in declarando seu próprio cookieName no override.
Cookie rmkvera_aud armazena tags do funil em JSON (90 dias sliding TTL, cap de 40 tags com eviction de oldest, set-once semantics) — pra ser usado como external_id em Meta CAPI, Google Enhanced Conversions e TikTok Events API. Funciona mesmo sem cookies de terceiros (iOS 14+, ITP, Brave).
Tags emitidas automaticamente em três eixos: path-based via useLocation brand-aware no Route Registry (viewed_casino, viewed_live_casino, viewed_game_detail, viewed_sports, viewed_promotions), modal-based via Zustand (clicked_register, registered, abandoned_register, viewed_deposit_modal, abandoned_deposit) e FTD-based em useAnalytics.trackDepositConfirmed (ftd_completed, multi_deposit).
Captura server-side no root loader (captureRemarketingIdFromRequest) — sobrevive a redirects via Set-Cookie na própria response do 302 (mesmo padrão do tracking de UTMs). Client-side RemarketingCapture faz refresh de TTL, publica em window.__rmk e dispara rmk_ready + rmk_audience_tag no dataLayer.
Regras duras: nome do cookie rejeita termos internos da plataforma (cactus, bluetec) em runtime, bot traffic é skipado no server, validador strict UUID v4 RFC 4122 contra cookies adulterados. 39 unit tests + 16 server-side tests cobrindo capture, Set-Cookie, regenerate em tamper, eviction.
Jornada FTD — Refatoração Completa e Novas Brands
D0 e D1 desacoplados — antes, ativar o template vera-legacy do D0 (cashback) ligava implicitamente o modal de anúncio do D1 (check-in). Agora cada brand habilita as três etapas independentemente: ftdCashback.enabled, ftdCheckin.enabled e a flag nova ftdCheckin.announcement.enabled. Quatro combinações possíveis — só D0, só D1, ambos ou nenhum.
Copy e assets configuráveis por brand no template vera-legacy — FtdCashbackConfig ganhou copy.{firstBonusToastTitle,cashbackModalTitle,cashbackModalDescriptionHtml,cashbackModalCtaText} + templateAssets.{firstBonusToastImage,cashbackModalImage}. FtdCheckinConfig ganhou announcement.copy.{title,descriptionHtml,ctaText} + templateAssets.image. Todos opcionais — fallback é o copy PT-BR + CDN da Vera (zero regressão).
16 tokens de tema novos para o template e o toast — ftd-offer.template-{shell-bg,title-text,title-shadow,image-bg-from,image-bg-to,highlight-bg,highlight-border,highlight-text,cta-bg,cta-text} e ftd-offer.toast-{bg-from,bg-to,border,icon-bg-from,icon-bg-to,icon-border}. FtdOfferModalTemplate e FtdOfferInGameToast agora leem essas cores via CSS custom properties inline (Tailwind JIT não consegue gerar classes a partir de tokens dinâmicos).
7k-bet-br ativa a jornada completa — D0 cashback, D1 check-in (com modal de anúncio "Garanta sua diversão!") e oferta-relâmpago pré-FTD, todos via template unificado. Quatro assets brand-specific da CDN do 7k substituem os fallbacks da Vera (toast, modal cashback, anúncio D1 e modal de oferta).
cassino-bet-br ativa a jornada completa — paleta + assets próprios, brand_id: 2 no Dark Verifier/Freedom (paridade com useFtdCashback.ts:52 do legado), kill-switches feFtdD0Cassino / feFtdD1Cassino, tabela bonusTiers de 35 níveis portada verbatim do legado (R$ 5 → R$ 3000+, cap em R$ 800), autoDepositModal abre o drawer de depósito automaticamente no login quando saldo ≤ R$ 0,10. Inclui lista de jogos elegíveis em cashback/eligible-games.ts.
cl-bet7k-com ativa D0 + D1 com identidade chilena — brandId: 4, kill-switch feFtdD07KCl (compartilhado D0/D1), tabela bonusTiers de 11 níveis em CLP (CLP 850 → CLP 510 000, cap CLP 136 000), 6995 IDs elegíveis portados 1:1 do legado, copy em espanhol chileno ("¡Sigue jugando para ganar un cashback!"). Moeda renderiza sem decimais ($50.000) via useFormatMoney() + CountryConfig.displayDecimalDigits. D1 começa desabilitado no primeiro rollout.
STT 2 (saldo bônus) com kill-switch remoto — saldoBonus.featureFlags?: { legacy?, configcat? } permite desligar a STT 2 instantaneamente via ConfigCat ou FF legado sem deploy. O hook useFtdCashbackFlow computa saldoBonusRemoteKillSwitchPass (closed-by-default enquanto a API está em voo, mesma semântica do D0/D1). Cassino declara feFtdSaldoBonus + feFtdSaldoBonusCassino.
@cactus-agents/games 2.0.0 — CASSINO_MODE=front_custom deixou de existir. Antes desta data havia 3 modes (legacy, api_new, front_custom); agora são apenas 2 (legacy, api_new). O front_custom era usado só pelo sandbox interno stage1 — stage1 migrou pra legacy e nenhuma brand de cliente consumia o mode. Em vez de manter código morto como surface area pública, o package removeu de vez.
Exports públicos removidos:createCustomCategoriesGamesFromClient, createCustomCategoriesGamesService, CustomCategoriesGamesOptions, CustomCategoryDef, CustomCategoriesConfig, CustomCategorySource, filterExplicitCategory, resolveCategoryGames, customCategoryDefToRaw. Tipo LegacyHomeRowConfig.type deixou de aceitar "custom-category".
Sobrevive intacto:HomeRow.type runtime ainda inclui "custom-category" / "custom-section" — esses são emitidos pelo BFF page pipeline em legacy e api_new e continuam funcionando. Curadoria por overlay (categories.personalize.ts) também continua válida nos dois modes.
Refactor interno:src/custom-categories.ts virou src/stats-ordering.ts; orderByStats, CustomCategoryOrderBy, DisplayPriority, StatDisplayKey continuam exportados do root do package (API pública preservada).
Documentação atualizada em conjunto:docs-internal/template/env-vars.md, docs-internal/template/games.md, docs-internal/forking/override-files.md, docs-external/customization/games.md e docs-external/deployment/environment.md reescritos para descrever apenas os 2 modes restantes. CASSINO_FRONT_CUSTOM_BASE removido das tabelas de env vars; regra de "paridade obrigatória" pra .new.ts/.custom.ts foi droppada (não existem mais). Guia de personalização aponta agora pra categories.personalize.ts em vez de categories.custom.ts.
Port do SEO legado (PR #352): infraestrutura completa de SEO com verificação, JSON-LD e helpers no base, descrições ricas por jogo (games-seo.server.ts) com templating de {brand_name}, conteúdo SEO + JSON-LD por liga em sports-seo.config.ts, e correções de gênero feminino nos artigos (A/Da/Na/Pela/À) para brands com nomes femininos como "vera". Bump de @cactus-agents/i18n para 0.69.0 para consumir as chaves do core ao invés de tabelas de locale inline.
Sistema estruturado de FAQ (mesmo PR #352): rotas, componentes e helpers para FAQs, com bloco GameFaqPreview na página de detalhe do jogo e redirect do FAQ legado. FAQs populadas para 7k-bet-br, cassino-bet-br, vera-bet-br e betpontobet-bet-br (≈725-790 entradas cada em faq.server.ts).