La elección que no se trata realmente de tecnología

Cuando una organización comienza a hablar de una Arquitectura Event Driven (EDA) en Salesforce, la conversación se inclina demasiado rápido hacia "¿Platform Events o CDC?" — como si fuera una cuestión de herramientas. En realidad, se trata de una pregunta completamente diferente: ¿qué lado de la integración es la fuente de la verdad, qué puede permitirse perder, y quién asume el costo cuando un mensaje llega tarde, duplicado o no llega en absoluto?

La respuesta corta: Change Data Capture (CDC) es adecuado cuando un sistema externo necesita saber que Salesforce ha actualizado un registro y no hay necesidad de envolverlo con lógica de negocio. Los Platform Events personalizados son adecuados cuando se desea publicar un evento de negocio significativo — "el cliente actualizó su plan", no "el campo _Status_c cambió". La elección incorrecta no se hace evidente el día del lanzamiento; se hace evidente cuando alguien necesita reconstruir lo sucedido después de un fallo parcial y descubre que no hay una forma fiable de saberlo.

Quien busque una visión más amplia de las integraciones de Salesforce más allá de los eventos la encontrará en la guía de arquitectura CRM.

Tres preguntas que definen la arquitectura antes de escribir una línea de código

Antes de elegir un mecanismo, se necesita una respuesta a tres preguntas. Omitir una de ellas es la razón más común por la que los proyectos de integración se estancan en la fase de pruebas.

¿Quién es el dueño del dato? Si Salesforce es la fuente de la verdad para el registro del cliente, los eventos de salida de Salesforce (Platform Event o CDC) son la dirección natural. Si el sistema ERP es el propietario, la dirección opuesta es correcta, y Salesforce debe consumir eventos en lugar de publicarlos sobre la misma entidad.

¿Qué se puede perder? Una alerta a un dashboard de gestión puede perder un solo mensaje sin causar daño. Una actualización del saldo de crédito antes de aprobar una transacción no puede. Esta distinción determina si es suficiente un "disparar y olvidar" (Fire-and-Forget) o si se requiere un mecanismo de confirmación y monitoreo de discrepancias (Reconciliation).

¿Qué sucede cuando el mensaje llega dos veces? Los Platform Events garantizan At-Least-Once, no Exactly-Once. Si la respuesta es "no sabemos" — la solución aún no está lista para producción, independientemente de la limpieza del código.

Platform Events vs. CDC — Tabla de decisión

CriterioPlatform Event personalizadoChange Data Capture (CDC)
Qué se publicaEvento de negocio definido (Payload personalizado)Cambio de registro en bruto (Antes/Después)
Quién construye la lógicaDesarrollador de Salesforce, en el Trigger o FlowLa plataforma, automáticamente para cada DML configurado
Acoplamiento al esquemaBajo — el Payload es controlado por el publicadorAlto — cualquier cambio en la estructura del objeto afecta al consumidor
Adecuado cuando...Se desea publicar una intención de negocio ("orden aprobada")Se desea una sincronización de datos en bruto entre sistemas
Costo de mantenimientoMás alto al principio (construcción del Payload y la lógica)Bajo al principio, alto cuando cambia la estructura del objeto
RetenciónSegún la definición de la licencia (horas a días)Según la definición de la licencia, generalmente igual que los Platform Events
Volumen recomendadoEventos de dominio con frecuencia mediaCambios a nivel de registro, incluyendo alta frecuencia

La regla práctica: si el consumidor del evento necesita entender "por qué" sucedió y no solo "qué" sucedió — se necesita un Platform Event personalizado. Si el consumidor solo necesita una copia actualizada del dato — CDC ahorra toda una capa de desarrollo.

Ordering, Replay e Idempotency: los tres conceptos que convierten la teoría en producción estable

Estos no son temas para una etapa tardía del proyecto — definen la estructura del consumidor desde el primer día.

Ordering. Los Platform Events se envían en el orden de publicación dentro del mismo tema, pero la carga y los fallos parciales pueden alterar el orden de recepción por parte del consumidor. Solución práctica: adjuntar a cada evento una marca de versión o Sequence Number del registro original, y permitir que el consumidor rechace un evento cuya versión sea inferior a la última versión ya procesada.

Replay. Cada evento recibe un Replay ID. Un consumidor que falla debe guardar el último Replay ID procesado con éxito — no en la memoria, sino en un lugar persistente (Custom Object, tabla externa) — y continuar desde allí con la recuperación. Confiar en que "el sistema comenzará desde cero" solo funciona dentro de la ventana de retención, y más allá de ella los eventos se pierden.

Idempotency. Cada consumidor debe identificar un evento que ya ha sido procesado, generalmente por un identificador de transacción único enviado dentro del Payload. Sin esto, un reintento automático por parte del remitente — o un Replay manual después de un fallo — se convierte en una actualización doble, la creación de un registro doble o, en el peor de los casos, un cargo doble.

Esta brecha casi nunca se detecta en la demostración. Se detecta bajo carga, en un fallo de red real o en un cambio en el entorno de producción, y entonces el costo de solucionarlo ya incluye también la corrección de datos. Las organizaciones que encuentran un problema paralelo en la capa de automatización encuentran un análisis complementario en deuda técnica de Salesforce en Flow y Apex.

Escenario de ejemplo: cadena minorista con 40 sucursales y sistema de inventario separado

Asumamos una cadena minorista hipotética, "Retail del Norte", que opera Salesforce Sales Cloud con equipos de ventas en 40 sucursales, y un sistema ERP separado que gestiona el inventario en tiempo real. Hasta ahora, cada pedido cerrado en Salesforce se transfería al ERP mediante un Job programado que se ejecutaba cada 15 minutos — una solución que provocaba que los representantes a veces vieran inventario desactualizado y aprobaran pedidos de productos agotados.

