Sistema
Configurações
Thresholds de classificação de status
src/domain/customers/status-config.ts
- Janela ativa
- ≤ 30 dias desde o último pedido
- Recuperação
- 30–45 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
| Tipo | Fonte | Confidence |
|---|---|---|
| cpf | Bling NFe | 1.00alta |
| cpf | Bling pedido | 0.95alta |
| cpf | Shopify Luft | 0.70média |
| Shopify customer | 1.00alta | |
| Bling NFe | 0.95alta | |
| shopify_customer_id | Shopify order | 1.00alta |
| bling_contact_id | Bling pedido | 1.00alta |
| phone_e164 | Shopify customer | 0.90alta |
| phone_e164 | Bling pedido | 0.85média |
| name_ptbr_normalized | Sheet Matriz | 0.30baixa |
Fonte vencedora por tipo de dado
Quem prevalece quando há conflito entre fontes
| Campo | Ordem de prioridade | Por quê |
|---|---|---|
| Nome do cliente | Bling NFe → Shopify customer → Planilha | NFe é fiscal, prevalece |
| Shopify customer → Bling NFe | Shopify exige na compra | |
| CPF | Bling NFe → Bling pedido → Shopify Luft tracking | NFe sempre vence |
| Telefone E.164 | Shopify customer.phone → billing → default → shipping → Bling celular | 94% Shopify null, fallback chain |
| Endereço | Bling NFe (mais completo) → Shopify shipping_address | NFe tem CEP+UF garantidos |
| Status do pedido | Shopify (financial+fulfillment) → Bling situacao | Shopify SoT, Bling enriquece deliveredAt |
| Total do pedido | Shopify total_price | única fonte oficial |
| SKU canônico | Product.shopifyId (variant_id Shopify) | Bling decompõe bundle, Shopify preserva |
Fontes de dados conectadas
Sistemas externos + papel no pipeline
| Fonte | Papel | Status |
|---|---|---|
| Shopify | Source of truth de pedido (preserva variant_id pra bundle decomposition) | ativa |
| Bling | Enrichment de Person (CPF + bling_contact_id) e Delivery (status/tracking real) | ativa |
| Planilha Matriz | Histórico legacy (pre-Shopify) — confidence 0.3, sem PII forte | ativa (one-shot) |
| WhatsApp Cloud | Mensagens inbound/outbound — webhook recebendo, processor TBD | webhook 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