diff --git a/uc_signup.module b/uc_signup.module
index 8bc523a..a327640 100644
--- a/uc_signup.module
+++ b/uc_signup.module
@@ -987,13 +987,18 @@ function uc_signup_order($op, &$arg1, $arg2) {
     case 'submit':
       foreach ($arg1->products as $product) {
         if (isset($product->data['uc_signup_enabled']) && $product->data['uc_signup_enabled'] == 1) {
-          $events_to_signup[] = $product;
+          $events_to_signup[$product->nid] = $product;
         }
       }
       if (!empty($events_to_signup)) {
         // Clear any existing placeholder signups before proceeding.
         uc_signup_cancel_temporary_signups($arg1);
         foreach ($_SESSION['uc_signup']['nids'] as $nid => $attendees) {
+          // Don't create signups for products that may be in the session
+          // data but not in the cart.
+          if (!isset($events_to_signup[$nid])) {
+            continue;
+          }
           foreach ($attendees as $key => $mail) {
             $account = user_load(array('mail' => $mail));
             // We must provide a default password
@@ -1042,19 +1047,26 @@ function uc_signup_order($op, &$arg1, $arg2) {
           }
         }
         unset($nid);
-        foreach ($to_signup as $nid => $uids) {
-          // Perform the final verification that the node is available for signups in the desired quantity.
-          // Note that we do not pass the quantity in order to avoid our own placeholder signups from counting against the number of available spots.
-          $node = node_load($nid);
-          _uc_signup_node_available($node, 0, $message);
-          if ($message) {
-            uc_signup_cancel_temporary_signups($arg1);
-            return array(array('pass' => FALSE, 'message' => t($message)));
-          }
-          foreach ($uids as $key => $uid) {
-            uc_signup_create_placeholder_signup($nid, $uid, $arg1->order_id);
+        if (!empty($to_signup)) {
+          foreach ($to_signup as $nid => $uids) {
+            // Perform the final verification that the node is available for signups in the desired quantity.
+            // Note that we do not pass the quantity in order to avoid our own placeholder signups from counting against the number of available spots.
+            $node = node_load($nid);
+            _uc_signup_node_available($node, 0, $message);
+            if ($message) {
+              uc_signup_cancel_temporary_signups($arg1);
+              return array(array('pass' => FALSE, 'message' => t($message)));
+            }
+            foreach ($uids as $key => $uid) {
+              uc_signup_create_placeholder_signup($nid, $uid, $arg1->order_id);
+            }
           }
         }
+        // If we made it this far, we've created user accounts and signups.
+        // Clear out the session date so it's not present for future orders.
+        if (isset($_SESSION['uc_signup'])) {
+          unset($_SESSION['uc_signup']);
+        }
       }
       break;
     case 'delete':
