diff --git a/lib/dynflow/execution_plan.rb b/lib/dynflow/execution_plan.rb
index <HASH>..<HASH> 100644
--- a/lib/dynflow/execution_plan.rb
+++ b/lib/dynflow/execution_plan.rb
@@ -126,8 +126,8 @@ module Dynflow
 
         world.transaction_adapter.rollback if error?
       end
+      steps.values.each(&:save)
       update_state(error? ? :stopped : :planned)
-      steps.values.each &:save
     end
 
     def skip(step)
First save the steps, then update the status of the execution plan

We use the persistence layer to update tasks in the Rails app. Not
having the steps available in this phase causes issues there.

Dynflow will probably get the events API sooner or later, but for now,
this fixes the current issues.