Operations Handbook

Crew Fleet Manager — User Manual

How to roster crew, cluster pickups, run the fleet, and keep everyone moving — for dispatchers, hub managers, drivers, and the crew members they carry.

Getting started

There are two front doors into the system. Which one you use depends on your role.

Admin console

Super Admin, Hub Manager, Dispatcher — the full desktop dashboard for managing the fleet.

Driver & crew portal

Driver, Crew Member — a mobile-first app for the people actually on the road.

Both apps share the same sign-in: your work email and password. Open the correct address for your role, enter your credentials, and select Login (console) or Log In (portal). If you're logged into one, the other will ask you to sign in again — they're separate apps.

First login Your administrator creates your account and sets a temporary password. Once in, use your profile menu to set a password only you know.

Who uses what

Five roles, two apps. This is the shape of the whole system in one table.

RoleAppWhat they're there to do
Super AdminAdmin consoleEverything, including the one thing nobody else can touch: system Settings.
Hub ManagerAdmin consoleRuns day-to-day operations — people, vehicles, hubs, invoices, reports.
DispatcherAdmin consoleOwns the daily clustering-and-assignment workflow and cab request approvals.
DriverPortalStarts and completes trips, logs pickups and drops.
Crew MemberPortalChecks today's ride, tracks the cab, requests an ad-hoc one.
Crew Fleet
Dashboard Users Vehicles Crew Hubs Routing Tracking

A dark sidebar on the left, your working page on the right. Every section below lives behind one of these icons.

Dashboard

The landing page after login. Four numbers, updated live.

  • Total Vehicles — vehicles registered in the fleet, active or not.
  • Active Crews — crew members currently marked active.
  • Active Trips — trips in progress right now.
  • API Status — a quick self-check that the backend is reachable. ✓ Healthy means everything behind the scenes is working; anything else, contact your administrator before relying on the rest of the app.

Users

Super AdminHub Manager

Every account that can sign into the admin console or the portal — dispatchers, hub managers, drivers, and crew members with login access — is managed here.

Add a user

  1. Select Add User.
  2. Enter their first name, last name, and work email.
  3. Choose a role: Hub Manager, Dispatcher, Driver, or Crew Member.
  4. Select Save User. A temporary password is generated for their first login.

Edit or deactivate

Select Edit on any row to change their name, email, or role. Select Deactivate to immediately block their login without deleting their history — useful when someone leaves, without losing the trips or records tied to their account. Activate reverses it.

Before deactivating a driver Make sure they don't have a trip in progress — reassign or complete it first, or the trip will be left without an active driver.

Vehicles

Super AdminHub Manager

The registry of every cab and van in the fleet, whether company-owned or contracted from a vendor.

RegistrationTypeStatusDriver
CAR-001sedanAvailableUnassignedEdit · Deactivate
VAN-004vanOn TripR. KumarEdit · Deactivate

Add a vehicle

Select Add Vehicle and fill in registration number, make, model, year, seating capacity, vehicle type (sedan, SUV, or van), fuel type, and current odometer reading. Set Ownership correctly:

  • Company Owned — your own fleet vehicle.
  • Vendor Leased — contracted from an outside operator. This is what makes the vehicle show up for invoicing later, so get it right at entry.

Status colors

Available ready to assign
On Trip / Maintenance temporarily unavailable
Out of Service needs attention before reuse

Crew

Super AdminHub Manager

Everyone who needs a ride to or from a shift: employee ID, contact details, designation, department, and — critically — their home address as latitude/longitude.

Why the coordinates matter Home location is what the clustering engine uses to group nearby crew members into a single pickup route. An inaccurate pin means a longer, less efficient route for everyone in that cluster — get it as close to the actual doorstep as you can.

Use Add Crew to register someone new, Edit to update their details, and Deactivate to remove them from future rostering without deleting their trip history.

Hubs

Super AdminHub Manager

Hubs are the fixed pickup/drop points — depots, offices, stations — that anchor every route. Each one has a code, name, address, coordinates, and a processing time in minutes: how long crew typically take to sign on or off once they arrive, which routing uses to avoid over-tight schedules.

Add hubs before you add crew rosters — a roster entry always points at a hub, and clustering groups crew by which hub they're headed to.

Routing

DispatcherHub ManagerSuper Admin

