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):
| Brand | brandKey |
|---|---|
7k-bet-br | 715dd9e9 |
betpontobet-bet-br | 499f03f5 |
casateste-com | 22c95432 |
cl-bet7k-com | 58b12db2 |
donald-bet-br | f1be0b8b |
fi-7k-bet | 32d11afc |
ng-7k-bet | 79f82120 |
pb-bet | 421aa4c5 |
ph-state77-com | 3cb18241 |
pt-state77-com | 3cb18241 |
state77-com | 3cb18241 |
x2b-bet | 32d11afc |
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:
- Sobrevive a ad blockers e a bloqueio de terceiros — pro browser é um script first-party.
- 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 CactususerHash— 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
- Trocar
userHashalgorithm sem coordenar com Smartico backend. Quebra matching. - Chamar
identifyantes de o usuário estar autenticado na plataforma.identifyrequeruserIdválido. - Apontar
libraryUrldireto 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. - Deixar
enableDebug: trueem prod. Inunda o Observability. - Copiar
brandKey/labelKeyde 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.