diff --git src/bp-groups/actions/join.php src/bp-groups/actions/join.php
index 812d6e33b..d71b62d5a 100644
--- src/bp-groups/actions/join.php
+++ src/bp-groups/actions/join.php
@@ -18,6 +18,14 @@ function groups_action_join_group() {
 		return;
 	}
 
+	/*
+	 * Ensure that the invite_status key exists, to avoid a group being joinable when its
+	 * creation process was interrupted.
+	 */
+	if ( ! groups_get_groupmeta( bp_get_current_group_id(), 'invite_status' ) ) {
+		return;
+	}
+
 	// Nonce check.
 	if ( ! check_admin_referer( 'groups_join_group' ) ) {
 		return;
diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
index 755293356..7c73b2fd9 100644
--- src/bp-groups/bp-groups-functions.php
+++ src/bp-groups/bp-groups-functions.php
@@ -664,15 +664,7 @@ function groups_join_group( $group, $user_id = 0 ) {
 
 	$group = bp_get_group( $group );
 
-	/*
-	 * When the group create first step is completed, the group's status has not been defined by the
-	 * group creator yet and defaults to public. As the group status & the invite status are set once
-	 * the group create second step is completed, we need to wait for this step to be achieved to let
-	 * users join the group being created otherwise it would be possible for a user to "pre-join" a
-	 * private/hidden group. Checking if the invite status is set is the only way to make sure this
-	 * second step has been completed. If it's not the case, no need to go further.
-	 */
-	if ( empty( $group->id ) || ! groups_get_groupmeta( $group->id, 'invite_status' ) ) {
+	if ( empty( $group->id ) ) {
 		return false;
 	}
 
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index 809dc0ac7..8d5927298 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -1616,6 +1616,15 @@ function bp_legacy_theme_ajax_joinleave_group() {
 				esc_html_e( 'Error joining group', 'buddypress' );
 			}
 
+			/*
+			 * Ensure that the invite_status key exists, to avoid a group
+			 * being joinable when its creation process was interrupted.
+			 */
+			if ( ! groups_get_groupmeta( $group->id, 'invite_status' ) ) {
+				esc_html_e( 'Error joining group', 'buddypress' );
+				break;
+			}
+
 			check_ajax_referer( 'groups_join_group' );
 
 			if ( ! groups_join_group( $group->id ) ) {
diff --git src/bp-templates/bp-nouveau/includes/groups/ajax.php src/bp-templates/bp-nouveau/includes/groups/ajax.php
index 7e9f5b490..ce5c3aa16 100644
--- src/bp-templates/bp-nouveau/includes/groups/ajax.php
+++ src/bp-templates/bp-nouveau/includes/groups/ajax.php
@@ -173,24 +173,24 @@ function bp_nouveau_ajax_joinleave_group() {
 					'feedback' => $errors['cannot'],
 					'type'     => 'error',
 				);
-			} elseif ( ! groups_join_group( $group->id ) ) {
-				$response = array(
-					'feedback' => sprintf(
-						'<div class="bp-feedback error"><span class="bp-icon" aria-hidden="true"></span><p>%s</p></div>',
-						esc_html__( 'Error joining this group.', 'buddypress' )
-					),
-					'type'     => 'error',
-				);
-			} else {
-				// User is now a member of the group
-				$group->is_member = '1';
+			} elseif ( groups_get_groupmeta( $group->id, 'invite_status' ) && ! groups_join_group( $group->id ) ) {
+					$response = array(
+						'feedback' => sprintf(
+							'<div class="bp-feedback error"><span class="bp-icon" aria-hidden="true"></span><p>%s</p></div>',
+							esc_html__( 'Error joining this group.', 'buddypress' )
+						),
+						'type'     => 'error',
+					);
+				} else {
+					// User is now a member of the group
+					$group->is_member = '1';
 
-				$response = array(
-					'contents' => bp_get_group_join_button( $group ),
-					'is_group' => bp_is_group(),
-					'type'     => 'success',
-				);
-			}
+					$response = array(
+						'contents' => bp_get_group_join_button( $group ),
+						'is_group' => bp_is_group(),
+						'type'     => 'success',
+					);
+				}
 			break;
 
 			case 'groups_request_membership' :
