Features

Admin Dashboard

Manage users, view analytics, handle waitlist entries, send invites, and impersonate users from the built-in admin panel.

MoveFast includes a full admin dashboard at /admin/dashboard. It is protected by role-based access, so only users with the ADMIN role can access it.

Accessing the Dashboard

After creating your first admin user (see Getting Started), navigate to:

text
http://localhost:3000/admin/dashboard

The dashboard has a sidebar with navigation to all admin sections.


Dashboard Overview

The main dashboard page shows:

  • Total Users - Number of registered users with growth percentage
  • Active Users - Users with isActive: true
  • Inactive Users - Users that have been disabled
  • Waitlist Count - Number of emails on the waitlist
  • New Users Today - Sign-ups in the current day
  • User Growth Chart - Visual chart showing user registrations over time

The growth chart appears once you have enough users to show meaningful data.


User Management

Route: /admin/dashboard/users

Here you can:

View All Users

A table showing every registered user with their name, email, role, status, plan, and sign-up date.

Toggle User Status

Click the toggle to enable or disable a user. Disabled users:

  • Cannot log in
  • Get redirected to an "Account Disabled" page if they have an existing session
  • Admin users cannot be disabled (safety protection)

Impersonate Users

Click "Impersonate" to see the app exactly as that user sees it. A banner appears at the top of the page showing you are impersonating. Click "Stop" to return to your admin session.

Rules:

  • You can only impersonate non-admin users
  • You cannot impersonate inactive users
  • Impersonation expires after 4 hours automatically
  • Signing out clears the impersonation

Waitlist Management

Route: /admin/dashboard/waitlist

The waitlist holds email addresses from users who joined before launch (when platform mode is WAITLIST_WITH_INVITES).

View Entries

See all waitlist emails with their join date and email-sent status.

Send Launch Emails

Select users and send them the "We've Launched!" email. This:

  • Sends the launch email template with a sign-up link
  • Marks each entry as launchEmailSent
  • Skips users who already received it (no duplicates)

Send Reminder Emails

For users who received the launch email but have not signed up yet:

  • Sends a reminder email
  • Only works if the launch email was sent first
  • Marks as reminderEmailSent to prevent duplicates

Invite Management

Route: /admin/dashboard/invites

The invite system works with WAITLIST_WITH_INVITES mode. Admins create invites to let specific people sign up.

Create an Invite

  1. Enter the user's email address
  2. Set expiry days (1 to 90, default is 7)
  3. Click "Send Invite"

What happens:

  • A unique invite token is generated
  • An invitation email is sent with a sign-up link
  • The invite appears in the list with its status

Invite States

  • Active - Not used, not expired, not revoked
  • Used - Someone signed up with this invite
  • Expired - Past the expiry date
  • Revoked - Manually cancelled by an admin

Revoke an Invite

If you need to cancel an invite before it is used, click "Revoke". The invite link will stop working immediately.

Duplicate Protection

  • Cannot invite an email that already has an active invite
  • Cannot invite an email that already has a user account

How Invites Connect to Sign-Up

  1. Admin creates invite for user@example.com
  2. User receives email with link: yourdomain.com/auth/invite?token=abc123
  3. User clicks link, token is verified
  4. User completes sign-up (Google OAuth or magic link)
  5. Invite is marked as used
  6. User gets the USER role and can access the app

This flow works regardless of which sign-in method the user chooses. The invite just grants them permission to create an account.


Admin Notifications

The admin automatically receives email notifications when:

  • A new user signs up (includes user email, name, and signup date)
  • A contact form is submitted (includes sender details and message)

These are sent to the ADMIN_EMAIL configured in src/constants/website.ts:

typescript
export const WEBSITE = {
    ADMIN_EMAIL: "your@email.com",
    // ...
};