diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index 35849139493b289e537af8508f08bb49d9d51486..89d249e484938752bc80f9774d966ef8550606d7 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -1662,15 +1662,6 @@ sieve_result_implicit_keep_finalize(struct sieve_result_execution *rexec)
 		break;
 	}
 
-	if (rexec->keep_equiv_action != NULL) {
-		struct sieve_action_execution *ke_aexec =
-			rexec->keep_equiv_action;
-
-		e_debug(rexec->event, "No implicit keep needed "
-			"(equivalent %s action already executed)",
-			sieve_action_name(&ke_aexec->action->action));
-		return ke_aexec->status;
-	}
 	if ((eenv->flags & SIEVE_EXECUTE_FLAG_DEFER_KEEP) != 0) {
 		e_debug(rexec->event, "Execution of implicit keep is deferred");
 		return rexec->keep_status;
@@ -1700,6 +1691,19 @@ sieve_result_implicit_keep_finalize(struct sieve_result_execution *rexec)
 	if (act_keep->def == NULL)
 		return rexec->keep_status;
 
+	if (rexec->keep_equiv_action != NULL) {
+		struct sieve_action_execution *ke_aexec =
+			rexec->keep_equiv_action;
+
+		i_assert(ke_aexec->state >=
+			 SIEVE_ACTION_EXECUTION_STATE_FINALIZED);
+
+		e_debug(rexec->event, "No implicit keep needed "
+			"(equivalent %s action already finalized)",
+			sieve_action_name(&ke_aexec->action->action));
+		return ke_aexec->status;
+	}
+
 	e_debug(rexec->event, "Finalize implicit keep (status=%s)",
 		sieve_execution_exitcode_to_str(rexec->status));