Redirecting…
BHS Admin
🔒 Read-only mode — live data is visible but no changes can be made. Set READ_ONLY=false in Railway to re-enable writes.

Dashboard

Revenue and campaign overview

Loading data…
Confirmed Revenue
—
Offline Revenue
—
Confirmed
—
Offline Bookings
—
Total Reservations
—
Total Clients
—
Live Reservations
▼
—
In Checkout
—
Converted
—
Expired
—
Slots Held
Product Qty User Status Reserved Expires
Connecting…

Clients

No clients yet.
Client Source Orders Total Value Last Order

Product Inventory

Loading…

Total
—
Live
—
Offline Only
—
Sold Out
—
No status
—
Inventory by Zone
Schema fields not yet populated:
Loading from Sanity…
Product Type Price Dimensions T.Slots Online Offline Avail. Status Sync

Online Revenue
—
Offline Revenue
—
Total Revenue
—
Avg per Site
—
Product Type Price Online Qty Online Rev Offline Qty Offline Rev Total Rev

Bookings Log

Loading…

Loading…
No bookings yet.
ClientProductType QtySourceStaff / EmailDateStatus

Customers

Firebase Auth accounts with order history

Click ↻ Refresh to load Firebase customers.

Reports

Bookings Report All confirmed orders with item breakdown
▶
Click ↻ Load to fetch all confirmed orders
Good Orders Payment-confirmed orders · Safe to print or Hold
▶
Click ↻ Run to load good orders
Orders Summary Good and held orders combined
▶
Click ↻ Run to load orders
Users Report Firebase users with booking and payment summary
▶
Click ↻ Load to fetch all Firebase Auth users
⚠ Impact Report Overbooking · verified orders · unmatched payments
▶
Set the PayPal date range and click ▶ Run Report. Loads all Firebase orders and verified PayPal transactions, then identifies overbooking via FIFO analysis.

Map

Location-specific orders and offline bookings by site

Online orders Offline bookings Overbooked products
Loading map data…
Locations

System

Service health, alerts and monitoring

🔍 Order Investigation

Enter an order ID to pull its full Firebase document, all stockLog entries for its products, and check for duplicate orders.

⚠ Stock data may be stale — one or more products have not been updated in over 24 hours. Check whether sync-stock-to-firebase.js needs re-running after a CSV import.
Service Status
Firebase Sanity API /api/offline-booking /api/toggle-status /api/health
Inventory Alerts

Loading inventory…

Live Booking Activity

Connecting…

Daybook Sync
⏳ Checking configuration…
—
Total in Daybook
—
Synced
—
Unmatched
—
Failed
—
Already synced

Sync history will appear here.

Online Booking Sync

Compares booked_online in each Firestore stock doc against the actual count of confirmed online orders. Use this to detect and fix cases where paid bookings haven't updated the stock counter.

Click "Run Check" to compare Firestore stock docs against confirmed order data.

Staff Activity

Loading…

Orphaned Payments

Loading…

Webhook Log

Loading…

Stock Movement Log

Loading…

Stock Reconciliation

Click "Run Check" to cross-reference Sanity stock counts against Firestore booking records.

Stock Integrity Check

Click "Run Check" to validate Firestore stock documents against Sanity product list.

Live Stock Changes

Listening for stock changes…

Firestore Inspector

Click "Inspect" to diagnose why online bookings may not be appearing. Shows raw Firestore data — no filtering applied.

Stock Import — CSV Matches by Site Code → daybook_site_id

Upload a CSV containing SITE CODE, REVISED PHASE 1 CAP and OFFLINE SALES columns. Updates total bookable slots and offline bookings in Firestore for each matched product.

Data Exports
⚠ Super Admin — Archive & Reset

Archive clears all in-app log data (bookings log, stock log, webhook log, activity feeds). No data is deleted from Firebase or Sanity. Use this to start fresh between sales periods or after testing.

PayPal Transactions

View and export PayPal payment history

PayPal API keys not configured.
To connect your PayPal account, add the following environment variables in your Railway project → Variables:

PAYPAL_CLIENT_ID — your PayPal REST app Client ID
PAYPAL_CLIENT_SECRET — your PayPal REST app Secret
PAYPAL_MODE — set to live or sandbox (default: live)

Get these from developer.paypal.com → My Apps & Credentials → REST API apps.
Transactions
—
Gross
—
Fees
—
PayPal charges
Net
—
Gross − Fees
Unique Customers
—
distinct payers
Refunds ↕
—
returned to customers
Unlinked Revenue ↕
—
no Firebase order
Refunds paid back to customers
PayPal payments with no matching Firebase order
Select a date range and click Apply to load transactions.

Bookings 2.0

Firebase orders matched to PayPal payments

Orders
—
Matched to PayPal
—
Unmatched
—
Order Revenue
—
PayPal Gross
—
Difference
—
Set a date range and click ↻ Load Orders to begin.
Load PayPal data separately or use the PayPal tab first — matches will appear automatically.

Daybook Campaigns

Live view of all campaigns in Daybook — syncs changes to Firebase

No baseline saved yet — save one to start tracking changes when account managers update Daybook
Click ↻ Refresh to load Daybook campaigns

Overbooking

FIFO breakdown of orders per over-capacity site

Set a date range and click Run Report
🔐

Admin Access

Full data access — Firebase accounts, PayPal transactions, payment integrity and site health diagnostics.

Incorrect password.

⚙ Admin

Firebase · PayPal · Sanity — full data cross-reference

⚠ PayPal capture data not loaded — open Bookings 2.0 and let it auto-lookup captures first, then return here and Refresh All. Payment integrity checks will be incomplete without it.
▶ ⚠ Payment Issues

Click ↻ Refresh All to run analysis.

▶ 💰 Revenue Reconciliation

Awaiting data load.

▶ 👤 All Firebase Accounts

Awaiting data load.

▶ 🔗 Orders Without a Firebase Account

Awaiting data load.

▶ 🔗 Cross-System Integrity

Fetches PayPal transaction history and cross-references against Firebase. Finds money received with no booking, refunded orders still confirmed, and customers who paid more than once.

Set a date range and click ▶ Run.

▶ 📋 All Orders

Awaiting data load.

⚠ Archive & Reset — Super Admin
This will clear all log data from this application view. Nothing is deleted from Firebase or Sanity. Enter the super admin password to continue.
Incorrect password.