diff --git a/web/modals/threads/members/change-member-role-modal.react.js b/web/modals/threads/members/change-member-role-modal.react.js
--- a/web/modals/threads/members/change-member-role-modal.react.js
+++ b/web/modals/threads/members/change-member-role-modal.react.js
@@ -12,6 +12,7 @@
 import Button, { buttonThemes } from '../../../components/button.react.js';
 import Dropdown from '../../../components/dropdown.react.js';
 import Modal from '../../modal.react.js';
+import UnsavedChangesModal from '../../unsaved-changes-modal.react.js';
 
 type ChangeMemberRoleModalProps = {
   +memberInfo: RelativeMemberInfo,
@@ -20,7 +21,7 @@
 
 function ChangeMemberRoleModal(props: ChangeMemberRoleModalProps): React.Node {
   const { memberInfo, threadInfo } = props;
-  const { popModal } = useModalContext();
+  const { pushModal, popModal } = useModalContext();
 
   const roleOptions = React.useMemo(
     () =>
@@ -36,6 +37,15 @@
 
   const [selectedRole, setSelectedRole] = React.useState(initialSelectedRole);
 
+  const onBackClick = React.useCallback(() => {
+    if (selectedRole === initialSelectedRole) {
+      popModal();
+      return;
+    }
+
+    pushModal(<UnsavedChangesModal />);
+  }, [initialSelectedRole, popModal, pushModal, selectedRole]);
+
   return (
     <Modal name="Change Role" onClose={popModal} size="large">
       <div className={css.roleModalDescription}>
@@ -56,7 +66,11 @@
         />
       </div>
       <div className={css.roleModalActionButtons}>
-        <Button variant="outline" className={css.roleModalBackButton}>
+        <Button
+          variant="outline"
+          className={css.roleModalBackButton}
+          onClick={onBackClick}
+        >
           Back
         </Button>
         <Button
diff --git a/web/modals/unsaved-changes-modal.css b/web/modals/unsaved-changes-modal.css
new file mode 100644
--- /dev/null
+++ b/web/modals/unsaved-changes-modal.css
@@ -0,0 +1,27 @@
+.unsavedChangesModalText {
+  color: var(--unsaved-changes-modal-text-color);
+  font-size: var(--l-font-18);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin: 0 50px;
+}
+
+.unsavedChangesModalButtons {
+  width: 100%;
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-end;
+  align-self: center;
+  align-items: stretch;
+  margin: 16px 64px 16px 0;
+}
+
+.unsavedChangesCloseModalButton {
+  margin-left: 8px;
+  padding: 10px 20px;
+}
+
+.unsavedChangesBackButton {
+  padding: 10px 20px;
+}
diff --git a/web/modals/unsaved-changes-modal.react.js b/web/modals/unsaved-changes-modal.react.js
new file mode 100644
--- /dev/null
+++ b/web/modals/unsaved-changes-modal.react.js
@@ -0,0 +1,53 @@
+// @flow
+
+import * as React from 'react';
+
+import { useModalContext } from 'lib/components/modal-provider.react.js';
+
+import Modal from './modal.react.js';
+import css from './unsaved-changes-modal.css';
+import Button, { buttonThemes } from '../components/button.react.js';
+
+function UnsavedChangesModal(): React.Node {
+  const modalName = '';
+  const { popModal } = useModalContext();
+
+  const onCloseModalClick = React.useCallback(() => {
+    // Pop the unsaved changes modal and the modal that triggered it.
+    popModal();
+    popModal();
+  }, [popModal]);
+
+  return (
+    <Modal
+      name={modalName}
+      onClose={popModal}
+      withCloseButton={false}
+      size="large"
+    >
+      <div className={css.unsavedChangesModalText}>
+        You have unsaved changes, are you sure you want to close the modal? You
+        will lose all your progress.
+      </div>
+      <div className={css.unsavedChangesModalButtons}>
+        <Button
+          variant="outline"
+          className={css.unsavedChangesBackButton}
+          onClick={popModal}
+        >
+          Back
+        </Button>
+        <Button
+          variant="filled"
+          className={css.unsavedChangesCloseModalButton}
+          buttonColor={buttonThemes.danger}
+          onClick={onCloseModalClick}
+        >
+          Close Modal
+        </Button>
+      </div>
+    </Modal>
+  );
+}
+
+export default UnsavedChangesModal;
diff --git a/web/theme.css b/web/theme.css
--- a/web/theme.css
+++ b/web/theme.css
@@ -235,4 +235,5 @@
   --dropdown-disabled-color: var(--shades-black-60);
   --change-member-role-modal-description-text: var(--shades-white-60);
   --change-member-role-modal-generic-text: var(--shades-white-100);
+  --unsaved-changes-modal-text-color: var(--shades-white-60);
 }