Salesforce Marketing Cloud — Data Extensions
Auth OAuth2, migração para Data Extension única, payload, bugs corrigidos e o padrão fire-and-forget sem retry.
Para quê: manter as bases de automação de marketing do Baita sincronizadas com o estado do usuário na Urbis. É exclusiva do Baita e não usa o mecanismo genérico de integrações da plataforma (tabela Integration / enum IntegrationType) — é 100% configurada por variáveis BAITA_SALESFORCE_*.
- Auth: OAuth2 Client Credentials Grant, POST {authUrl}/v2/token, token cacheado em memória e renovado 60s antes de expirar.
- Operação: upsertDataExtensionRows(items) → PUT /data/v1/async/dataextensions/key:{externalKey}/rows.
🟡 Mudança de arquitetura (commit 73e96584, 06/08/2026)
O modelo original de duas Data Extensions (principal + recompra separada) foi descontinuado. Hoje existe uma única DE (chave em BAITA_ASSINANTES_FULL, não mais BAITA_SALESFORCE_EXTERNAL_KEY), e os campos de recompra (pagamento, renovacao, qtdrenovacao) são enviados como campos extras no mesmo payload, condicionados a isRecompra.
isRecompra e totalRenewals vêm de getBaitaRenewalStats(userId) (subscription.service.ts:1464): soma count(Subscription) - 1 (linhas extras criadas por renovações PIX/cash) com renewalCount acumulado (recobranças de cartão, que reaproveitam a mesma linha).
Payload
Montado por buildSalesforceUserItem(user): telefone prefixado com 55, active como string 'true'/'false', complement default 'Sem complemento', locale: 'br' e lotteryCodeActivated: 'false' no builder.
🟡 Bug corrigido (commit 23b5e568)
pagamento e lotteryCodeActivated só eram enviados quando isRecompra era verdadeiro — cadastros novos nunca setavam esses campos, deixando dados obsoletos na DE (o Salesforce não limpa campo que não é enviado). Fix: pagamento sempre enviado e lotteryCodeActivated: 'false' explícito na criação.
Pontos de disparo
Todos gated por BAITA_WHITELABELID: ativação de access code PDV, criação de usuário via cartão, webhook PIX (novo cadastro e renovação), assinatura logged-in, cancelamento, ativação de código de sorteio, cron de inativação PIX/cash em lote e Saque e Pague.