diff --git a/src/App.js b/src/App.js
index 6592f2e..f7201f2 100644
--- a/src/App.js
+++ b/src/App.js
@@ -4,7 +4,6 @@ import { AuthRoute, RedirectRoute, ContainerRoute } from 'navigation'
 import { NotFound } from 'components/Utility'
 import { NewUserModal } from 'components/Modal'
 import Home from 'pages/Home'
-import RecipePlayer from 'pages/RecipePlayer'
 import BrewTrakPage from 'pages/BrewTrak'
 import Recipe from 'pages/Recipe'
 import Login from 'pages/Login'
@@ -81,9 +80,6 @@ function App() {
       <ContainerRoute path='/form'>
         <StageForm />
       </ContainerRoute>
-      <ContainerRoute path='/recipe-player'>
-        <RecipePlayer />
-      </ContainerRoute>
       <ContainerRoute path='/recipe'>
         <Recipe />
       </ContainerRoute>
diff --git a/src/components/Modal/Modal.js b/src/components/Modal/Modal.js
index b174fb4..cb4f2c7 100644
--- a/src/components/Modal/Modal.js
+++ b/src/components/Modal/Modal.js
@@ -10,6 +10,7 @@ import { useLocation } from 'react-router-dom'
 import { useEffect, useCallback, useRef } from 'react'
 import Alert from 'components/Alert'
 import { useAlert } from 'context/AlertContext'
+import Unverified from './Unverified'
 /**
  * onClose -> click away or press 'X' button
  * onSuccess -> login successful, whatever render action should happen now
@@ -20,6 +21,7 @@ import { useAlert } from 'context/AlertContext'
 function Modal() {
   const {
     isVisible,
+    hasModalAlert,
     close,
     exit,
     success,
@@ -130,7 +132,7 @@ function Modal() {
                 </div>
               )}
 
-              <Alert noShadow containerStyle='my-4' />
+              {hasModalAlert && <Alert noShadow containerStyle='my-4' />}
 
               <div className='mt-4'>
                 {content === 'login' ? (
@@ -149,6 +151,8 @@ function Modal() {
                     loginCallback={goToLogin}
                     callback={() => setText(null)}
                   />
+                ) : content === 'unverified' ? (
+                  <Unverified />
                 ) : null}
               </div>
             </div>
diff --git a/src/components/Modal/Unverified.js b/src/components/Modal/Unverified.js
new file mode 100644
index 0000000..952438b
--- /dev/null
+++ b/src/components/Modal/Unverified.js
@@ -0,0 +1,32 @@
+const Unverified = () => (
+  <div>
+    <div className='mx-auto flex items-center justify-center h-12 w-12 rounded-full bg-red-100'>
+      {/* <!-- Heroicon name: solid/hand --> */}
+      <svg
+        className='w-6 h-6 text-red-600'
+        fill='currentColor'
+        viewBox='0 0 20 20'
+        xmlns='http://www.w3.org/2000/svg'
+      >
+        <path
+          fillRule='evenodd'
+          d='M9 3a1 1 0 012 0v5.5a.5.5 0 001 0V4a1 1 0 112 0v4.5a.5.5 0 001 0V6a1 1 0 112 0v5a7 7 0 11-14 0V9a1 1 0 012 0v2.5a.5.5 0 001 0V4a1 1 0 012 0v4.5a.5.5 0 001 0V3z'
+          clipRule='evenodd'
+        />
+      </svg>
+    </div>
+    <div className='mt-3 text-center sm:mt-5'>
+      <h3 className='text-lg leading-6 font-medium text-gray-900'>
+        Sorry! You're unverified!
+      </h3>
+      <div className='mt-2'>
+        <p className='text-sm text-gray-500'>
+          You must verify your account before you can use this feature. Please
+          look for your verification email.
+        </p>
+      </div>
+    </div>
+  </div>
+)
+
+export default Unverified
diff --git a/src/components/Recipe/CreateRecipe/index.js b/src/components/Recipe/CreateRecipe/index.js
index c3042e5..fea909c 100644
--- a/src/components/Recipe/CreateRecipe/index.js
+++ b/src/components/Recipe/CreateRecipe/index.js
@@ -1,10 +1,12 @@
+import { useMutation } from 'urql'
 import { useReducer } from 'react'