This is the heart of the day's work: turning a list of scheduled crew into vehicles with routes and drivers.

1

Roster

Crew are scheduled for a hub, shift, and date.

2

Cluster

Nearby crew on the same shift are grouped into a pickup group.

3

Optimize

Stops within the cluster are put in the shortest driving order.

4

Assign

A vehicle and driver are matched to the route.

5

Trip

The driver sees it on the portal and runs it.

Run the automatic scheduler

The fastest path for a normal day: select Run Scheduler under Automatic Scheduler. It clusters every crew member rostered for the selected date and assigns vehicles in one pass. This is the same logic that runs on its own every night for the next day — use the button when you need it sooner, or need to re-run it after a late roster change.

Work a cluster by hand

Under Clusters (Pickup Groups), pick a date and select Load Clusters. Each row is one pickup group, showing its hub, shift, crew count, and status.

  • View / Edit opens the cluster's member list — add a crew member the automatic pass missed, or remove one who's no longer riding.
  • Optimize Route reorders the stops for the shortest drive.
  • Assign Vehicle (once optimized) opens a picker for vehicle and driver.
Pending Assignment clustered, no vehicle yet
Assigned vehicle & driver set
Completed trip finished

Open Vehicle Assignments is a shortcut to the Vehicles page for a broader view of who's driving what today.

Tracking

DispatcherHub ManagerSuper Admin

A live map of every vehicle currently on a trip, plotted against hub locations, alongside a status table of vehicle, driver, current trip, and how many crew are onboard. Tick Auto-refresh (10s) to keep it current without manually reloading — useful to leave running on a dispatch desk screen.

Nothing showing? The map only plots vehicles that are actively on a trip. If it's empty, no trips have started yet today — check Routing to confirm vehicles are assigned.

Cab Requests

Who can approve: DispatcherHub ManagerSuper Admin

Ad-hoc pickup or drop requests that fall outside the planned roster — a late shift change, a one-off need. Crew submit these themselves from the portal; you review them here.

For each pending request, Approve or Reject. Either action notifies the crew member automatically — see Notifications. Approving doesn't create a vehicle assignment by itself; treat it as confirming the ride is needed, then route it through Routing & clustering or a manual trip as your process requires.

Invoices

Super AdminHub Manager

Billing for vendor-leased vehicles. Select Generate Invoice, choose the vehicle and a billing period (start and end date), and the system totals up trips run in that window. Use View for a line-item breakdown or Print for a print-ready copy.

Draft / Sent not yet paid
Paid settled
Overdue past due date

Reports

DispatcherHub ManagerSuper Admin

Planned vs. actual utilization

Set a date range and select Apply. For every vehicle, this compares the distance the route was planned for against what the driver's odometer and the vehicle's GPS actually recorded — trips run, completed, planned km, actual km, and the deviation between them. A large, consistent deviation on one vehicle is usually worth a closer look: a longer real-world route, detours, or an odometer entry error.

Activity history

A searchable audit log of who changed what — filter by entity type (e.g. vehicles) or action (e.g. vehicle.updated) and select Apply. Step through results with Previous / Next.

Settings

Can view: Hub ManagerSuper Admin  ·  Can change: Super Admin only

System-wide configuration grouped by area — billing terms and tax rate, clustering limits and time windows, and other values that shape how routing and invoicing behave. Edit a value and select Save next to it.

Hub Managers You can see these values, but the Save action is restricted to Super Admin accounts. If a change is needed, ask your Super Admin.

Driver portal

Everything a driver needs, in the order a shift actually happens.

Hi, John
Driver
VAN-004 · 3 stops
08:00 · Not started
CAR-001 · 1 stop
14:30 · Not started

My Day — tap any trip card to open it.

1. Find today's trips

After logging in, the Date field defaults to today. Change it to check a different day. Each card shows the vehicle, number of stops, and current status — tap one to open it.

2. Start the trip

Enter the vehicle's current odometer reading in Start Odometer (km). A photo of the odometer is optional but recommended — it backs up the reading if it's ever questioned. Select Start Trip. Your location is recorded at this moment.

3. Work the stops

The Stops list shows every crew member on this route, in driving order. As you reach each one, mark them Picked Up or Dropped. If someone isn't there, use No-Show instead of skipping them silently — it keeps the record accurate and lets dispatch follow up.

4. Complete the trip

