Screens — Auth & Registration
Screen specifications for all authentication and self-registration flows. These screens live outside the main app shells — they are full-page, unauthenticated routes served by the Dashboard Next.js app.
Status notation: [Live] = confirmed working · [To Build] = specified, not yet implemented · [Unverified] = not yet checked against running app
| Screen | Status | Notes |
|---|---|---|
| A1 — Login | [Live] | Core email/password login works. Social login buttons → [To Build] |
| A2 — Forgot Password | [Live] | |
| A3 — Reset Password | [Live] | HIBP breach check → [To Build] |
| S1–S4 — Self-signup wizard | [Live] | New 4-step wizard at /signup. Full flow confirmed via browser + Razorpay UPI test. |
| SE — Signup expired | [Live] | Expired session page at /signup/expired |
| R1–R4 — Legacy registration wizard | [Live] | Old /register routes — still live, maintained for backwards compat |
| Tenant Selection Modal | [Live] | Post-login multi-tenant picker |
| Social login (Google / Microsoft / LinkedIn) | [To Build] | OAuth social providers |
| Mobile biometric auth | [To Build] | React Native Face ID / fingerprint unlock |
Auth implementation: Auth docs | Onboarding flow after registration: Onboarding
Login → signup link: The
/loginpage “Sign up” link points to/signup(the new self-signup wizard).
Screen Index
| ID | Screen | Route |
|---|---|---|
| A1 | Login | /login |
| A2 | Forgot Password | /forgot-password |
| A3 | Reset Password | /reset-password?token=... |
| S1 | Self-Signup — Contact | /signup |
| S2 | Self-Signup — Company | /signup/company |
| S3 | Self-Signup — Location & Tax | /signup/location |
| S4 | Self-Signup — Plan & Payment | /signup/plan |
| SE | Self-Signup — Expired Session | /signup/expired |
| R1 | Register — Contact (legacy) | /register |
| R2 | Register — Company (legacy) | /register/company |
| R3 | Register — Location (legacy) | /register/location |
| R4 | Register — Plan & Payment (legacy) | /register/plan |
S1 — Self-Signup Step 1 — Contact
Route: /signup
Layout: Centered (same as R1–R4 pattern)
Step: 1 of 4 — Contact (Account Setup)
Form
| Field | Required | Notes |
|---|---|---|
| Country | Yes | Dropdown — full country list. Sets phone country code. |
| Title | No | Mr. / Mrs. / Ms. / Dr. / Prof. |
| First Name | Yes | |
| Last Name | Yes | |
| Email Address | Yes | Login identity. Checked for uniqueness. |
| Mobile Number | Yes | E.164 format, country code from Country field. |
| Create Password | Yes | Min 8 chars. Show/hide toggle + Generate button. |
Behaviour
- Continue calls
POST /auth/v1/register/start— creates aRegistrationSessionrow and returns a session token - Session token stored in
sessionStorageassignup_session_token - Step data stored in
sessionStorageassignup_step1 - On success: navigate to
/signup/company
Redirect Guards
- No guard on Step 1 itself (entry point)
- All later steps (
/signup/company,/signup/location,/signup/plan) check forsignup_step1in sessionStorage; redirect to/signupif missing
S2 — Self-Signup Step 2 — Company
Route: /signup/company
Layout: Centered
Step: 2 of 4 — Company (Business Details)
Form
| Field | Required | Notes |
|---|---|---|
| Company Name | Yes | Min 2 chars. Becomes tenant legalName. |
| Industry | Yes | Dropdown of industry categories. |
| Company Website | No | Must be a valid URL if provided. |
Behaviour
- Calls
POST /auth/v1/register/step/2with session token - Stores to
sessionStorageassignup_step2 - On success: if country =
IN→ navigate to/signup/location; if other country → navigate directly to/signup/plan(step 3 is auto-completed server-side for non-India) - Back button →
/signup
S3 — Self-Signup Step 3 — Location & Tax
Route: /signup/location
Layout: Centered
Step: 3 of 4 — Location (Tax & Region)
Form
| Field | Required | Notes |
|---|---|---|
| Country | Read-only | Pre-filled from Step 1. |
| State | Optional | Dropdown filtered by country. |
| GST Registration | Optional | Yes/No button pair. “Yes” reveals GST Number field. |
| GST Number | Conditional | Visible only when GST = Yes. Format 22AAAAA0000A1Z5. |
| PAN Number | Optional | 10-character alphanumeric. Used for Indian tax invoicing. |
| SEZ Status | Optional | Dropdown: no / yes (affects tax rate). |
Behaviour
- Entire step is optional — Continue works with empty fields
- Stores to
sessionStorageassignup_step3 - Back button →
/signup/company
S4 — Self-Signup Step 4 — Plan & Payment
Route: /signup/plan
Layout: Centered (wider card)
Step: 4 of 4 — Plan (Subscription)
Plan Selection
Same plan cards as R4 (Starter / Professional). Professional pre-selected by default.
Billing Address
| Field | Required | Notes |
|---|---|---|
| Billing Name | Yes | Pre-filled from Step 2 company name. |
| Billing Email | Yes | Pre-filled from Step 1 email. |
| Street Address | Yes | Textarea. |
| City | Yes | |
| Postal / ZIP Code | Yes | |
| State | Optional | Pre-filled from Step 3. |
| Country | Read-only | India (from Step 1). |
Payment Flow
- Submit calls
POST /auth/v1/register/completewith session token + plan + billing address - API creates a Razorpay order for
planPrice × 1.18 GST(prepaid, first month) - Razorpay Checkout modal opens in the browser
- On payment success → client calls
POST /auth/v1/register/payment/verify→ tenant + user created → redirect to/login?registered=1 - On payment failure / cancel → modal closes, user stays on
/signup/plan
Post-payment redirect: The signup flow redirects to
/login?registered=1(not/onboarding). The login page shows “Account created! Sign in to get started.” when theregistered=1query param is present.
Test Credentials (Razorpay Test Mode)
| Method | Value | Notes |
|---|---|---|
| UPI ID | success@razorpay | Simulates instant UPI success — no OTP required. Use this for browser testing. |
| Card (no 3DS) | 5267 3181 8797 5449, exp 02/26, CVV 123 | Domestic Mastercard, no 3D Secure. |
| Card (with OTP) | 4208 3000 9609 2278, OTP 1234 | Visa 3DS card. |
| Card (failure) | 4111 1111 1111 1111 | Triggers 3DS external popup — do not use in automated tests. |
SE — Expired Session
Route: /signup/expired
Layout: Centered (single card, no step bar)
Shown when a user follows a signup-resume link whose session token has expired (sessions expire after 30 days of inactivity).
| Element | Details |
|---|---|
| Heading | ”Your Signup Link Has Expired” |
| Body copy | Explains the 30-day inactivity limit |
| ”Start New Signup” link | href="/signup" — starts a fresh signup |
| ”Contact Sales” link | Points to the sales contact URL |
Layout Patterns
Split Layout (A1, A2, A3)
Auth screens use a 50/50 horizontal split:
┌─────────────────────────┬─────────────────────────┐
│ │ │
│ Feature Showcase │ Auth Form Panel │
│ (left panel) │ (right panel) │
│ Purple gradient bg │ Dark bg #0D1117 │
│ │ │
│ · Headline copy │ · Leadmetrics logo │
│ · Feature carousel │ · Form │
│ · Dot pagination │ · Footer links │
│ │ │
└─────────────────────────┴─────────────────────────┘Left panel — Feature Showcase:
- Background: deep purple-to-violet gradient (
#3B0066→#6B21A8) - Scattered dot particles (decorative, subtle animation)
- Wave/hill shape along the bottom of screenshots
- Headline: “Transform Your Digital Marketing Strategy” (white, bold, large)
- Subheadline: “Powered by cutting-edge Agentic AI, delivering intelligent automation and real-time insights.” (“Agentic AI” in yellow/amber bold)
- Feature carousel: rotating screenshots of platform features
- Feature name (white, semibold) + description (white/70, smaller) below screenshot
- Dot pagination indicator at bottom of carousel
Right panel — Auth Form:
- Background:
#0D1117(near-black dark) - Dark mode toggle icon — top right corner of right panel
- Leadmetrics logo — centered near top of panel (
🎁 leadmetrics— icon + wordmark) - Form card: slightly lighter dark background (
#161B27), rounded corners, padding - Copyright:
©2026, Leadmetrics. All Rights Reserved— bottom center, subdued
Centered Layout (R1–R4)
Registration screens use a centered single-column layout:
┌────────────────────────────────────────────────────┐
│ │
│ 🎁 leadmetrics (logo) │
│ Get Started Today (h1) │
│ Create your account in just a few steps │
│ │
│ ①──────②──────③──────④ (step progress bar) │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Form card │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ Terms of Service · Privacy Policy │
└────────────────────────────────────────────────────┘Background: #080D1A (deepest dark navy).
Registration Step Progress Bar
The progress bar sits between the subtitle and the form card on all registration screens.
① ② ③ ④
◉──────────────○──────────────○──────────────○
Contact Company Location Plan
Account Setup Business Details Tax & Region SubscriptionStep states:
| State | Circle | Connector line |
|---|---|---|
| Completed | Green background + white checkmark ✓ | Green |
| Active (current) | Purple/violet background + step icon | Gray |
| Future | Dark gray background + step icon | Gray |
Auto-save toast: After completing and submitting each step, a toast appears bottom-right:
- Background: dark green
- Title: Success
- Body: “Your progress has been saved”
- The user’s partially completed registration is persisted server-side so they can resume if they close the browser.
A1 — Login
Route: /login
Layout: Split (left = Feature Showcase, right = Auth Form)
Right Panel Content
🎁 leadmetrics
Welcome back
Sign in to continue to your account
┌─────────────────────────────────────────┐
│ │
│ Email │
│ ✉ Enter your email │
│ │
│ Password │
│ 🔒 Enter your password [👁] │
│ │
│ ┌─────────────────────────────────┐ │
│ │ Login → │ │
│ └─────────────────────────────────┘ │
│ │
└─────────────────────────────────────────┘Observed (live): The right panel uses a light/white background (not dark
#0D1117). There is no “Forgot password” link, social login buttons, or “Sign up” link visible in the current implementation — this appears to be the internal/client-facing login, not the self-registration flow.
Fields & Controls
| Element | Details |
|---|---|
| Email field | Icon: envelope. Placeholder: “Enter your email”. Type: email. Required. |
| Password field | Icon: lock. Placeholder: “Enter your password”. Eye toggle (show/hide). Required. |
| Login button | Full width within card. Violet/purple background. Label: “Login →”. Submits form. Shows spinner/checkmark while processing. |
Tenant Selection Modal (post-login)
After credentials are validated, a modal dialog appears for users who belong to multiple tenants:
┌─────────────────────────────────────────┐
│ [choose-tenant illustration] │
│ │
│ Select your Organization │
│ Select an organization from the list │
│ to continue │
│ │
│ ┌──────────────────────────────── ▾ ┐ │
│ │ Talent Solutions Group │ │ ← searchable combobox
│ └────────────────────────────────── ┘ │
│ │
│ ┌─────────────────────────────────┐ │
│ │ Select │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘- The dropdown is a searchable combobox — user can type to filter orgs by name
- The org list can be very long (100+ tenants for super-admin accounts)
- Selecting an org and clicking “Select” sets the active tenant context and redirects to
/dashboard - Single-tenant users skip this modal entirely
Validation & Errors
- Empty email or password: inline field error below input
- Incorrect credentials: banner error above the form (“Invalid email or password”)
- Account locked (after 5 failed attempts): banner error with lockout duration remaining
- Unverified email: banner with “Please verify your email — resend link” action
Social Login
Social login buttons (Google, Microsoft, LinkedIn) appear below the Login button, separated by an “or” divider. See social-providers.md.
A2 — Forgot Password
Route: /forgot-password
Layout: Split (left = Feature Showcase, right = minimal form, no logo)
Right Panel Content
Forgot Password?
Enter your email and we'll send you link to reset your password
Email *
┌────────────────────────────────────────┐
│ Enter your email id │
└────────────────────────────────────────┘
┌────────────────────────────────────────┐
│ Send link to email │
└────────────────────────────────────────┘Behaviour
- User enters email and clicks “Send link to email”
- Server always returns a success state — does not reveal whether the email exists (prevents enumeration)
- Success state replaces the form with: “If an account exists for this email, a reset link has been sent. Check your inbox.”
- Reset link expires in 1 hour
- “Back to login” link at the bottom
Rate Limiting
3 reset requests per hour per email address. Excess requests silently succeed (same message) but no email is sent.
A3 — Reset Password
Route: /reset-password?token=<token>
Layout: Split (same pattern as A2)
Right Panel Content
Reset Your Password
Enter your new password below
New Password *
┌──────────────────────────────────── [👁]┐
│ Enter new password │
└─────────────────────────────────────────┘
Minimum 12 characters. Must include letters and numbers.
Confirm Password *
┌──────────────────────────────────── [👁]┐
│ Confirm new password │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ Reset Password │
└─────────────────────────────────────────┘Behaviour
- Token validated on page load — if expired or invalid, show error: “This reset link has expired. Request a new one.” with link to
/forgot-password - Password strength indicator shown inline as user types
- On success: redirect to
/loginwith success banner “Password updated. Sign in with your new password.” - HIBP check: warns if the entered password appears in known data breaches
R1 — Registration Step 1 — Contact
Route: /register
Layout: Centered
Step: 1 of 4 — Contact (Account Setup)
Form
Your contact details
You will be the main account administrator
Your Country *
┌─────────────────────────────────────── ▾┐
│ Select your country │
└─────────────────────────────────────────┘
This will help us set the right phone code and regional settings
Title First Name * Last Name *
┌──────────▾┐ ┌──────────────────┐ ┌─────────────────┐
│ Mr. │ │ John │ │ Doe │
└───────────┘ └──────────────────┘ └─────────────────┘
Your Email Address *
┌─────────────────────────────────────────┐
│ john@company.com │
└─────────────────────────────────────────┘
Mobile Number *
┌──────▾┐ ┌───────────────────────────────┐
│ +91 │ │ Mobile Number │
└───────┘ └───────────────────────────────┘
Create Password *
┌─────────────────────────────── [👁] ┐ [Generate]
│ Enter password │
└─────────────────────────────────────┘
Minimum 8 characters, mix of letters and numbers
┌─────────────────────────────────────────┐
│ Continue → │
└─────────────────────────────────────────┘
By signing up, you agree to our Terms of Service and Privacy PolicyFields
| Field | Required | Notes |
|---|---|---|
| Country | Yes | Dropdown — full country list. Sets phone country code for mobile field. Pre-populates Location step. |
| Title | No | Dropdown: Mr. / Mrs. / Ms. / Dr. / Prof. |
| First Name | Yes | |
| Last Name | Yes | |
| Email Address | Yes | Used as login identity. Validated for format. Checked for uniqueness on blur. |
| Mobile Number | Yes | Country code auto-set from Country selection. E.164 format validation. |
| Create Password | Yes | Min 8 chars. Show/hide toggle. Generate button creates a strong random password and copies it to clipboard with a toast “Password copied to clipboard”. HIBP check on blur — warns if compromised. |
Behaviour
- Clicking Continue validates all required fields
- On success: auto-saves progress server-side, transitions to R2
- The account is not yet created until Step 4 (payment) is completed — Step 1 data is stored in a temporary registration session
R2 — Registration Step 2 — Company
Route: /register/company
Layout: Centered
Step: 2 of 4 — Company (Business Details)
Form
Tell us about your company
We will use this information for your account setup
Legal Company Name *
┌─────────────────────────────────────────┐
│ Your official company name │
└─────────────────────────────────────────┘
This will appear on invoices and legal documents
Brand / Display Name *
┌─────────────────────────────────────────┐
│ How you want to be known │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ ✨ This is how your company name will │
│ appear throughout the platform │
└─────────────────────────────────────────┘
PAN Number (Optional)
┌─────────────────────────────────────────┐
│ e.g., ABCDE1234F │
└─────────────────────────────────────────┘
Required for Indian tax purposes
[ ← Back ] [ Continue → ]Fields
| Field | Required | Notes |
|---|---|---|
| Legal Company Name | Yes | Appears on invoices and contract PDFs |
| Brand / Display Name | Yes | Shown as tenants.name throughout the platform. Info banner underneath. |
| PAN Number | No | 10-character alphanumeric. Validated against PAN format if provided. Used for Indian GST invoicing. |
Behaviour
- Brand name auto-populated from Legal Company Name on blur (user can override)
- Info banner uses a ✨ spark icon with a warm amber background to highlight the platform-wide impact
- Progress auto-saved on Continue; “Your progress has been saved” toast appears
R3 — Registration Step 3 — Location
Route: /register/location
Layout: Centered
Step: 3 of 4 — Location (Tax & Region)
Form
Regional & tax settings
Help us configure your account properly (Optional)
Your Country
┌─────────────────────────────────────────┐
│ India From Step 1│
└─────────────────────────────────────────┘
State *
┌─────────────────────────────────────── ▾┐
│ Kerala │
└─────────────────────────────────────────┘
Do you have a GST registration?
┌──────────────────────┐ ┌──────────────────────┐
│ Yes, I have GST │ │ ✓ No GST number │
└──────────────────────┘ └──────────────────────┘
(selected = violet bg)
[ ← Back ] [ Continue → ]Fields
| Field | Required | Notes |
|---|---|---|
| Country | Read-only | Pre-filled from Step 1. Labeled “From Step 1”. Cannot be changed here — user must go back to Step 1. |
| State | Yes | Dropdown filtered by country. Shows states/provinces for the selected country. |
| GST Registration | No | Toggle button pair. Default: “No GST number” selected. If “Yes, I have GST” selected → GST Number field appears below. |
| GST Number | Conditional | Visible only when “Yes, I have GST” is selected. Format: 22AAAAA0000A1Z5. Validated on input. |
Behaviour
- Entire step is optional — user may click Continue without filling anything
- State list is filtered dynamically based on country
- GST toggle is a two-button group (not a checkbox or radio — full button pair for clarity)
R4 — Registration Step 4 — Plan & Payment
Route: /register/plan
Layout: Centered (slightly wider card to accommodate plan cards side by side)
Step: 4 of 4 — Plan (Subscription)
Plan Selection
Choose your plan
Select the plan that best fits your needs
┌──────────────────────┐ ┌──────────────────────┐
│ │ │ ✦ Popular ✦ │
│ Starter │ │ Professional ✓ │
│ INR 34,999/monthly │ │ INR 49,999/monthly │
│ │ │ │
│ What's included │ │ What's included │
│ ✓ Feature A │ │ ✓ Feature A │
│ ✓ Feature B │ │ ✓ Feature B │
│ ✓ ... │ │ ✓ ... │
│ │ │ ✓ Extra feature │
└──────────────────────┘ └──────────────────────┘
Selected: violet border + checkmarkPlan cards:
| Plan | Price | Features |
|---|---|---|
| Starter | INR 34,999/month | Tailor-made Digital Marketing Strategies, AI Search Optimization, AI-driven Performance Marketing, AI-driven SEO, AI-driven Maps Optimization, AI-driven Social Media Optimization, Lead Management |
| Professional | INR 49,999/month | All Starter features + Digital Marketer Assistance |
- Selected plan: violet/purple border, checkmark badge top-right
- “Popular” badge on Professional plan: small pill above card, purple gradient
- Cards are full-height equal-height side by side
Note: These plan names and prices (INR) reflect the India-market SaaS offering. The platform’s internal plan enum (
free,pro,agency,enterprise) maps to these display names. See onboarding.md for the full pricing matrix.
Billing Address
Your Billing Address
Name *
┌─────────────────────────────────────────┐
│ TesterComp2 (pre-filled from Step 2) │
└─────────────────────────────────────────┘
Address *
┌─────────────────────────────────────────┐
│ Street address │
│ │
└─────────────────────────────────────────┘
City * Postal/Zip Code
┌──────────────────────┐ ┌──────────────────┐
│ City │ │ Postal/ZIP code │
└──────────────────────┘ └──────────────────┘
State/Province * Your Country *
┌──────────────────────▾┐ ┌──────────────────▾┐
│ Kerala │ │ India │
└───────────────────────┘ └───────────────────┘- Name: pre-filled from Brand/Display Name (Step 2)
- State + Country: pre-filled from Step 3
CTA
[ ← Back ] [ Complete Sign-Up & Pay Securely → ]The primary button triggers Razorpay Checkout (modal or redirect). On successful payment:
- Full tenant account is created
- User is redirected to
/onboarding(the in-app onboarding wizard) - Welcome email sent via SendGrid
Design Tokens (Auth Screens)
Colours
| Token | Value | Used for |
|---|---|---|
auth-bg-right | #0D1117 | Right panel / register page background |
auth-bg-register | #080D1A | Registration page outer background |
auth-card-bg | #161B27 | Form card background |
auth-input-bg | #1E2435 | Input field background |
auth-left-gradient-from | #3B0066 | Left panel gradient start |
auth-left-gradient-to | #6B21A8 | Left panel gradient end |
auth-accent | #7C5CFC | Buttons, active steps, links |
auth-success | #16A34A | Completed step indicator, success toast |
auth-step-future | #374151 | Inactive step circle |
Typography
| Element | Style |
|---|---|
| Left panel headline | 36px bold white |
| Left panel “Agentic AI” highlight | Yellow/amber (#FBBF24) bold |
| Auth form heading (“Welcome back”, “Forgot Password?“) | 24px semibold white |
| Auth form subtitle | 14px #9CA3AF (gray-400) |
| Field labels | 14px medium white |
| Input text | 14px #F9FAFB |
| Placeholder text | 14px #6B7280 |
| Helper/hint text | 12px #6B7280 |
| Link text | 14px #7C5CFC (accent) |
| Button label | 15px semibold white |
Responsiveness
| Breakpoint | Login / Forgot PW | Register |
|---|---|---|
| Desktop (≥1024px) | 50/50 split | Centered card, max-width 780px |
| Tablet (768–1023px) | Left panel hidden; right panel full width | Centered card, max-width 90% |
| Mobile (<768px) | Full-width auth form only, logo at top | Full-width, stacked fields, step labels hidden (icons only) |
On mobile, the left feature showcase panel is hidden entirely — the auth form takes full width with the Leadmetrics logo above it.
Accessibility
- All form fields have associated
<label>elements - Error messages are linked via
aria-describedby - Password show/hide toggle has
aria-label="Show password"/"Hide password" - Step progress bar uses
role="list"witharia-current="step"on the active step - Buttons have sufficient colour contrast (≥4.5:1) against card background
- Focus ring visible on all interactive elements (not removed with
outline: nonewithout replacement)