The external side-effects also need to support idempotency keys, which you propagate. Then you use something like a message queue to drive the process to completion.