diff --git a/lib/real_estate_web/live/admin_dashboard_live.ex b/lib/real_estate_web/live/admin_dashboard_live.ex
new file mode 100644
index 00000000..8b1912f4
--- /dev/null
+++ b/lib/real_estate_web/live/admin_dashboard_live.ex
@@ -0,0 +1,18 @@
+defmodule RealEstateWeb.AdminDashboardLive do
+  use RealEstateWeb, :live_view
+
+  @impl true
+  def mount(_params, session, socket) do
+    socket = assign_defaults(session, socket)
+    {:ok, socket}
+  end
+
+  @impl true
+  def render(assigns) do
+    ~L"""
+    <section class="phx-hero">
+      <h1>Welcome to the admin dashboard!</h1>
+    </section>
+    """
+  end
+end
diff --git a/lib/real_estate_web/live/user_dashboard_live.ex b/lib/real_estate_web/live/user_dashboard_live.ex
new file mode 100644
index 00000000..4a03913d
--- /dev/null
+++ b/lib/real_estate_web/live/user_dashboard_live.ex
@@ -0,0 +1,18 @@
+defmodule RealEstateWeb.UserDashboardLive do
+  use RealEstateWeb, :live_view
+
+  @impl true
+  def mount(_params, session, socket) do
+    socket = assign_defaults(session, socket)
+    {:ok, socket}
+  end
+
+  @impl true
+  def render(assigns) do
+    ~L"""
+    <section class="phx-hero">
+      <h1>Welcome to the user dashboard!</h1>
+    </section>
+    """
+  end
+end
diff --git a/lib/real_estate_web/router.ex b/lib/real_estate_web/router.ex
index 1f0b4f41..c71757ae 100644
--- a/lib/real_estate_web/router.ex
+++ b/lib/real_estate_web/router.ex
@@ -1,7 +1,7 @@
 defmodule RealEstateWeb.Router do
   use RealEstateWeb, :router
-
   import RealEstateWeb.UserAuth
+  alias RealEstateWeb.EnsureRolePlug
 
   pipeline :browser do
     plug :accepts, ["html"]
@@ -17,6 +17,14 @@ defmodule RealEstateWeb.Router do
     plug :accepts, ["json"]
   end
 
+  pipeline :user do
+    plug EnsureRolePlug, [:admin, :user]
+  end
+
+  pipeline :admin do
+    plug EnsureRolePlug, :admin
+  end
+
   # Other scopes may use custom stacks.
   # scope "/api", RealEstateWeb do
   #   pipe_through :api
@@ -73,4 +81,16 @@ defmodule RealEstateWeb.Router do
     post "/users/confirm", UserConfirmationController, :create
     get "/users/confirm/:token", UserConfirmationController, :confirm
   end
+
+  scope "/", RealEstateWeb do
+    pipe_through [:browser, :require_authenticated_user, :user]
+
+    live "/user_dashboard", UserDashboardLive, :index
+  end
+
+  scope "/", RealEstateWeb do
+    pipe_through [:browser, :require_authenticated_user, :admin]
+
+    live "/admin_dashboard", AdminDashboardLive, :index
+  end
 end
diff --git a/test/real_estate_web/live/admin_dashboard_live_test.exs b/test/real_estate_web/live/admin_dashboard_live_test.exs
new file mode 100644
index 00000000..95348049
--- /dev/null
+++ b/test/real_estate_web/live/admin_dashboard_live_test.exs
@@ -0,0 +1,30 @@
+defmodule RealEstateWeb.AdminDashboardLiveTest do
+  use RealEstateWeb.ConnCase
+
+  import Phoenix.LiveViewTest
+  import RealEstate.AccountsFixtures
+
+  test "disconnected and connected render without authentication should redirect to login page",
+       %{conn: conn} do
+    # If we don't previously log in we will be redirected to the login page
+    assert {:error, {:redirect, %{to: "/users/log_in"}}} = live(conn, "/admin_dashboard")
+  end
+
+  test "disconnected and connected render authenticated with user role should redirect to index page",
+       %{
+         conn: conn
+       } do
+    conn = conn |> log_in_user(user_fixture())
+    assert {:error, {:redirect, %{to: "/"}}} = live(conn, "/admin_dashboard")
+  end
+
+  test "disconnected and connected render authenticated with admin role should redirect to index page",
+       %{
+         conn: conn
+       } do
+    conn = conn |> log_in_user(admin_fixture())
+    {:ok, admin_dashboard, disconnected_html} = live(conn, "/admin_dashboard")
+    assert disconnected_html =~ "Welcome to the admin dashboard!"
+    assert render(admin_dashboard) =~ "Welcome to the admin dashboard!"
+  end
+end
diff --git a/test/real_estate_web/live/user_dashboard_live_test.exs b/test/real_estate_web/live/user_dashboard_live_test.exs
new file mode 100644
index 00000000..fcd20b30
--- /dev/null
+++ b/test/real_estate_web/live/user_dashboard_live_test.exs
@@ -0,0 +1,32 @@
+defmodule RealEstateWeb.UserDashboardLiveTest do
+  use RealEstateWeb.ConnCase
+
+  import Phoenix.LiveViewTest
+  import RealEstate.AccountsFixtures
+
+  test "disconnected and connected render without authentication should redirect to login page",
+       %{conn: conn} do
+    # If we don't previously log in we will be redirected to the login page
+    assert {:error, {:redirect, %{to: "/users/log_in"}}} = live(conn, "/user_dashboard")
+  end
+
+  test "disconnected and connected render authenticated with user role should redirect to index page",
+       %{
+         conn: conn
+       } do
+    conn = conn |> log_in_user(user_fixture())
+    {:ok, user_dashboard, disconnected_html} = live(conn, "/user_dashboard")
+    assert disconnected_html =~ "Welcome to the user dashboard!"
+    assert render(user_dashboard) =~ "Welcome to the user dashboard!"
+  end
+
+  test "disconnected and connected render authenticated with admin role should redirect to index page",
+       %{
+         conn: conn
+       } do
+    conn = conn |> log_in_user(admin_fixture())
+    {:ok, user_dashboard, disconnected_html} = live(conn, "/user_dashboard")
+    assert disconnected_html =~ "Welcome to the user dashboard!"
+    assert render(user_dashboard) =~ "Welcome to the user dashboard!"
+  end
+end
diff --git a/test/support/fixtures/accounts_fixtures.ex b/test/support/fixtures/accounts_fixtures.ex
index cb8d0291..79c2c436 100644
--- a/test/support/fixtures/accounts_fixtures.ex
+++ b/test/support/fixtures/accounts_fixtures.ex
@@ -19,6 +19,18 @@ defmodule RealEstate.AccountsFixtures do
     user
   end
 
+  def admin_fixture(attrs \\ %{}) do
+    {:ok, user} =
+      attrs
+      |> Enum.into(%{
+        email: unique_user_email(),
+        password: valid_user_password()
+      })
+      |> RealEstate.Accounts.register_admin()
+
+    user
+  end
+
   def extract_user_token(fun) do
     {:ok, captured} = fun.(&"[TOKEN]#{&1}[TOKEN]")
     [_, token, _] = String.split(captured.body, "[TOKEN]")