Skip to content

Retenção e Exclusão de Dados

Define por quanto tempo cada dado é mantido e como é excluído quando solicitado ou quando o prazo expira.

Prazos de retenção

DadoLocalPrazoJustificativa
Dados de clientes (nome, email, telefone)PostgreSQL CustomerEnquanto ativo no ERPContrato com organização
CPF hashPostgreSQL Customer.cpfHashMesmo que clienteDeduplicação necessária
CPF criptografadoPostgreSQL Customer.cpfEncryptedMesmo que clienteUso interno
Histórico de comprasPostgreSQL Transaction5 anosObrigação fiscal (CTN art. 174)
Conversas WhatsAppChatwootConfigurável no ChatwootSem expiração automática no CRM
Mensagens WhatsApp (WhatsappMessage)PostgreSQLSem expiração definidaReconciliação e auditoria
Logs de auditoria (AccessLog)PostgreSQLSem expiração automáticaSegurança — recomendado 1 ano
Tokens de redirectPostgreSQL CampaignRedirectToken30 dias (campo expiresAt)Expiram automaticamente
Pesquisas de satisfaçãoPostgreSQL SurveyResponseSem expiração definidaHistórico de qualidade
Histórico RFMPostgreSQL RfmHistorySem expiração definidaAnálise de tendência
Log de jobs (JobRun)PostgreSQLSem expiração definidaDebug e auditoria

Exclusão de dados

Como solicitar exclusão (direito ao esquecimento — art. 18, VI)

  1. Titular entra em contato com daniel.galdencio2560@gmail.com
  2. DPO verifica se há obrigação legal que impeça a exclusão (ex: histórico fiscal de 5 anos)
  3. Se não houver impedimento, acionar o processo abaixo

Processo técnico de exclusão de cliente

bash
# 1. Marcar como opt-out imediatamente (parar comunicações)
PATCH /customers/:id  { "whatsappOptOut": true, "emailOptOut": true }

# 2. Verificar transações (podem ser necessárias por 5 anos)
GET /customers/:id/transactions

# 3. Anonimizar dados pessoais (se não puder excluir completamente)
# Campos a nullificar: name, email, phone, cpfHash, cpfEncrypted, cpfMasked,
#                      birthDate, zipCode, city, state, address, neighborhood
# Manter: id, storeId, organizationId, totalSpent, orderCount, lastOrder (anonimizados)

# 4. Excluir conversas no Chatwoot via API Chatwoot
DELETE {chatwoot_url}/api/v1/accounts/{account_id}/conversations/{id}

# 5. Revogar tokens de redirect ativos
# Deletar CampaignRedirectToken onde customerId = :id e expiresAt > now()

Nota: Não existe endpoint de exclusão automática de cliente na versão atual. A exclusão é manual via banco ou endpoint de update para anonimizar campos.

Anonimização vs. exclusão

Quando há transações fiscais vinculadas ao cliente, a exclusão completa pode ser inviável. Nesse caso, anonimiza-se (nullifica campos pessoais, mantém totais financeiros). O sistema continuará funcionando pois customerId nas transações é opcional.

Retenção de logs de auditoria

Os AccessLog não têm TTL automático. Recomenda-se:

sql
-- Purgar logs com mais de 1 ano (executar via psql direto)
DELETE FROM "AccessLog"
WHERE "createdAt" < NOW() - INTERVAL '1 year';

Tokens expirados

CampaignRedirectToken com expiresAt < now() não são deletados automaticamente. Para limpar:

sql
DELETE FROM "CampaignRedirectToken"
WHERE "expiresAt" < NOW();

Portabilidade de dados (art. 18, V)

Para exportar todos os dados de um cliente:

http
GET /customers/:id
GET /customers/:id/transactions
GET /customers/:id/events

Combinar as respostas e entregar em formato JSON ou CSV ao titular.

Documentação interna — Galdix CRM