Once every stop is handled, enter the End Odometer (km) reading (again, a photo is optional), add any notes about the trip, and select Complete Trip. The distance you logged becomes part of the utilization report dispatchers see.

GPS status A small status line at the bottom of the trip screen shows whether your location is being captured. If it says location is unavailable, check that the browser or device has location permission turned on for the portal — odometer entries still work without it, but position tracking and the crew's live map won't.

Crew portal

What a crew member sees and can do, start to finish.

Hi, Michael
Crew Member
Morning Shift A
Head Office · Scheduled
Where's My Cab
VAN-004 · 4 min away

My Day — today's roster, live cab position, and your requests, all on one screen.

Today's roster

After logging in, your card shows whether you're rostered for the selected date, which hub and shift, and your current status (Scheduled, Picked Up, Dropped, and so on). Change the Date field to check another day.

Where's My Cab

Once your driver starts the trip, this section appears automatically with a live map: your vehicle's current position, the hub, and your driver's name and phone number. It refreshes on its own every 15 seconds — no need to reload.

Don't see it yet? It only appears after the driver has started the trip you're on. Before that, check your roster card for your scheduled pickup time.

Request a cab

Need a ride outside your normal roster — a schedule change, a one-off trip? Select New Request, fill in the date, approximate time, type (pickup, drop, or round trip), pickup address, and a short reason, then select Submit Request. Track its status — Pending, Approved, or Rejected — on your home screen. You can Cancel a request yourself as long as it's still pending.

Notifications

You'll receive an automatic text message when:

  • A trip you're scheduled on starts.
  • You're marked picked up or dropped.
  • A cab request you submitted is approved or rejected.
Not receiving texts? Text delivery depends on your organization having a messaging provider connected. If nothing arrives, don't assume the action didn't happen — check the relevant screen (your roster, or your cab request status) directly, and flag the missing text to your administrator.

Roles & permissions

The complete picture, for reference.

AreaSuper AdminHub ManagerDispatcherDriverCrew
UsersFullFull———
VehiclesFullFullAssign driver——
Crew & hubsFullFullView——
Routing & clusteringFullFullFull——
TrackingViewViewView——
Cab requestsApprove/rejectApprove/rejectApprove/reject—Submit own
InvoicesFullFull———
ReportsFullFullUtilization only——
SettingsView & editView only———
Trips——CreateStart/run/complete own—
My roster / my cab————View own

Troubleshooting

Tracking shows no vehicles

The map only plots vehicles on an active trip. Check Routing to confirm today's trips have actually been started by their drivers, not just assigned.

Where's My Cab isn't showing anything

This section only appears once the driver has started the trip. Confirm with dispatch that the trip has actually begun, and check your roster card for the scheduled pickup time in the meantime.

I can't save a change in Settings

Saving Settings values is restricted to Super Admin accounts. Hub Managers can view but not edit — ask your Super Admin to make the change.

The map background looks blank or gray

Map tiles are drawn from a public map-tile service that your browser needs its own connection to. Check your internet connection, or ask IT to confirm outbound access to the map-tile service isn't blocked.

A cab request notification never arrived

Text delivery depends on a messaging provider being connected for your organization. Check the request's status directly on your home screen rather than relying on the text, and flag the missing message to your administrator.

I was deactivated by mistake, or someone left and is still active

Both are Users page actions: a Hub Manager or Super Admin can Activate a mistakenly-deactivated account, or Deactivate one that should no longer have access — instantly, without losing any history tied to it.

Minimum requirements to host

For whoever stands this up on a real server. Three moving parts: a web/database stack, a self-hosted routing engine, and a network path in front of it.

Web & database server

ComponentMinimumNotes
PHP8.1 or newerBuilt and tested on 8.2.26. Only the pdo_mysql extension is required, plus allow_url_fopen left on (the default) — the app talks to the routing engine over plain HTTP, not curl.
MySQL / MariaDB8.0 or newerTested on MySQL 9.1. Needs utf8mb4 support, standard on any current build.
Web serverApache 2.4+ with mod_rewriteNginx works too but needs equivalent rewrite rules written by hand — the included .htaccess files are Apache-specific.
Disk~2 GB for the OS and stackPlus the database (grows with usage) and the routing engine's data below.
RAM2 GB, separate from routingThe web/database side is light; nearly all memory pressure comes from the routing engine.

Routing engine

