Appearance
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:
| Evento | Trigger | Payload mínimo |
|---|---|---|
billing.invoice.overdue | cron interno al cruzar due_date | contact_id, invoice_id, amount_cents, due_date, days_overdue |
billing.payment.received | al confirmar pago | contact_id, invoice_id, amount_cents, paid_at |
billing.invoice.suspended | tras N días (configurable) | contact_id, invoice_id, suspended_at |
billing.subscription.reactivated | post-pago | contact_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 elOutboundJob. - 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
| Pieza | Responsable | Estado | Esfuerzo |
|---|---|---|---|
| Eventos billing | billing team | ❌ no existen | 2-3 días |
| Consumer CRM | CRM team | ❌ reemplazo del worker | 1 día |
Template payment_received | Meta approval | ❌ no enviado | 1 día + wait |
Tabla dunning_ledger + UI | CRM team | ❌ | 1 día |
Total estimado: ~1 semana para pasar a billing-driven end-to-end.
Siguiente: Plan de implementación — orden y detalles.