diff --git a/backend/src/baserow/api/serializers.py b/backend/src/baserow/api/serializers.py
index 715066235..a5aa7af1f 100644
--- a/backend/src/baserow/api/serializers.py
+++ b/backend/src/baserow/api/serializers.py
@@ -54,8 +54,13 @@ class NaturalKeyRelatedField(serializers.ListField):
     A related field that use the natural key instead of the Id to reference the object.
     """
 
-    def __init__(self, model=None, **kwargs):
+    def __init__(
+        self, model=None, custom_does_not_exist_exception_class=None, **kwargs
+    ):
         self._model = model
+        self._custom_does_not_exist_exception_class = (
+            custom_does_not_exist_exception_class
+        )
         super().__init__(**kwargs)
 
     def to_representation(self, value):
@@ -71,4 +76,12 @@ class NaturalKeyRelatedField(serializers.ListField):
             data = [data]
 
         natural_key = super().to_internal_value(data)
-        return self._model.objects.get_by_natural_key(*natural_key)
+        try:
+            return self._model.objects.get_by_natural_key(*natural_key)
+        except self._model.DoesNotExist as e:
+            if self._custom_does_not_exist_exception_class:
+                raise self._custom_does_not_exist_exception_class(
+                    f"Object with natural key {natural_key} for model {self._model} does not exist."
+                )
+            else:
+                raise e
diff --git a/changelog/entries/unreleased/bug/2574_the_member_role_should_not_be_visible_when_creating_a_team.json b/changelog/entries/unreleased/bug/2574_the_member_role_should_not_be_visible_when_creating_a_team.json
new file mode 100644
index 000000000..2fc13965c
--- /dev/null
+++ b/changelog/entries/unreleased/bug/2574_the_member_role_should_not_be_visible_when_creating_a_team.json
@@ -0,0 +1,7 @@
+{
+    "type": "bug",
+    "message": "Show only visible roles in the team member creation/edit modal.",
+    "issue_number": 2574,
+    "bullet_points": [],
+    "created_at": "2024-04-29"
+}
\ No newline at end of file
diff --git a/enterprise/backend/src/baserow_enterprise/api/teams/serializers.py b/enterprise/backend/src/baserow_enterprise/api/teams/serializers.py
index f23e53510..32c035b64 100644
--- a/enterprise/backend/src/baserow_enterprise/api/teams/serializers.py
+++ b/enterprise/backend/src/baserow_enterprise/api/teams/serializers.py
@@ -2,6 +2,7 @@ from rest_framework import serializers
 
 from baserow.api.mixins import UnknownFieldRaisesExceptionSerializerMixin
 from baserow_enterprise.api.role.serializers import RoleField
+from baserow_enterprise.exceptions import RoleNotExist
 from baserow_enterprise.role.models import Role
 from baserow_enterprise.teams.handler import SUPPORTED_SUBJECT_TYPES
 from baserow_enterprise.teams.models import Team, TeamSubject
@@ -57,6 +58,7 @@ class TeamSerializer(
 ):
     default_role = RoleField(
         model=Role,
+        custom_does_not_exist_exception_class=RoleNotExist,
         required=False,
         allow_null=True,
         help_text=(
diff --git a/enterprise/backend/src/baserow_enterprise/api/teams/views.py b/enterprise/backend/src/baserow_enterprise/api/teams/views.py
index 57f24cc1b..7f083f2b7 100755
--- a/enterprise/backend/src/baserow_enterprise/api/teams/views.py
+++ b/enterprise/backend/src/baserow_enterprise/api/teams/views.py
@@ -35,7 +35,7 @@ from baserow_enterprise.api.teams.serializers import (
     TeamSubjectResponseSerializer,
     TeamSubjectSerializer,
 )
-from baserow_enterprise.exceptions import RoleUnsupported
+from baserow_enterprise.exceptions import RoleNotExist, RoleUnsupported
 from baserow_enterprise.role.constants import NO_ACCESS_ROLE_UID
 from baserow_enterprise.role.handler import RoleAssignmentHandler
 from baserow_enterprise.teams.actions import (
@@ -159,6 +159,7 @@ class TeamsView(APIView, SearchableViewMixin, SortableViewMixin):
         {
             UserNotInWorkspace: ERROR_USER_NOT_IN_GROUP,
             RoleUnsupported: ERROR_ROLE_DOES_NOT_EXIST,
+            RoleNotExist: ERROR_ROLE_DOES_NOT_EXIST,
             WorkspaceDoesNotExist: ERROR_GROUP_DOES_NOT_EXIST,
             TeamNameNotUnique: ERROR_TEAM_NAME_NOT_UNIQUE,
             TeamSubjectBadRequest: ERROR_SUBJECT_BAD_REQUEST,
diff --git a/enterprise/backend/tests/baserow_enterprise_tests/compat/api/teams/test_group_teams_views.py b/enterprise/backend/tests/baserow_enterprise_tests/compat/api/teams/test_group_teams_views.py
index 69195288c..5bba3593a 100755
--- a/enterprise/backend/tests/baserow_enterprise_tests/compat/api/teams/test_group_teams_views.py
+++ b/enterprise/backend/tests/baserow_enterprise_tests/compat/api/teams/test_group_teams_views.py
@@ -1,7 +1,7 @@
 from django.shortcuts import reverse
 
 import pytest
-from rest_framework.status import HTTP_200_OK
+from rest_framework.status import HTTP_200_OK, HTTP_404_NOT_FOUND
 
 
 @pytest.fixture(autouse=True)
@@ -87,7 +87,16 @@ def test_create_team(api_client, data_fixture, group_compat_timebomb):
     workspace = data_fixture.create_workspace(user=user)
 
     response = api_client.post(
-        reverse("api:enterprise:teams:list", kwargs={"group_id": workspace.id}),
+        reverse("api:enterprise:teams:list", kwargs={"workspace_id": workspace.id}),
+        {"name": "Executives", "default_role": "ThisRoleDoesNotExist"},
+        format="json",
+        HTTP_AUTHORIZATION=f"JWT {token}",
+    )
+    assert response.status_code == HTTP_404_NOT_FOUND
+    assert response.json()["error"] == "ERROR_ROLE_DOES_NOT_EXIST"
+
+    response = api_client.post(
+        reverse("api:enterprise:teams:list", kwargs={"workspace_id": workspace.id}),
         {"name": "Executives"},
         format="json",
         HTTP_AUTHORIZATION=f"JWT {token}",
diff --git a/enterprise/web-frontend/modules/baserow_enterprise/utils/roles.js b/enterprise/web-frontend/modules/baserow_enterprise/utils/roles.js
index 0f34aaf0a..ff52e7147 100644
--- a/enterprise/web-frontend/modules/baserow_enterprise/utils/roles.js
+++ b/enterprise/web-frontend/modules/baserow_enterprise/utils/roles.js
@@ -11,7 +11,9 @@ export const filterRoles = (roles, { scopeType, subjectType }) => {
     ({
       allowed_scope_types: allowedScopeTypes,
       allowed_subject_types: allowedSubjectTypes,
+      isVisible,
     }) =>
+      isVisible &&
       (scopeType === undefined ||
         !Array.isArray(allowedScopeTypes) ||
         allowedScopeTypes.includes(scopeType)) &&