Appearance
Plan de implementación — Billing-driven dunning
Fase A · Billing emite eventos (2-3 días)
- Migración: tabla
billing_events_outbox(patrón outbox) conid,type,payload,created_at,published_at. - Trigger SQL en
invoicesque inserta en outbox cuando:statuscambia aoverdue.statuscambia apaid.statuscambia asuspended.
- Worker billing lee outbox y publica a Kafka
impulse.billing.events, marcapublished_at. - Topic + schema versionado (
schema_version=1en payload) para evolución futura.
Fase B · CRM consume (1 día)
- Agregar consumer group
crm-api-billing-eventseninternal/consumers/billing_events.go. - Registrar en
cmd/api/main.go. - Mapear eventos → handlers del
DunningService. - Tests de integración con testcontainers Kafka.
Fase C · Template nuevo (1 día + review Meta)
- Crear
payment_receiveden Meta Business Manager. - Enviar a review (suele tardar 24-48h).
- Mientras, desarrollar el handler
HandlePaidcon fallback a "mensaje de texto libre" por si no se aprueba el template.
Fase D · Ledger + observabilidad (1 día)
- Colección Mongo
dunning_ledger. - Endpoint
GET /v1/contacts/:id/dunning-history. - Widget en la vista del contacto (tab Cobranza) mostrando las últimas 10 notificaciones.
- Dashboard Grafana: mensajes enviados por día, tasa de respuesta (pagos < 24h post-mensaje), cooldowns saltados.
Fase E · Cutover (0.5 día)
- Deploy billing con outbox + worker (silencioso, nadie consume).
- Deploy CRM con consumer (silencioso, flag
DUNNING_EVENT_MODE=shadow) — lee eventos y los loggea pero no envía. - Validar durante 48h que shadow mode match con el polling.
- Flip
DUNNING_EVENT_MODE=primary,DUNNING_POLLING_FALLBACK=true(keep as safety net). - Dos semanas después,
DUNNING_POLLING_FALLBACK=false.
Riesgos
- Outbox lag: si el worker billing se cuelga, los overdue no se notifican. Mitigación: alerta Prometheus sobre
max(now - billing_events_outbox.created_at WHERE published_at IS NULL)> 15min. - Orden de eventos: si
paidllega antes queoverdue(carrera), el handler debe tolerarlo (check estado actual antes de actuar). - Duplicados: Kafka at-least-once + idempotency_key → OK.
Definición de done
- [ ] Zero polling en prod (flag off 14 días).
- [ ] Métrica
dunning_notification_latency_secondscon p95 < 60s (desdeinvoice.overdueamessage.sent). - [ ]
payment_receivedaprobado y en uso real. - [ ] Dashboard Grafana operativo con las 4 métricas clave.