Single Responsibility
The orders service owns shipment status; the email delivery service owns sending email. A change to email retries can be deployed without changing the service that records shipments.
Suppose the store runs orders and message delivery as separate services. The orders service records a shipment and publishes an OrderShipped event. A message broker passes that event to delivery services, which contact the email or push notification provider. The services can be deployed separately, so the event becomes a contract between them.
The orders service owns shipment status; the email delivery service owns sending email. A change to email retries can be deployed without changing the service that records shipments.
The orders service publishes OrderShipped without naming its subscribers. A push delivery service can subscribe to the same event without adding a push call to the orders service.
A new version of the email delivery service must honor the same event contract as the old one. If an event is delivered again, it must not send the customer a second email.
The email delivery service needs shipment events, not every change to an order. A focused OrderShipped event keeps payment and refund data out of its contract.
The orders service and delivery services share the OrderShipped event contract. Provider SDKs and credentials stay inside the delivery services, so order processing does not depend on a particular provider.
Separate services need reliable event delivery, retries, and compatible event formats. Those costs make sense when teams need to deploy or operate the services independently. Otherwise, the same responsibilities can stay separated inside one application.
Sources: AWS on events between services, Richardson on duplicate event delivery, and Martin on architectural boundaries.