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:
http://localhost:3000/admin/dashboardThe 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
reminderEmailSentto 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
- Enter the user's email address
- Set expiry days (1 to 90, default is 7)
- 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
- Admin creates invite for
user@example.com - User receives email with link:
yourdomain.com/auth/invite?token=abc123 - User clicks link, token is verified
- User completes sign-up (Google OAuth or magic link)
- Invite is marked as used
- User gets the
USERrole 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:
export const WEBSITE = {
ADMIN_EMAIL: "your@email.com",
// ...
};