Skip to main content

Schema

CampoTipoDescrição
leadOrganizationIdstringPK — partition key. FK para LeadOrganization
occurredAtIdstringSK — sort key. Formato: "2026-01-15T14:00:00Z#uuid"
sourceTypeenumEXTERNAL, INTERNAL, DIRECT
sourcestringIdentificador da origem, max 100. Ex: stripe, hotmart, messaging_service
eventTypestringTipo do evento normalizado, max 100. Ex: purchase_completed, conversation_ended
objectIdstring?ID interno do objeto referenciado, max 255
objectIdRefstring?ID externo/provider do objeto referenciado, max 255
payloadJSONDados normalizados e enriquecidos
rawPayloadJSON?Payload original intocado da origem (para debug e reprocessamento)
externalEventIdstring?ID original da origem (para idempotência), max 255
receivedAtdatetimeQuando o Domínio Lead recebeu o evento
Banco de dados: DynamoDB. Eventos vivem no DynamoDB por sua natureza append-only e alta cardinalidade — um único lead pode gerar milhares de eventos ao longo do tempo.
Eventos são append-only — nunca são editados ou deletados. O campo payload carrega os dados enriquecidos e normalizados. O rawPayload preserva o original para debug e reprocessamento. Eventos são a fonte da verdadeLeadMemories são derivadas de eventos e podem ser reconstruídas ao reprocessá-los.

Indexes

GSI: idempotency-index

KeyCampo
PKsource
SKexternalEventId
Usado para verificar eventos duplicados antes da escrita. Se (source, externalEventId) já existir, o evento é ignorado.

GSI: event-type-index

KeyCampo
PKleadOrganizationId
SKeventType#occurredAt
Usado para consultar eventos filtrados por tipo. Ex: “todos os eventos purchase_completed do lead X nos últimos 30 dias”.

Origens (Sources)

sourceTypesourceDescrição
EXTERNALstripe, hotmart, shopify, typeformVia Webhook Domain
INTERNALmessaging_serviceSinais extraídos de conversas
INTERNALdispatch_serviceResultados de entrega e engajamento de campanhas
INTERNALai_agents_serviceInsights dos agentes de IA
INTERNALbilling_serviceEventos de assinatura e pagamento
INTERNALticketing_serviceEventos de tickets de suporte
DIRECTwhatsapp, web, instagramLead iniciou interação em um canal

Tipos de Evento

CategoriaeventTypeCampos do payload
Purchasepurchase_completedproductId, productName, category, amount, currency, paymentMethod
Purchasepurchase_abandonedproductIds, cartValue, stageAbandoned
Productproduct_viewedproductId, productName, category
Productproduct_askedproductId, question, channel
Interestinterest_detectedcategory, productId, confidence
Sentimentsentiment_detectedscore, label, context
Supportticket_openedticketId, subject, productId, priority
Supportticket_resolvedticketId, resolution, satisfactionScore
Conversationconversation_startedchannel, context
Conversationconversation_endedchannel, durationSeconds, messageCount, sentimentScore
Campaigncampaign_deliveredcampaignId, campaignName, productId, channel
Campaigncampaign_engagedcampaignId, engagementType
Campaigncampaign_ignoredcampaignId, daysSinceDelivery
Subscriptionsubscription_createdplanId, planName, amount
Subscriptionsubscription_cancelledplanId, reason
Formform_submittedformId, formName, responses[]
Discountdiscount_requestedcontext, productId
Discountdiscount_accepteddiscountPercent, productId
Agentagent_insightinsightType, content, confidence
Objectionobjection_raisedtype, context, productId

Regras de Negócio

  • Eventos são append-only — nunca editados ou deletados
  • payload carrega os dados enriquecidos e normalizados. rawPayload preserva o original para debug
  • occurredAt é quando o fato aconteceu. receivedAt é quando o Domínio Lead recebeu o evento
  • Idempotência é garantida via GSI idempotency-index em (source, externalEventId)
  • Eventos são a fonte da verdadeLeadMemories são derivadas de eventos e podem ser reconstruídas ao reprocessá-los

Exemplo

{
  "PK": "ORG#org_01HX#LEAD#lead_01HX",
  "SK": "EVT#2026-03-20T14:22:00Z#evt_01HX",
  "eventType": "message.received",
  "source": "WHATSAPP",
  "payload": { "text": "Oi, quero saber mais sobre o plano enterprise", "mediaType": "text" },
  "idempotencyKey": "whatsapp_msg_ABC123",
  "ttl": 1758892800
}