⬅ All Docs | 🌟 Platform Overview ✨ Patient Guide 🩺 Derm Guide 🛡️ Admin Guide
🛡️ Admin Panel · Glow Journal

Complete Platform Administration

Full control over users, dermatologists, bookings, content, notifications, and analytics — from a Flutter Web admin panel deployable anywhere.

11
Data Sheets Managed
8
Admin Screens
1
Admin Login (Password)
Free
Netlify Hosting
One Panel, Full Platform Control

The Glow Journal Admin Panel is a Flutter Web application that gives platform operators complete control over every aspect of the app — users, dermatologists, bookings, content, and notifications.

👥

User Management

View all registered patients and dermatologists. See their subscription tier, account status, sign-in date, and AI consent flag. Soft-delete users and block accounts from the panel.

🩺

Derm Approval Workflow

All new dermatologist registrations enter a Pending state. Admins review their credentials and approve, reject (with a written reason), or suspend existing verified derms.

📅

Booking Management

View all bookings across the platform. Update booking status (pending → confirmed / completed / cancelled) directly from the admin table. Full booking history with patient and derm details.

🔔

Broadcast Notifications

Create and publish push notifications to all app users. Title, message body, active/inactive toggle. Notifications are fetched by the app and shown on each user's notification screen.

💄

Content Management

Manage the tips library, community gallery moderation, and product listings directly from the admin panel. Add, edit, or remove content without any code changes.

📊

Platform Analytics

High-level overview of key metrics: total users, dermatologists, bookings this month, pending derm approvals, and subscription breakdown. At-a-glance health of the platform.

Password-Protected Admin Access

The admin panel uses a single master password to keep the setup simple and secure. No OAuth, no user accounts — just a private URL and password known only to operators.

1

Navigate to Admin URL

Open the admin panel in any browser using the admin URL. The URL is private and only shared with authorised operators. A custom domain can also be configured.

2

Enter Admin Password

The login screen shows a single password field. Enter the admin password to access the panel. No username required — just the password known to platform operators.

3

Session Stays Active

Once logged in, your session is remembered across browser refreshes. You stay signed in until you explicitly sign out — no repeated logins during a working session.

Full Platform Access

Once logged in, you have access to all platform data — users, dermatologists, bookings, content, and notifications. Every change made in the admin panel is reflected immediately in the app.

🔐 Secure Access

The admin panel URL is not publicly advertised. Only operators who know both the URL and the admin password can access the panel. This two-layer approach means even if the URL is discovered, access is still password-protected.

Full Patient & Derm User Table

A searchable, paginated table of every registered user on the platform — both patients and dermatologists. View, filter, and manage accounts from one screen.

👥 Users Table
Search by name or email
Live filter
Role filter: All / Patient / Derm
Columns: ID, name, email, role, tier, status, date
Account status badge (active/blocked/deleted)
AI consent flag indicator
Delete button with confirmation dialog
Quick Actions
Soft-delete user (sets status = 'deleted')
Irreversible
Block account (sets status = 'blocked')
Blocked users redirected to /blocked in app
Deleted users filtered from all queries
Subscription tier visible + editable
🔍

Live Search & Filter

Filter users by name, email, or role in real time. No page reload needed — the table updates instantly as the admin types. Role segmented button quickly switches between Patient, Derm, and All views.

🗑️

Soft Delete

Deleting a user sets their account status to 'deleted' in the sheet — data is retained for audit purposes but the user cannot sign in and is excluded from all queries in the app.

💳

Subscription Management

After a patient or derm pays for a subscription upgrade, the admin confirms payment here and updates their subscription tier and status manually — the platform's in-house payment confirmation flow.

Approval Workflow & Verification

Every new dermatologist registration is reviewed by an admin before they can access patient data. The approval workflow gives operators full control over platform quality.

Derm Account States:

⏳ Pending ✅ Approved (Verified) or ❌ Rejected | ⛔ Suspended

Pending Review

New dermatologist registrations land in Pending. The admin can view their full profile: name, qualification, clinic, location, working hours, consultation fee, and bio. A dedicated filter shows only pending derms for efficient review.

Approve & Verify

Tapping Approve grants the dermatologist a verified badge that immediately appears on their public profile in the app. Verified dermatologists are ranked higher in patient search results, increasing their visibility.

Reject with Reason

Rejecting opens a dialog where you enter a written reason (e.g. "Qualification not verifiable — please resubmit with certified credentials"). The reason is shown to the dermatologist inside the app so they know exactly what to correct.

Suspend Active Derms

Admins can suspend any previously approved dermatologist at any time. Suspended dermatologists lose portal access and are removed from patient search immediately. The suspension can be lifted at any time — no permanent deletion needed.

🗂️ What Admins Can See on Each Dermatologist

Admins can see the full dermatologist profile: name, clinic, location, bio, qualification, specialisation, working days and hours, consultation fee, subscription tier, verification status, active status, and rejection reason (if applicable) — everything needed to make an informed approval or suspension decision.

🏥 Clinic-Tier Management

To group multiple dermatologists under one clinic, set the same clinic name on each dermatologist's profile and upgrade them to the Clinic subscription tier. The platform automatically creates a shared clinic landing page with all grouped doctors — no extra setup required.

Platform-Wide Booking Oversight

