Clube de Recompensas — Missões
Pré-requisitos de acesso
- Permissão (módulo):
viewRewardsProgram(para ler) /manageRewardsMissions(para criar/editar/ativar/recalcular) - Licença/Feature:
REWARDS_CLUB - Contêiner do menu: GERAL → grupo Clube de Recompensas
O que é / quando usar
Gerencia as missões do clube: regras orientadas a evento que, quando satisfeitas, concedem recompensa (asset + valor) e/ou pontos. A listagem é em cards com filtros por status, frequência e evento; a criação/edição usa um wizard de 4 passos (Trigger → Identidade → Recompensa → Vigência).
Use para desenhar a gamificação: "primeira ordem paga X", "login diário dá Y pontos", "investir em crowdfunding dá Z", etc. O catálogo cobre 28 eventos suportados, agrupados por categoria (Financeiro, Cadastro & KYC, Indicação, Crowdfunding, Marketplace & NFT, Staking, Volume & Streak, Mudança de Nível).
Pré-condições
- Permissão:
viewRewardsProgrampara ler;manageRewardsMissionspara editar (permissão dupla: enum CPM + módulo dinâmico no DB). - Licença/Feature:
REWARDS_CLUB. - Dependências de outras telas: o asset de recompensa deve existir; se a missão não definir um, o payout usa o asset padrão do Programa. Para missões com
missionPointsvalerem para o tier, o Programa precisa usar a métricaPOINTS.
Passo a passo
- Acesse o menu Clube de Recompensas → Missões (
/rewards-club/missions). - Filtre por status (todas/ativas/inativas), frequência, evento ou texto livre.
- Clique em Novo para abrir o wizard.
- Passo 1 – Trigger: escolha o evento no catálogo (tabs por grupo + cards explicativos). Aplique exemplos de
condition_jsonou edite as condições campo a campo. - Passo 2 – Identidade: nome (gera o
code/slug automaticamente), descrição, ícone. - Passo 3 – Recompensa: asset, valor, pontos, frequência e caps anti-fraude.
- Passo 4 – Vigência: datas, "exige usuário aprovado", nível mínimo.
- Salve. Para reaplicar a regra a eventos passados, use Recalcular.
Campos
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
Evento (event) | Gatilho da missão (1 dos 28 do catálogo) | Sim | Define quando a missão é avaliada (ex.: DEPOSIT_CONFIRMED, ORDER_EXECUTED, USER_LOGIN_DAILY). |
Condições (condition) | Filtros específicos do evento | Não | JSON editável campo a campo (ex.: thresholdFiat, minAmountFiat, everyN, assetFilter). Restringe quando a missão paga. |
Nome (name) / Código (code) | Nome exibido e slug único | Sim | O code é gerado por slug a partir do nome (na criação) e é estável entre replays — base da idempotência. |
Ícone (icon) | Ícone do card | Não | Material Icons; quick-picker com sugestões. |
Asset de recompensa (rewardAssetId) | Asset pago ao concluir | Sim no wizard (passo 3) | Se vazio no modelo final, o payout usa o defaultRewardAsset do Programa. |
Valor (rewardAmount) | Quanto é pago | Sim | String BigNumber; o passo 3 exige > 0. |
Pontos (missionPoints) | Pontos concedidos ao concluir | Não | Inteiro ≥ 0 (default 0). Contam para o tier quando o Programa usa a métrica POINTS. |
Frequência (frequency) | Cadência de pagamento | Sim | ONCE_PER_USER (1x na vida), ONCE_PER_DAY, ONCE_PER_MONTH, EVERY_N_OCCURRENCES (paga a cada N — exige everyN). |
A cada N (everyN) | N de ocorrências para pagar | Condicional | Obrigatório quando a frequência é EVERY_N_OCCURRENCES. |
Máx. por usuário (maxPerUser) | Teto absoluto por usuário | Não | undefined = ilimitado (ainda limitado pela frequência). |
Cap anti-fraude/usuário/dia (maxPayoutsPerUserPerDay) | Máx. de payouts em 24h por usuário nessa missão | Não | 0 = sem limite. Recomendado > 0 em missões event-driven que disparam repetidamente. |
Vigência (activeFrom / activeTo) | Janela de validade da missão | activeFrom sim | Fora da janela a missão não paga. |
Exige usuário aprovado (requiresApprovedUser) | Só paga usuário APPROVED | Não (default true) | Quando ligado, o payout só ocorre para usuário com status === 'APPROVED'. |
Nível mínimo (lockedUntilTier) | Restringe a missão a um tier ou acima | Não | A missão só dispara para usuários que atingiram o tier indicado. |
Ativa (isActive) | Liga/desliga a missão | — | Toggle inline na listagem. |
Ações e modais
- Salvar (wizard):
POST(nova) ouPUT(edição) em/v1/rewards-club/admin/missions. Exige step-up (senha + MFA).missionPointsé normalizado para inteiro ≥ 0. - Toggle ativa/inativa:
PATCH .../missions/:id/toggle. Em erro, o toggle reverte. - Recalcular:
POST .../missions/:id/recalculate. Pergunta se é para todos os usuários ou um userId específico, e mostra{evaluated, payoutsTriggered}ao final. Exige step-up (o interceptor responde ao challenge 428 automaticamente). É a ferramenta de recompute proativo: reavalia a missão contra eventos já capturados.
Regras de negócio / cuidados
Atenção
- Missões event-driven que podem disparar muitas vezes devem ter
maxPayoutsPerUserPerDay > 0para conter abuso/bot. - O
codeé a âncora de idempotência — não troque o código de uma missão em produção, senão replays/recálculos podem duplicar concessões. missionPointssó influencia o nível quando o Programa usa métricaPOINTS. Em métrica financeira, os pontos são apenas informativos.
Irreversível
- Recalcular pode disparar payouts reais retroativos. Revise o escopo (todos vs. um usuário) antes de confirmar; a operação concede recompensas de verdade.
- Valores financeiros:
rewardAmounté string BigNumber — sem arredondamento. - Idempotência: payouts via FinLib são idempotentes por
externalId; o erroE00021("already processed") é sucesso (concessão já efetivada), não falha — por isso o recompute proativo é seguro contra duplicação. - Status APPROVED: com
requiresApprovedUserligado, só usuários aprovados recebem.
Exemplos
Cenário 1 — Primeira ordem paga em token (1x por usuário)
- Trigger:
ORDER_EXECUTED. - Identidade: "Primeira ordem" (code
PRIMEIRA_ORDEM). - Recompensa: asset tBRL, valor
5,missionPointsopcional. - Frequência:
ONCE_PER_USER. - Vigência: a partir de hoje;
requiresApprovedUserligado. - Salve (step-up). Cada usuário aprovado recebe uma vez na vida.
Cenário 2 — Login diário dá pontos (clube por pontos)
- Trigger:
USER_LOGIN_DAILY. - Recompensa:
missionPoints = 50; valor monetário pode ser0. - Frequência:
ONCE_PER_DAY;maxPayoutsPerUserPerDay = 1. - Salve. Com Programa em métrica
POINTS, os pontos alimentam o tier.
Cenário 3 — A cada 10 ordens, bônus
- Trigger:
ORDER_EXECUTED, condiçãoeveryN: 10. - Frequência:
EVERY_N_OCCURRENCES,everyN = 10. - Recompensa: asset + valor do bônus.
- Salve. A missão acumula ocorrências e paga a cada 10.