diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt
index 76899b967..15526b993 100644
--- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt
+++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt
@@ -89,6 +89,11 @@ class LoginViewModel @Inject constructor(
     private fun attemptLogin(captchaToken: String?) {
         viewModelScope.launch {
             // TODO: show progress here BIT-320
+            sendEvent(
+                event = LoginEvent.ShowToast(
+                    message = "Loading...",
+                ),
+            )
             val result = authRepository.login(
                 email = mutableStateFlow.value.emailAddress,
                 password = mutableStateFlow.value.passwordInput,
@@ -96,7 +101,13 @@ class LoginViewModel @Inject constructor(
             )
             when (result) {
                 // TODO: show an error here BIT-320
-                LoginResult.Error -> Unit
+                LoginResult.Error -> {
+                    sendEvent(
+                        event = LoginEvent.ShowToast(
+                            message = "Error when logging in",
+                        ),
+                    )
+                }
                 // No action required on success, root nav will navigate to logged in state
                 LoginResult.Success -> Unit
                 is LoginResult.CaptchaRequired -> {
diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt
index 004f0e4c1..2009b2e6b 100644
--- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt
+++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt
@@ -92,7 +92,7 @@ class LoginViewModelTest : BaseViewModelTest() {
     }
 
     @Test
-    fun `LoginButtonClick login returns error should do nothing`() = runTest {
+    fun `LoginButtonClick login returns error should emit error ShowToast`() = runTest {
         // TODO: handle and display errors (BIT-320)
         val authRepository = mockk<AuthRepository> {
             coEvery {
@@ -111,6 +111,11 @@ class LoginViewModelTest : BaseViewModelTest() {
         viewModel.eventFlow.test {
             viewModel.actionChannel.trySend(LoginAction.LoginButtonClick)
             assertEquals(DEFAULT_STATE, viewModel.stateFlow.value)
+            assertEquals(LoginEvent.ShowToast("Loading..."), awaitItem())
+            assertEquals(
+                LoginEvent.ShowToast("Error when logging in"),
+                awaitItem(),
+            )
         }
         coVerify {
             authRepository.login(email = "test@gmail.com", password = "", captchaToken = null)
@@ -118,7 +123,7 @@ class LoginViewModelTest : BaseViewModelTest() {
     }
 
     @Test
-    fun `LoginButtonClick login returns success should do nothing`() = runTest {
+    fun `LoginButtonClick login returns success should emit loading ShowToast`() = runTest {
         val authRepository = mockk<AuthRepository> {
             coEvery { login("test@gmail.com", "", captchaToken = null) } returns LoginResult.Success
             every { captchaTokenResultFlow } returns flowOf()
@@ -130,6 +135,7 @@ class LoginViewModelTest : BaseViewModelTest() {
         viewModel.eventFlow.test {
             viewModel.actionChannel.trySend(LoginAction.LoginButtonClick)
             assertEquals(DEFAULT_STATE, viewModel.stateFlow.value)
+            assertEquals(LoginEvent.ShowToast("Loading..."), awaitItem())
         }
         coVerify {
             authRepository.login(email = "test@gmail.com", password = "", captchaToken = null)
@@ -157,6 +163,7 @@ class LoginViewModelTest : BaseViewModelTest() {
             viewModel.eventFlow.test {
                 viewModel.actionChannel.trySend(LoginAction.LoginButtonClick)
                 assertEquals(DEFAULT_STATE, viewModel.stateFlow.value)
+                assertEquals(LoginEvent.ShowToast("Loading..."), awaitItem())
                 assertEquals(LoginEvent.NavigateToCaptcha(intent = mockkIntent), awaitItem())
             }
             coVerify {