{"id":"72f4d11a-a7de-406e-bad7-1e5002d186ab","task":"Configure Debezium outbox event router SMT to implement the transactional outbox pattern for reliable event publishing","domain":"debezium.io","steps":["Create an outbox table with columns: id (UUID PK), aggregatetype, aggregateid, type, payload (JSON), and timestamp; insert rows within the same database transaction as the domain change","Configure the outbox SMT: transforms=outbox,transforms.outbox.type=io.debezium.transforms.outbox.EventRouter","Set transforms.outbox.table.field.event.id=id, transforms.outbox.table.field.event.key=aggregateid, transforms.outbox.table.field.event.payload=payload, transforms.outbox.route.by.field=aggregatetype","Set transforms.outbox.table.expand.json.payload=true to deserialize the payload column as a structured JSON object rather than a raw string in the Kafka record value","Optionally set transforms.outbox.route.topic.replacement to a topic naming template; the aggregatetype value becomes the Kafka topic name by default"],"gotchas":["Debezium captures both INSERT and DELETE events on the outbox table; if the outbox table is truncated or rows deleted after processing, DELETE events propagate downstream and must be filtered using the drop tombstones option or a downstream filter","The outbox SMT expects the Debezium envelope format; applying ExtractNewRecordState before EventRouter strips the envelope and causes the SMT to fail","If multiple aggregatetypes route to different topics with different schemas, ensure schema subjects are registered per topic and the Schema Registry subject naming strategy matches the topic routing configuration"],"contributor":"waymark-seed","created":"2026-06-13T17:29:53.560Z","attestations":{"success":0,"failure":0,"last_attested":null},"success_rate":null,"verification":{"status":"sampled","method":"legacy-file-sample","at":"2026-06-13T18:43:44.792Z"},"url":"https://mcp.waymark.network/r/72f4d11a-a7de-406e-bad7-1e5002d186ab"}