diff --git a/e2e/suite/job_generate_test.go b/e2e/suite/job_generate_test.go
index e36156aee7bd32b4b4d1d122dffde98929384699..b480c3eb81ac15ffb0164a21a09a5108d6a28661 100644
--- a/e2e/suite/job_generate_test.go
+++ b/e2e/suite/job_generate_test.go
@@ -51,9 +51,13 @@ var _ = Describe("Job Generation", func() {
 			Expect(jobs[0].Status.Active).To(BeNumerically("==", 0))
 			Expect(jobs[0].Status.Failed).To(BeNumerically(">=", 1))
 
+			Eventually(e2e.GetPlan).
+				WithArguments(plan.Name, metav1.GetOptions{}).
+				WithTimeout(30 * time.Second).
+				Should(WithTransform(upgradeapiv1.PlanComplete.IsTrue, BeFalse()))
+
 			plan, err = e2e.GetPlan(plan.Name, metav1.GetOptions{})
 			Expect(err).ToNot(HaveOccurred())
-
 			plan.Spec.Upgrade.Args = []string{"exit 0"}
 			plan, err = e2e.UpdatePlan(plan)
 			Expect(err).ToNot(HaveOccurred())
@@ -67,6 +71,11 @@ var _ = Describe("Job Generation", func() {
 			Expect(jobs[0].Status.Succeeded).To(BeNumerically("==", 1))
 			Expect(jobs[0].Status.Active).To(BeNumerically("==", 0))
 			Expect(jobs[0].Status.Failed).To(BeNumerically("==", 0))
+
+			Eventually(e2e.GetPlan).
+				WithArguments(plan.Name, metav1.GetOptions{}).
+				WithTimeout(30 * time.Second).
+				Should(WithTransform(upgradeapiv1.PlanComplete.IsTrue, BeTrue()))
 		})
 	})
 
diff --git a/pkg/apis/upgrade.cattle.io/v1/types.go b/pkg/apis/upgrade.cattle.io/v1/types.go
index 63fc5240ba1d4a67aee102621f8016db3ec7cf35..59a104051bddcfaa8d265599eac358fc2f5947b2 100644
--- a/pkg/apis/upgrade.cattle.io/v1/types.go
+++ b/pkg/apis/upgrade.cattle.io/v1/types.go
@@ -17,6 +17,8 @@ var (
 	PlanLatestResolved = condition.Cond("LatestResolved")
 	// PlanSpecValidated indicates that the plan spec has been validated.
 	PlanSpecValidated = condition.Cond("Validated")
+	// PlanComplete indicates that the latest version of the plan has completed on all selected nodes.
+	PlanComplete = condition.Cond("Complete")
 )
 
 // +genclient
diff --git a/pkg/upgrade/handle_upgrade.go b/pkg/upgrade/handle_upgrade.go
index 95da018a986c0500cadf6e966b12a044009d20d6..876d1ee4a4908430c68d97d28dcfeac41e7cba21 100644
--- a/pkg/upgrade/handle_upgrade.go
+++ b/pkg/upgrade/handle_upgrade.go
@@ -93,6 +93,7 @@ func (ctl *Controller) handlePlans(ctx context.Context) error {
 				concurrentNodeNames[i] = upgradenode.Hostname(node)
 			}
 			obj.Status.Applying = concurrentNodeNames[:]
+			upgradeapiv1.PlanComplete.SetStatusBool(obj, len(concurrentNodeNames) == 0)
 			return objects, obj.Status, nil
 		},
 		&generic.GeneratingHandlerOptions{