Skip to content

Gaps — De CRM-driven a billing-driven

Para que la cobranza sea reactiva (billing avisa, no el CRM pregunta), faltan 4 piezas.

1. Eventos de dominio en billing

Billing hoy no publica nada. Necesita producir al menos:

EventoTriggerPayload mínimo
billing.invoice.overduecron interno al cruzar due_datecontact_id, invoice_id, amount_cents, due_date, days_overdue
billing.payment.receivedal confirmar pagocontact_id, invoice_id, amount_cents, paid_at
billing.invoice.suspendedtras N días (configurable)contact_id, invoice_id, suspended_at
billing.subscription.reactivatedpost-pagocontact_id, subscription_id

Topic Kafka: impulse.billing.events, particionado por contact_id.

2. Consumer en el CRM

Reemplaza el worker horario por un consumer crm-api-billing-events:

go
for evt := range consumer {
    switch evt.Type {
    case "billing.invoice.overdue":
        dunningService.HandleOverdue(evt)
    case "billing.payment.received":
        dunningService.HandlePaid(evt) // manda "gracias por tu pago"
    case "billing.invoice.suspended":
        dunningService.HandleSuspended(evt)
    }
}

El worker horario queda como fallback (feature flag DUNNING_POLLING_FALLBACK=true) para el caso de que el event stream se rompa.

3. Confirmación de pago (feature nueva)

Cuando billing publique payment.received, el CRM manda:

✅ Hola {{1}}, recibimos tu pago de L. {{2}}. Gracias!
   Factura #{{3}} quedó saldada.

Requiere nuevo template Meta payment_received — ver templates.

4. Idempotencia y trazabilidad

Cada mensaje dunning debe:

  • Tener idempotency_key = "dunning:{invoice_id}:{template}" en el OutboundJob.
  • Registrarse en una colección dunning_ledger (invoice_id, template, sent_at, status) para auditoría.
  • Ser consultable desde la UI del cliente: "¿cuántas veces le avisamos?".

Resumen de gaps

PiezaResponsableEstadoEsfuerzo
Eventos billingbilling team❌ no existen2-3 días
Consumer CRMCRM team❌ reemplazo del worker1 día
Template payment_receivedMeta approval❌ no enviado1 día + wait
Tabla dunning_ledger + UICRM team1 día

Total estimado: ~1 semana para pasar a billing-driven end-to-end.

Siguiente: Plan de implementación — orden y detalles.

Impulse Tech · Documentación interna