+import { useHistory, useLocation, Link, Redirect } from 'react-router-dom'
+import { useAuth } from 'context/AuthContext'
+import { useAlert, alertType } from 'context/AlertContext'
+import { INSERT_RECIPES_ONE } from 'queries'
 import InputRow from 'components/InputRow'
 import Dropdown from 'components/DropDown'
 import TextArea from 'components/TextArea'
-import { useMutation } from 'urql'
-import { INSERT_RECIPES_ONE } from 'queries'
-import { useHistory } from 'react-router-dom'
 import StageForm from 'components/StageForm'
 import StageRow from './StageRow'
 import { checkSchema, convertEmptyStringToNull } from 'helper/sanitize'
@@ -66,9 +68,14 @@ function reducer(state, [type, payload]) {
       return state
   }
 }
+// Check pushState; if not from another page then redirect back
 
-const CreateRecipe = (props) => {
+function CreateRecipe() {
   const history = useHistory()
+  const location = useLocation()
+
+  const { isAuthenticated } = useAuth()
+  const { addAlert, clearAlerts, hasAlerts } = useAlert()
   const [{ form, stages, isVisible, hasIssues }, dispatch] = useReducer(
     reducer,
     initState
@@ -81,6 +88,9 @@ const CreateRecipe = (props) => {
     if (hasIssues) {
       dispatch(['setHasIssues', false])
     }
+    if (hasAlerts) {
+      clearAlerts()
+    }
     dispatch([
       'setForm',
       {
@@ -99,17 +109,36 @@ const CreateRecipe = (props) => {
     } else {
       // use 'value' instead of 'form' because all empty strings are converted to nulls (SAFER)
       // removed 'barista_id' because I grab it from JWT 'x-hasura-barista-id' in Hasura
-      let input = { ...value }
       if (stages) {
-        input.stages = { data: stages }
+        value.stages = { data: stages }
       }
-      const { error } = await insertRecipe({ object: input })
+      const { error } = await insertRecipe({ object: value })
       if (error) {
+        addAlert({
+          type: alertType.ERROR,
+          header: error.message,
+          close: true,
+        })
+      } else {
+        history.push(`/recipe`, { createdRecipe: true })
       }
-      history.push(`/recipe`)
     }
   }
 
+  const closeForm = () => dispatch(['closeForm'])
+  const save = (stages) => {
+    dispatch(['saveStages', stages])
+    closeForm()
+  }
+  const onDelete = () => {
+    dispatch(['deleteStages'])
+    closeForm()
+  }
+
+  const saveDisabled = hasAlerts || hasIssues || isVisible
+
+  if (!location.state || !isAuthenticated) return <Redirect to='/recipe' />
+
   return (
     <div className='max-w-4xl mx-auto mt-2 sm:mt-6'>
       <form onSubmit={submitRecipe} className='space-y-6 sm:space-y-5'>
@@ -261,24 +290,12 @@ const CreateRecipe = (props) => {
               </p>
             </div>
             <div className='mt-4 sm:mt-0 sm:col-span-2 space-y-2'>
-              {/* 
-              3 states
-                - button add stage
-                - stage form open
-                - stage summary
-              */}
               {isVisible ? (
                 <StageForm
                   editStages={stages}
-                  save={(stages) => {
-                    dispatch(['saveStages', stages])
-                    dispatch(['closeForm'])
-                  }}
-                  onCancel={() => dispatch(['closeForm'])}
-                  onDelete={() => {
-                    dispatch(['deleteStages'])
-                    dispatch(['closeForm'])
-                  }}
+                  save={save}
+                  onCancel={closeForm}
+                  onDelete={onDelete}
                 />
               ) : stages ? (
                 <StageRow
@@ -332,15 +349,18 @@ const CreateRecipe = (props) => {
         )}
         {/* Button row */}
         <div className='flex justify-end'>
-          <button
-            type='button'
+          <Link
+            to='/recipe'
             className='bg-white py-2 px-4 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500'
           >
             Cancel
-          </button>
+          </Link>
           <button
+            disabled={saveDisabled}
             type='submit'
-            className='ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500'
+            className={`disabled:opacity-50 ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-blue-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 ${
+              !saveDisabled ? 'hover:bg-blue-700' : 'cursor-not-allowed'
+            }`}
           >
             Save
           </button>
diff --git a/src/components/Recipe/index.js b/src/components/Recipe/index.js
index e379357..f8cfa04 100644
--- a/src/components/Recipe/index.js
+++ b/src/components/Recipe/index.js
@@ -1,11 +1,28 @@
-import { useMemo } from 'react'
+import { useMemo, useEffect, useCallback } from 'react'
 import { useQuery } from 'urql'
 import RecipeCard from './RecipeCard'
 import { GET_ALL_RECIPES } from 'queries'
-import { Link, useRouteMatch } from 'react-router-dom'
+import { useRouteMatch, useLocation, useHistory } from 'react-router-dom'
+import { useAlert, alertType } from 'context/AlertContext'
+import { useAuth } from 'context/AuthContext'
+import { useModal } from 'context/ModalContext'
 
 const Recipes = () => {
+  const { isAuthenticated, isVerified } = useAuth()
+  const {
+    isSuccess,
+    isPending,
+    open,
+    content,
+    setContent,
+    setModalAlert,
+    reset,
+  } = useModal()
   const { url } = useRouteMatch()
+  const { addAlert } = useAlert()
+  const location = useLocation()
+  const history = useHistory()
+
   const [{ data, fetching, error }] = useQuery({
     query: GET_ALL_RECIPES,
     context: useMemo(
@@ -20,6 +37,43 @@ const Recipes = () => {
     ),
   })
 
+  useEffect(() => {
+    if (location.state?.createdRecipe) {
+      addAlert({
+        type: alertType.SUCCESS,
+        header: 'Recipe successfully created!',
+        close: true,
+      })
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const triggerUnverifiedModal = useCallback(() => {
+    open()
+    setModalAlert(false)
+    setContent('unverified')
+  }, [open, setModalAlert, setContent])
+
+  const navigateToCreate = () => {
+    if (isVerified) {
+      history.push(`${url}/new`, { fromRecipe: true })
+    } else if (isAuthenticated) {
+      triggerUnverifiedModal()
+    } else {
+      open()
+      setContent('login', 'You must be logged in to create a recipe')
+    }
+  }
+
+  useEffect(() => {
+    if (!isPending && isSuccess && content === 'login' && isVerified) {
+      // need to clear modal settings so that going back
+      // to this page doesn't retrigger this effect
+      reset()
+      history.push(`${url}/new`, { fromRecipe: true })
+    }
+  }, [isPending, isSuccess, content, isVerified, url, history, reset])
+
   if (fetching) return <p>Loading...</p>
   if (error) return <p>Oh no... {error.message}</p>
 
@@ -36,12 +90,12 @@ const Recipes = () => {
           <div className='mt-3 max-w-2xl mx-auto text-xl text-gray-500 sm:mt-4'>
             Explore coffee recipes here!
           </div>
-          <Link
-            to={`${url}/new`}
+          <button
+            onClick={navigateToCreate}
             className='mb-4 mt-4 inline-flex items-center px-4 py-2 border border-transparent text-sm leading-5 font-medium rounded-md text-white bg-blue-600 hover:bg-blue-500 focus:outline-none focus:border-blue-700 focus:shadow-outline-blue active:bg-blue-700 transition ease-in-out duration-150'
           >
-            new recipe
-          </Link>
+            Create Recipe
+          </button>
         </div>
         <div className='mt-12 max-w-lg mx-auto grid gap-5 lg:grid-cols-3 lg:max-w-none'>
           {data && data.recipes.map((x, i) => <RecipeCard key={i} {...x} />)}
diff --git a/src/components/StageForm/index.js b/src/components/StageForm/index.js
index 698e09f..4bd8ee6 100644
--- a/src/components/StageForm/index.js
+++ b/src/components/StageForm/index.js
@@ -66,7 +66,6 @@ function StageForm({ editStages, save, onCancel, onDelete }) {
 
   const submitStages = () => {
     const isValid = checkStagesOK(stages)
-    console.log(isValid, stages)
     setIsValid(isValid)
     if (isValid) {
       save(stages)
diff --git a/src/context/AlertContext.js b/src/context/AlertContext.js
index f45393e..9760549 100644
--- a/src/context/AlertContext.js
+++ b/src/context/AlertContext.js
@@ -16,7 +16,9 @@ const AlertProvider = ({ children }) => {
   const location = useLocation()
 
   useEffect(() => {
-    setAlerts([])
+    if (!location.state) {
+      setAlerts([])
+    }
   }, [location])
 
   const clearAlerts = useCallback(() => setAlerts([]), [])
diff --git a/src/context/AuthContext.js b/src/context/AuthContext.js
index b84e6f4..5b88218 100644
--- a/src/context/AuthContext.js
+++ b/src/context/AuthContext.js
@@ -337,10 +337,12 @@ function AuthProvider({ children }) {
  */
 function useAuth() {
   const context = useContext(AuthContext)
-  const isAuthenticated = context.barista
+  const isAuthenticated = context.barista !== null
+  const isVerified = isAuthenticated && context.barista.is_verified
   return {
     ...context,
     isAuthenticated,
+    isVerified,
   }
 }
 
diff --git a/src/context/ModalContext.js b/src/context/ModalContext.js
index 022f5c7..25b975e 100644
--- a/src/context/ModalContext.js
+++ b/src/context/ModalContext.js
@@ -10,6 +10,7 @@ const initState = {
   isPending: false,
   isSuccess: false,
   didExit: false,
+  hasModalAlert: true,
 }
 
 const ModalProvider = ({ children }) => {
@@ -17,15 +18,24 @@ const ModalProvider = ({ children }) => {
 
   // visibility & pending flags only - success/exit context must be handled explicitly
   // open must reset to init state in case this is second try opening
-  const open = () => {
-    setState({ ...initState, isVisible: true, isPending: true })
-  }
+  const open = useCallback(() => {
+    setState({
+      ...initState,
+      isVisible: true,
+      isPending: true,
+    })
+  }, [])
+
+  const reset = useCallback(() => {
+    setState(initState)
+  }, [])
 
   const close = useCallback(() => {
     setState((prevState) => ({
       ...prevState,
       isVisible: false,
       isPending: false,
+      hasModalAlert: true,
     }))
   }, [])
 
@@ -37,6 +47,10 @@ const ModalProvider = ({ children }) => {
     setState((prevState) => ({ ...prevState, key }))
   }, [])
 
+  const setModalAlert = useCallback((hasModalAlert) => {
+    setState((prevState) => ({ ...prevState, hasModalAlert }))
+  }, [])
+
   const success = () => {
     setState((prevState) => ({ ...prevState, isSuccess: true }))
   }
@@ -63,10 +77,12 @@ const ModalProvider = ({ children }) => {
         open,
         close,
         exit,
+        reset,
         success,
         setContent,
         setKey,
         setText,
+        setModalAlert,
       }}
     >
       {children}
diff --git a/src/helper/cache/index.js b/src/helper/cache/index.js
index c1a8d5c..e33d605 100644
--- a/src/helper/cache/index.js
+++ b/src/helper/cache/index.js
@@ -59,7 +59,7 @@ export const updates = {
         (data) => {
           // Null error if user navigates to /recipe/new directly
           // Maybe we should avoid directly form navigation
-          data?.recipes.push(result.insert_recipes_one)
+          data.recipes.push(result.insert_recipes_one)
           return data
         }
       )
diff --git a/src/pages/Recipe/index.js b/src/pages/Recipe/index.js
index d2bb032..33382b2 100644
--- a/src/pages/Recipe/index.js
+++ b/src/pages/Recipe/index.js
@@ -16,7 +16,7 @@ const RecipePage = (props) => {
         <Recipes />
       </Route>
       <Route exact path={`${url}/new`}>
-        <CreateRecipe /> {/*this needs to be CreateRecipe*/}
+        <CreateRecipe />
       </Route>
       <Route path={`${url}/:id/edit`}>
         <EditRecipe />
diff --git a/src/queries/Recipe.js b/src/queries/Recipe.js
index e40b401..9a874fd 100644
--- a/src/queries/Recipe.js
+++ b/src/queries/Recipe.js
@@ -20,6 +20,23 @@ const INSERT_RECIPES_ONE = gql`
       name
       instructions
       bean_name_free
+      barista {
+        id
+        display_name
+        avatar
+      }
+      bean {
+        id
+        img
+        name
+      }
+      recipe_reviews_aggregate {
+        aggregate {
+          avg {
+            rating
+          }
+        }
+      }
     }
   }
 `