View and manage every booking made on the platform. Status overrides, dispute resolution, and bulk filtering are all available from the bookings admin screen.

📋

Full Booking Table

Every booking is shown in one table: patient name, dermatologist, appointment date and time slot, consultation fee, currency, status, and creation date. Everything you need to understand or act on any booking.

🔄

Inline Status Updates

Each booking row has a quick-action menu to update its status: Pending → Confirmed, Completed, or Cancelled. Admin overrides are useful for dispute resolution and manual adjustments when needed.

🔍

Filter by Status

Filter the entire bookings table by status: All, Pending, Confirmed, Completed, or Cancelled. Quickly isolate overdue pending bookings or review completed consultation history.

📊

Revenue Visibility

The bookings table shows the fee and currency per booking. The analytics screen shows total confirmed and completed booking revenue across the platform at a glance.

🤝 Dispute Resolution Flow

If a patient or derm raises a dispute about a booking, admins can view the full booking record, override the status, and add a notes entry to the booking. This keeps all dispute records inside the platform data — no external ticketing needed at launch scale.

Broadcast to All App Users

Create platform-wide notifications that appear in every user's Notification screen. Ideal for feature announcements, reminders, promotions, and maintenance notices.

🔔 Create Notification
Title field (shown as notification heading)
Message body (full notification text)
Active toggle (show/hide without deleting)
Live
Publish button → delivers to all app users
Timestamp auto-set on creation
📋 Notification List
All created notifications listed
Active badge (green) or inactive badge (grey)
Toggle active state without re-creating
Editable
Delete notification permanently
Only active notifications shown to users

Instant Delivery

Published notifications are immediately available. The next time a user opens the app or their Notification screen refreshes, new active notifications appear at the top of their feed.

🎛️

Active / Inactive Toggle

Notifications can be paused and re-activated without deletion. This is useful for time-limited promotions — deactivate after the promotion ends rather than deleting the record.

📝

Rich Notification History

All past notifications (active and inactive) are retained in the sheet. This builds an audit trail of all platform communications — useful for compliance and reviewing past messaging strategy.

Tips, Products, Gallery & Reviews

Admins control the skincare content library, product marketplace listings, and community gallery moderation — all via the admin panel without touching any code.

📰

Tips Library

Create, edit, and delete skincare tips. Each tip has a title, body text, category tags, and creation date. Tips are fetched by the app's Discover screen and displayed as categorised cards with a daily briefing hero.

🛍️

Product Listings

Add and manage products in the marketplace: name, brand, category, price, image, ingredient list, and description. Products appear instantly in the patient-facing shop — no app update required.

🖼️

Gallery Moderation

Review patient-submitted community gallery photos before they go public. Approve to display or remove inappropriate content. The gallery screen in the app only shows admin-approved entries.

Review Management

View all dermatologist reviews left by patients. Remove reviews that violate community guidelines. Review data feeds the derm's average star rating shown in the Discover screen — keeping ratings trustworthy.

At-a-Glance Platform Health

The analytics overview gives operators a quick read on platform health: user growth, booking volume, pending approvals, and revenue — without needing to query the sheets manually.

👥

Total Users

Patients + dermatologists registered, excluding deleted accounts.

🩺

Dermatologists

Total verified derms vs pending approvals awaiting review.

📅

Bookings This Month

Confirmed + completed bookings in the current calendar month.

💷

Platform Revenue

Sum of confirmed + completed booking fees platform-wide.

📊

Subscription Breakdown

Count of users per subscription tier (free, pro, premium for patients; free, professional, clinic for derms). Tracks upgrade adoption and monetisation funnel health at a glance.

Pending Action Counters

At-a-glance count of items needing admin attention: pending derm approvals, pending bookings, and unmoderated gallery submissions. Keeps critical queues visible without navigating to each screen.

Netlify CI/CD — Zero-Config Auto-Deploy

The admin panel is a Flutter Web app deployed on Netlify's free tier. Every push to the GitHub repository triggers an automatic rebuild and deploy — no manual steps, no server to manage.

🚀

Auto-Deploy on Push

Connect the repository to Netlify once. Every git push to the main branch triggers a full Flutter Web build and deploys it live automatically — typically in under 3 minutes.

🔑

Secrets via dart-define

Sensitive config (Apps Script URL, secret key, admin password) is injected at build time using Netlify Environment Variables passed as --dart-define flags. No .env files are ever committed to Git.

⚙️

AppConfig Class

The Flutter app reads all injected config at runtime via the AppConfig class. This single source of truth ensures the same codebase works locally (via a .env fallback) and on Netlify without any code changes.

🌐

Live Admin Panel URL

The panel is live at endearing-lebkuchen-345410.netlify.app. Share this URL with platform operators — it is password-protected and requires no installation.

💻

Local Development

Run locally with flutter run -d chrome --web-port 5000 --release. A local .env file provides config via the flutter_dotenv fallback — the same AppConfig class reads it transparently.

🏗️ Netlify Build Command

The Netlify build command injects all secrets at compile time:
flutter build web --release \
  --dart-define=APPS_SCRIPT_URL=<url> \
  --dart-define=APPS_SCRIPT_SECRET=<secret> \
  --dart-define=ADMIN_PASSWORD=<password>
No secrets ever touch the repository. Rotating a secret is a single Netlify environment variable update — no redeploy trigger needed.