El equipo de arquitectura decidió publicar un Platform Event personalizado llamado Order_Confirmed__e cada vez que se aprobara un pedido, con un Payload que incluyera un identificador de transacción único, una lista de artículos y cantidades. El ERP escucha el evento y actualiza el inventario en segundos, verificando el identificador de transacción contra una tabla de transacciones ya procesadas — para evitar una doble deducción si el evento llegara dos veces.

Además, se definió un proceso de Reconciliation nocturno que compara el total de pedidos aprobados en Salesforce con el total de actualizaciones registradas en el ERP, y alerta sobre una discrepancia por encima de un umbral definido. La razón: incluso con una Idempotency correcta, se desea una detección temprana de un fallo de red prolongado y no solo confiar en que el evento "seguramente llegó". El resultado: el tiempo de actualización se redujo de 15 minutos a menos de un minuto, y el número de incidentes de inventario incorrecto disminuyó de manera medible en un mes desde la implementación.

Este escenario ilustra un principio clave: el valor no se crea por la "transición a eventos" en sí misma, sino por la combinación de un evento de negocio claro, una verificación de duplicados por parte del consumidor y un proceso de monitoreo que identifica una discrepancia antes de que se convierta en una queja de cliente.

Riesgos comunes y acciones de prevención

RiesgoCómo se manifiesta en la prácticaAcción de prevención
Publicación de un evento por cada cambio de campoLa cuota diaria de eventos se excede en pocos díasPublicar eventos de dominio con significado de negocio, no un evento técnico por cada DML
No hay verificación de duplicados por parte del consumidorUn reintento (Retry) o Replay crea registros o actualizaciones duplicadosAdjuntar un identificador de transacción único y verificarlo antes de cada operación
Confianza en el orden de llegadaUna actualización antigua sobrescribe una actualización más recienteAdjuntar una marca de versión y rechazar eventos más antiguos que la última versión procesada
No se guarda el Replay IDDespués de una caída del consumidor, los eventos entre la caída y la ventana de retención se pierdenGuardar el Replay ID en un lugar persistente y ejecutar un Replay automático al reiniciar
CDC en un objeto cuya estructura cambia con frecuenciaCada cambio de campo rompe el consumidor externo sin previo avisoDefinir un contrato de datos explícito y comunicar los cambios de esquema con antelación
No hay monitoreo de negocio, solo monitoreo técnicoLa integración está "en verde" pero el inventario o los pedidos reales no coincidenAñadir una Reconciliation diaria que compare el resultado de negocio entre los sistemas

Checklist antes de empezar a desarrollar la capa de eventos

  • ☐ Cada evento tiene un propietario claro: quién publica y quién es el propietario comercial del dato.
  • ☐ Se ha definido un Payload consistente y documentado, no una estructura que cambia con cada Sprint.
  • ☐ Se ha elegido entre Platform Event personalizado y CDC según la intención comercial frente al cambio de datos en bruto.
  • ☐ Cada consumidor tiene un identificador de transacción único y verificación de duplicados (Idempotency).
  • ☐ Se define el tratamiento del orden mediante una marca de versión, no por orden de llegada.
  • ☐ El Replay ID se guarda en un lugar persistente y se define y prueba un proceso de recuperación.
  • ☐ Existe un monitoreo comercial (Reconciliation) además del monitoreo técnico de la cola de mensajes.
  • ☐ Se ha probado el escenario de carga y el escenario de fallo parcial, no solo el Happy Path.
  • ☐ La cuota diaria de eventos (Publish + Delivery) se ha verificado frente al volumen esperado en producción.
  • ☐ Se ha definido un Owner operativo para responder cuando se detecta una discrepancia en la Reconciliation.

¿Cómo se mide el funcionamiento de la arquitectura?

ÁreaQué se mideFrecuencia de verificación
Fiabilidad de la entregaPorcentaje de eventos completados sin reintento (Retry), y porcentaje que tuvo éxito después del reintentoContinuo
Discrepancias en ReconciliationDiferencia entre los registros confirmados en el origen y los registros recibidos en el destinoDiario
Latencia de extremo a extremoTiempo entre el evento de negocio y la actualización efectiva en el consumidorContinuo
Utilización de la cuota de eventosPorcentaje de la cuota diaria utilizadaSemanal
Duplicados evitadosNúmero de eventos identificados como duplicados y bloqueados antes de su ejecuciónSemanal

Se recomienda elegir no más de tres o cuatro métricas para la primera versión, y medirlas contra una línea de base (Baseline) recopilada antes de la transición a la arquitectura de eventos — no contra una sensación general de que "ahora es más rápido".

Para una planificación más amplia de la estructura organizacional de múltiples integraciones, también es aconsejable revisar los patrones de integración de Salesforce y las implicaciones para la arquitectura Single Org vs. Multi Org de Salesforce, ya que una decisión sobre eventos a veces cruza los límites organizacionales.

Resumen

La elección entre Platform Events y CDC no es una cuestión técnica que se analiza en un corto período al inicio de un proyecto — determina quién es la fuente de la verdad, qué se puede perder y cómo se comporta el sistema cuando algo falla a mitad de camino. Una organización que planifica de antemano el Ordering, Replay e Idempotency, y añade una capa de Reconciliation de negocio y no solo un monitoreo técnico, obtiene una integración que soporta la carga y los fallos parciales. Una organización que omite estos pasos obtiene un sistema que parece correcto en las pruebas y que falla en silencio en producción, generalmente sin que nadie se dé cuenta hasta que el daño ya ha ocurrido.

Las organizaciones que desean acompañamiento en la construcción de una capa de eventos fiable en Salesforce pueden contactar a través del servicio de arquitectura CRM.