They decouple modules: one module publishes an event (“OrderPlaced”) and others react without tight coupling. Pitfalls: deciding sync vs async handling, avoiding doing heavy work inside the same transaction, and ensuring handlers are reliable and idempotent (events can be retried or processed twice).