Thresholds de classificação de status
src/domain/customers/status-config.ts
Janela ativa
30 dias desde o último pedido
Recuperação
3045 dias sem comprar
Inativo
45 dias sem comprar
Novo
primeiro pedido ≤ 14 dias
Frequente
2 pedidos no mês corrente
Precedência: inactive> recovery > new > frequent > active. Status terminal vence sinais de cohort/comportamento.
Hierarquia de confiança · identifiers
Quanto maior a confidence, mais peso no IdentityResolver
TipoFonteConfidence
cpfBling NFe1.00alta
cpfBling pedido0.95alta
cpfShopify Luft0.70média
emailShopify customer1.00alta
emailBling NFe0.95alta
shopify_customer_idShopify order1.00alta
bling_contact_idBling pedido1.00alta
phone_e164Shopify customer0.90alta
phone_e164Bling pedido0.85média
name_ptbr_normalizedSheet Matriz0.30baixa
Fonte vencedora por tipo de dado
Quem prevalece quando há conflito entre fontes
CampoOrdem de prioridadePor quê
Nome do clienteBling NFe → Shopify customer → PlanilhaNFe é fiscal, prevalece
EmailShopify customer → Bling NFeShopify exige na compra
CPFBling NFe → Bling pedido → Shopify Luft trackingNFe sempre vence
Telefone E.164Shopify customer.phone → billing → default → shipping → Bling celular94% Shopify null, fallback chain
EndereçoBling NFe (mais completo) → Shopify shipping_addressNFe tem CEP+UF garantidos
Status do pedidoShopify (financial+fulfillment) → Bling situacaoShopify SoT, Bling enriquece deliveredAt
Total do pedidoShopify total_priceúnica fonte oficial
SKU canônicoProduct.shopifyId (variant_id Shopify)Bling decompõe bundle, Shopify preserva
Fontes de dados conectadas
Sistemas externos + papel no pipeline
FontePapelStatus
ShopifySource of truth de pedido (preserva variant_id pra bundle decomposition)ativa
BlingEnrichment de Person (CPF + bling_contact_id) e Delivery (status/tracking real)ativa
Planilha MatrizHistórico legacy (pre-Shopify) — confidence 0.3, sem PII forteativa (one-shot)
WhatsApp CloudMensagens inbound/outbound — webhook recebendo, processor TBDwebhook only
Regras anti-spam (WhatsApp)
CLAUDE.md regra inegociável #3
Janela 48h
Máx 1 mensagem automática por pessoa a cada 48h
Cap diário
200 mensagens no total (todas as pessoas)
Quiet hours
Sem disparo entre 22h e 8h (TZ SP)
Opt-out
Bloqueio absoluto · Person.doNotContact = true
Dry run
Flag DRY_RUN no .env desativa envio real