Road-network distances and directions come from a self-hosted routing engine (GraphHopper) — not a paid mapping API. It needs its own Java runtime and a map extract for the area you actually cover.

ComponentMinimumNotes
Java runtimeJava 17 (LTS)Runs as its own background process, separate from PHP.
Map dataAn OpenStreetMap extract for your service areaDownload just the country, state, or city you operate in — not the whole planet.
Disk (map data)Scales with area coveredA whole-country extract runs ~1.6 GB downloaded, ~4 GB once the routing graph is built. A single city or state is a small fraction of that.
RAM (heap)Scales with area coveredA whole-country deployment needs ~6 GB of heap. A city- or state-sized extract is comfortable on 1–2 GB.
Right-size the map extract Cover only the region your crews and vehicles actually operate in. A smaller extract means less disk, less memory, and a faster startup — there's no benefit to loading map data for places you'll never route through.

Network

  • A domain name, pointed at the server.
  • An HTTPS certificate — logins and session tokens shouldn't travel in the clear. A free certificate (Let's Encrypt) is sufficient.
  • Outbound internet access from users' browsers — map imagery is drawn from a public map-tile service, so whoever is viewing a map needs their own connection to it. The server itself doesn't need continued internet access once the routing engine's map data is downloaded.
  • The routing engine's port and the database port should never be reachable from outside the server — see the security note in the next section.

Deploying to the web

From a working copy to a live, internet-reachable install.

  1. Provision a server. A small Linux VPS (Ubuntu 22.04 LTS or similar) is the most common, cost-effective choice, and every step below assumes one — the same stack runs on Windows Server too, just with different install commands and a Scheduled Task in place of cron.
  2. Install the stack. Install PHP 8.1+ with the pdo_mysql extension, MySQL or MariaDB 8+, and Apache with mod_rewrite enabled.
  3. Install the routing engine. Install a Java 17 runtime, then set up GraphHopper with a map extract covering your service area (see requirements above for sizing). Keep it bound to 127.0.0.1 — it should only ever be reached from this same server, never from the internet.
  4. Copy the project onto the server. Place the whole project folder (both the web/ and api/ directories together, as siblings) anywhere convenient on disk.
  5. Create the database. Create a database and application-specific database user, then import the schema files in order, followed by the setup script that creates the first tenant and admin account.
  6. Configure the environment. Copy the environment template to .env and fill in your real values: the domain name, database credentials, and the routing engine's address. Generate a long, random value for the JWT signing secret — logins depend on it, and the placeholder value must not reach production.
    Don't skip this An unchanged, default signing secret means anyone who reads the source could forge a valid login for any account. Generate a fresh one for every install.

    SMS and email credentials are optional — leave them blank and the app still works fully, it just won't be able to actually send the text messages described in Notifications.

  7. Point your domain at the project. Set your domain's document root directly at the project folder — not a parent folder. That puts the admin console at yourdomain.com/web/ and the API at yourdomain.com/api/, matching the routing rules already built into the included .htaccess files. Visiting the bare domain redirects to the admin console automatically.
  8. Set storage permissions. The web server's user needs write access to the application's upload and log storage folders — this is where odometer photos and local activity logs are written.
  9. Run the routing engine as a service. Set it up to start automatically on boot and restart if it crashes, rather than running it in a terminal session that ends when you log out.
  10. Schedule the nightly clustering run. Add a scheduled job (cron, or a Scheduled Task on Windows) that runs the clustering script once a day ahead of the next day's shifts — this is what the Run Scheduler button also triggers on demand, so the daily job simply saves dispatchers from doing it by hand every evening.
  11. Turn on HTTPS. Issue a certificate for your domain and make sure plain HTTP requests redirect to HTTPS. Login credentials and session tokens are sent on every request — they shouldn't ever travel unencrypted.
  12. Verify.
    • Load the admin console and confirm API Status on the Dashboard reads ✓ Healthy.
    • Log in, add a hub and a vehicle, and confirm they save.
    • Open Tracking and confirm the map background actually draws (proof the browser can reach the public map-tile service).
    • Run the scheduler once by hand and confirm a cluster appears — proof the routing engine is reachable from the app.
Security checklist, in one place Real JWT secret in .env. HTTPS enforced. Routing engine and database ports closed to the outside world. Default seed passwords changed before handing out real accounts.