Pular para o conteúdo principal

Smartico

Smartico é a plataforma de gamification + CRM + retention integrada à plataforma Cactus. Não é tracker de marketing tradicional — é a engine que entrega torneios, missões, prêmios e segmentação interna pra todas as brands.

Configuração por brand

Smartico é configurado em app/config/gamification/gamification.ts, dentro do bloco smartico do gamificationConfig. O campo do project key chama-se brandKey (camelCase).

:::note O path app/config/gamification.ts não existe mais Depois do reorg do app/config/ em subpastas semânticas, os arquivos são app/config/gamification/gamification.ts e app/config/gamification/gamification.server.ts. E o campo é brandKey, não brand_key. :::

// overrides/<brand>/app/config/gamification/gamification.ts
export const gamificationConfig: GamificationConfig = {
enabled: true,
provider: "smartico",
smartico: {
libraryUrl: "/proxy/smartico.js", // ← proxy same-origin, ver abaixo
labelKey: "27b3c09c-40e7-4d7c-882d-7b24850e0b69-3",
brandKey: "715dd9e9",
visitorLabelKey: "",
visitorBrandKey: "",
allowLocalhost: true,
enableDebug: false, // ← DEVE ficar false em prod
allowPush: false,
},
// naming, modules, ...
};

O default do base tem brandKey: "" (vazio) — toda brand com Smartico precisa de override. Todas as 13 brands do base têm um gamification.ts (lista viva em overrides/*/app/config/gamification/gamification.ts):

BrandbrandKey
7k-bet-br715dd9e9
betpontobet-bet-br499f03f5
casateste-com22c95432
cl-bet7k-com58b12db2
donald-bet-brf1be0b8b
fi-7k-bet32d11afc
ng-7k-bet79f82120
pb-bet421aa4c5
ph-state77-com3cb18241
pt-state77-com3cb18241
state77-com3cb18241
x2b-bet32d11afc
rj-bet""vazio, Smartico não configurado

:::caution Chaves compartilhadas entre brands As três state77 (ph-, pt-, state77-com) usam o mesmo brandKey 3cb18241, e x2b-bet usa o mesmo 32d11afc de fi-7k-bet. Brands que compartilham chave caem no mesmo projeto Smartico — campanha, torneio e segmento configurados lá valem pra todas elas juntas, e os relatórios vêm somados. Se marketing/CRM espera separação por brand nesses casos, isso precisa ser resolvido no painel Smartico.

rj-bet tem brandKey vazio, então não tem Smartico ativo. :::

:::caution enableDebug tem que ficar false em prod Ligado, emite 70+ chamadas de console por render do SmarticoInitializer e inunda o Cloudflare Observability. :::

Proxy same-origin do SDK

O client não busca o SDK no host do Smartico. Ele pede /proxy/smartico.js — um path do próprio domínio da brand — e o worker busca o upstream server-side (workers/middleware.ts).

Isso importa pra marketing/ops por dois motivos:

  1. Sobrevive a ad blockers e a bloqueio de terceiros — pro browser é um script first-party.
  2. Mantém o host upstream fora do client — nenhum nome de plataforma aparece em Network, DOM ou config visível ao usuário final, que é o requisito de neutralidade de marca.

Se o Smartico "não carrega", cheque o request /proxy/smartico.js (mesmo domínio) — não procure pelo host do fornecedor.

Como funciona

Eventos enviados

Smartico recebe eventos de funil parecidos com os do GTM, mas vai direto pro backend Smartico (não passa pelo dataLayer):

  • Login / Logout
  • Sign-up
  • Deposit initiated / confirmed
  • Bet placed (jogo)
  • Withdraw

Smartico SDK também aceita events custom — definidos pelo time de gamification.

Storage

O que a tabela de divulgação LGPD do próprio front (COOKIE_TABLE em app/utils/consent.ts — é o que o usuário vê no painel de consent) declara pro Smartico é __smartico_ls_*, na categoria "outros / marketing". O prefixo _ls_ indica storage localStorage-backed, não cookie clássico.

Se você procurava por _smartico_* em Cookies no DevTools e não achou, olhe em Application → Local Storage.

Matching de user

Front passa:

  • userId — ID do user na plataforma Cactus
  • userHash — hash assinada (HMAC) provando que o front conhece o user

Smartico valida o hash server-side antes de associar eventos. Sem hash válido, eventos viram "anonymous" no Smartico.

Widgets in-app

Smartico injeta widgets no DOM (popups, badges de gamification, notifications) quando o painel Smartico configura "widget triggers". Front não controla esses widgets — só fornece o SDK + identify.

Popups e o anaLayer

Nas brands com anaLayer ligado, a impressão dos popups de campanha do Smartico é instrumentada como modal_viewed (modal_category: "promo") por um MutationObserver na página — necessário porque o popup vem num <iframe srcdoc> isolado, que não consegue pushar no dataLayer da página. É assim que marketing consegue medir impressão de campanha Smartico. Detalhes em anaLayer.

Como debuggar

Smartico dashboard

smartico.ai → painel da brand → Activity Stream pra ver eventos chegando.

Console

window._smartico // SDK Smartico global
window._smartico?.dp(...) // abre um widget (torneios, loja, missões, jackpots…)
window._smartico.action("PROMOCODE", { promoCode }) // aplica promocode

O front usa window._smartico.dp(...) em toda a UI de gamification (torneios, missões, loja, mini-games, jackpots, sorteios, inbox) — é o handle de integração real. Se window._smartico não existir, nenhum desses botões faz nada.

Network → confira o /proxy/smartico.js (mesmo domínio da brand).

Anti-patterns

  1. Trocar userHash algorithm sem coordenar com Smartico backend. Quebra matching.
  2. Chamar identify antes de o usuário estar autenticado na plataforma. identify requer userId válido.
  3. Apontar libraryUrl direto pro host do fornecedor. Perde a resistência a ad blocker e expõe o host upstream no client (quebra a neutralidade de marca). Use sempre /proxy/smartico.js.
  4. Deixar enableDebug: true em prod. Inunda o Observability.
  5. Copiar brandKey/labelKey de outra brand sem intenção. Compartilhar chave junta as brands no mesmo projeto Smartico (ver o aviso acima) — às vezes é deliberado, mas nunca deve ser acidente.