Help Center
Open MannaCRM Open Driver App

Operations

MannaCRM operations guide

Every screen of the operations dashboard, annotated: how orders arrive, how they reach drivers, and how the day gets closed and paid.

What MannaCRM runs#

manna.huper.expressFor admins & supervisors

MannaCRM is the operations control room for Huper Express deliveries in Singapore. Orders flow in from the partner POS automatically; the CRM assigns them to drivers by postal-code zone, tracks every delivery live on a map, and settles driver payouts at month end. The driver app (drive.huper.express) is the other half of the system: everything a driver does there shows up here within seconds.

RhythmWhat happens
Every 5 min, 04:00–23:00POS sync pulls new and updated orders, then auto-assigns them to drivers by zone (postal prefix). The dashboard's Sync & Assign button triggers the same run on demand.
MorningDrivers start shifts in the driver app, scan every package barcode at the warehouse, and head out. Leaving the warehouse geofence marks jobs out for delivery.
All dayAM then PM time slots. Supervisors watch the dashboard map, rebalance overloaded drivers, message drivers over WhatsApp, and handle failures.
MidnightThe close-day job finalises the date: anything not delivered is marked failed (“auto-closed: not completed by end of day”) and becomes tomorrow's redelivery / follow-up work.
MonthlyPayout periods are generated from delivered orders and approved in the Payouts screen.

In the daily flow

Keep this open on the ops desk: Dashboard for live state, Orders for digging into a specific delivery, Reports for the day-end story.

Watch out

The CRM owns delivery data only. Sales and accounting live in the POS. Never re-key financial figures here.

Signing in#

/loginRoles: admin · supervisor

Staff sign in with their Huper email and password. What you can see is decided by the role on your staff record: admins get everything including settings and payouts; supervisors get day-to-day operations. Drivers cannot log in here; their app lives at drive.huper.express.

MannaCRM login page
  1. Email + password

    Use your @huper.asia / @huper.express account. Accounts are created by an admin in the Staff screen. There is no self-service sign-up.

  2. Sign in

    After signing in you land on the Operations Dashboard. Sessions persist on the ops machines; log out from the header icon when leaving a shared computer.

Watch out

If a page redirects you back to the dashboard, your role does not allow it (settings pages are admin-only). Ask an admin rather than sharing accounts.

Operations Dashboard, the control room#

/Default landing pageRefreshes automatically

One screen answers: how is today going? The KPI strip counts today's home deliveries and outlet runs by status; the map shows every stop, clustered and coloured by route; and the action buttons cover the four things supervisors do most.

Operations dashboard with KPI strip, action buttons and live map
  1. Navigation sidebar

    Every screen in this guide, top to bottom. The bottom group (Reports, Payout Settings, Operations Settings) is admin territory.

  2. HOME delivery counters

    Today's door-to-door orders: Total, Completed, In Progress, Pending, Failed, Unassigned. Unassigned > 0 is your first fix of the morning: those orders have no driver.

  3. OUTLET counters

    The same idea for outlet restocking runs (Total / Completed / In Progress / Failed). Outlet runs come from the weekly roster on the Outlets screen.

  4. Sync & Assign

    Manually triggers the POS pull + zone auto-assign right now, instead of waiting for the next 5-minute tick. Use it after fixing a zone or driver so new orders assign immediately.

  5. Live Tracking

    Toggles live driver GPS positions onto the map (see Live tools below).

  6. Reassign Driver

    Bulk-move stops from one driver to another: the tool for sickness, breakdowns, or rebalancing an overloaded route mid-day.

  7. Print All Routes

    Landscape A4 run sheets, one section per driver, addresses resolved from the postal-code database. Print before the vans leave.

  8. All / AM / PM / Outlets tabs

    Filter the map and counters by time slot. Deliveries run in AM and PM windows only (no Sunday operations).

  9. The map

    Each numbered bubble is a cluster of stops; colour = route/driver, shop icons = outlets. Zoom in and bubbles split into individual stops. Hover a route to see the driver and stop count.

  10. Unassigned alert

    A red badge floats over the map whenever orders lack a driver. Click through and fix by adjusting zones or assigning manually in Orders.

  11. Header status

    Green dot + “1m ago” = data freshness; the toggle switches light/dark; the last icon logs out. If the dot goes stale, check the POS sync.

In the daily flow

Morning: open dashboard → clear Unassigned → Sync & Assign → Print All Routes. Midday: watch Failed and In Progress. Evening: confirm Completed matches Total.

Watch out

Numbers reset per day. If Total looks wrong at 06:00, the POS sync may not have run. Check with a manual Sync & Assign before escalating.

Live Tracking and Reassign Driver#

/ (dashboard buttons)

The two mid-day tools. Live Tracking turns the map into a fleet view: every on-shift driver's van appears at their last GPS position. Reassign Driver moves a sick or stuck driver's remaining workload to colleagues in two steps.

Dashboard with live tracking enabled and a driver van icon on the map
Reassign driver dialog with driver workloads
  1. Tracking On

    The button turns orange while tracking is active. Positions come from the driver app's GPS pings (roughly every 5 minutes while a driver is on shift).

  2. Van icons

    Each van is a live driver; here a van sits at the Toh Tuck warehouse. A van that hasn't moved between stops for a long time is your cue to call.

  3. Select the unavailable driver

    Reassign starts by asking who is out. The dropdown shows each driver's current workload, e.g. “Ganesan (AM: 28 orders, 1 outlet | PM: 24 orders)”, so you can see the size of what you're about to move.

  4. Choose recipients

    The next step spreads the orders across the drivers you pick. Assignments update immediately; affected drivers get the new stops on their next app sync.

  5. Confirm and verify

    After reassigning, glance at Driver Load: the recipient's bar must stay out of the red, or you have traded one problem for another.

In the daily flow

Driver calls in sick at 09:00 with half a route left: Reassign Driver → pick them → spread stops → Sync & Assign → tell the receiving drivers to pull-refresh.

Driver Load: balance before it hurts#

/ (below the map)Capacity: 40 stops per driver

Scroll below the map for the same day expressed per driver. Each bar is one driver's assigned stops against the 40-stop capacity line; the packages column shows physical load. This is where you catch an unfair or undeliverable day before drivers do.

Driver load bars under the dashboard map
  1. Map tooltips

    Hovering a route shows the driver name and stop count in place: a quick sanity check without leaving the map.

  2. Over-capacity flag

    “1 over capacity”: at least one driver exceeds 40 stops. Here Ganesan carries 52 stops / 96 packages; his bar runs red.

  3. Per-driver bars

    Green under 30 stops, amber 30–39, red 40+. Click a driver to highlight their stops; use Reassign Driver to move a chunk to a lighter route.

  4. Legend

    The thresholds are printed so the colours mean the same thing to everyone.

  5. Alerts banner

    Aggregated operational alerts (late warehouse departures, stuck routes). Green “No alerts” means the system sees nothing abnormal right now.

In the daily flow

Check right after the 06:00 assignment settles and again before the PM slot begins.

Watch out

Capacity is stops, not packages: 30 stops of bulky 7-packet orders can be harder than 45 singles. Use the pkg column as the tie-breaker when rebalancing.

Orders: every delivery, searchable#

/ordersSource of truth for a single delivery

The full order book. Orders arrive from the POS with tracking number, customer, address and payment terms already attached; the CRM adds driver, status and proof of delivery. This capture is filtered to one day and shows the live lifecycle: Out for Delivery, Delivered, and Pending Pickup rows carried by real drivers.

Orders table filtered to one day with drivers and mixed statuses
  1. Search

    Matches tracking number, customer name and phone. Paste whatever the caller gives you.

  2. Date filter

    Defaults to today + tomorrow (tomorrow's orders arrive through the evening syncs). Quick presets (Today, Yesterday, This Week) live in the same picker.

  3. Filter row

    Time slot, status, driver, payment type and package count. Combine them: Failed + yesterday + driver reconstructs one driver's bad afternoon in two clicks.

  4. Driver column

    Who carries each order right now: filled by zone auto-assign, blank (“Unassigned”) when no zone matched.

  5. Status badges

    The live lifecycle: amber Pending Pickup (packages not fully scanned), purple Out for Delivery, green Delivered. Full table below.

  6. Bulk select

    Tick rows to act on many orders at once (e.g. reassigning a batch after a van breakdown).

  7. Pkgs

    Physical packets in the order. 7+ packet orders earn the driver a per-packet add-on, so this column also matters for payouts.

StatusMeaningMoved by
UnassignedNo driver yet: no zone matched the postal prefix, or the zone has no active driver.Auto-assign tick, or you
Pending SyncAssigned in the CRM but the driver's app hasn't pulled it yet (driver hasn't started shift / synced).Driver app sync
Pending PickupOn the driver's list; packages not yet all scanned at the warehouse.Driver scanning
Out for DeliveryAll packages scanned and the driver has left the warehouse geofence.Geofence / driver
DeliveredCompleted with proof of delivery. The only status that earns payout.Driver
FailedNot delivered, with a reason code. Close-day also fails anything left over at midnight.Driver / close-day

In the daily flow

Customer calls in → search their number here first; the order drawer answers “where is it, who has it, was it paid” without leaving the page.

Order drawer: one delivery, fully told#

/orders → click any row

Clicking a row slides out the drawer. This example is a delivered order minutes after the driver completed it: status is green, the proof-of-delivery photo is in, and the timeline shows the whole journey. Top half: who, where, what. Bottom half: money, proof and the audit trail.

Order drawer top: delivered status, customer, delivery, packages, payment
Order drawer bottom: proof of delivery photo, timeline, remarks
  1. Tracking + status header

    The POS tracking number and lifecycle badge, always visible while you scroll the drawer.

  2. Customer block

    Name, phone, full address with unit and postal code. Call the customer from here when a driver reports a problem.

  3. Delivery block

    Date, AM/PM slot, and the carrying driver. If the POS moves the date, the order re-syncs; the CRM never edits the POS's delivery date itself.

  4. Packages

    “1 / 1 scanned”: every barcode was scanned at pickup. Short scans show as 0/2-style fractions and block a clean run start.

  5. Payment

    Type (CASH / WorldPay / …), amount, paid and balance. This WorldPay order is prepaid: balance $0.00, and the payment remark below says “Do Not Collect Payment”. Drivers see the same instruction.

  6. Proof of Delivery

    The photo the driver captured at the door, seconds after confirming the job. Click to view full size: this is what settles “it never arrived” disputes.

  7. Timeline

    Timestamped lifecycle: Created 12:27 → Assigned → Delivered 12:36. Your first stop for “what actually happened”.

  8. Actions

    Status-appropriate actions. A delivered order shows “No further actions”; earlier stages offer the pushes you need.

  9. Remarks

    Special instructions, CS remarks and payment remarks, synced from the POS and shown verbatim to the driver.

Watch out

POD photos are presigned links that expire. Always open them from the drawer fresh rather than saving URLs.

Route Optimizer: a better plan, on request#

/optimizeNon-destructive until appliedEngine: self-hosted OSRM

Zone assignment is fair and predictable, but some days are lopsided. The optimizer takes the chosen date's orders and computes driving-time-efficient routes across the drivers you tick, using our own routing engine. It changes nothing until you explicitly apply the result.

Route optimizer with driver selection
  1. Non-destructive promise

    Running an optimization only produces a comparison. Today's live assignments stay untouched until you apply.

  2. Date

    Optimize today mid-morning, or tomorrow in the evening once most of its orders have synced in.

  3. Run Optimization

    Sends the day's stops to the OSRM routing engine (real Singapore road network, not straight lines) and returns proposed routes with distance/time deltas.

  4. Driver pool

    Tick who is actually available. The zone label under each name shows their normal patch. Untick anyone on leave; the optimizer only spreads work across checked drivers.

In the daily flow

Best used when Driver Load shows one red bar and several green ones: let the engine propose the rebalance instead of dragging stops one by one.

Watch out

Apply replaces assignments for that date. Warn drivers whose routes change mid-shift; their app re-syncs the new list on the next pull.

Failed Jobs: the exceptions queue#

/failed-jobs

Every failed delivery for the chosen date with its reason, in one queue. This capture shows a real day: 270 orders auto-closed at midnight because they were never completed in the driver app. Each row carries the tracking number, customer, slot, postal, the reason, and the driver who held it.

Failed jobs queue with real auto-closed orders
  1. Date picker

    Defaults to today; quick presets (Yesterday, Last 7 Days…) sit inside. Review the previous date first thing each morning: that's where close-day left its sweep.

  2. Driver filter

    One driver failing many stops in a row usually means an area problem (locked estate, breakdown), not many individual customer problems.

  3. The queue

    Tracking, customer, slot and postal: everything you need to call the customer and rebook without opening each order.

  4. Reason

    Driver-reported reasons (Not Home, Wrong Address, Refused, Access Denied) come from the app's failure flow. “auto-closed: not completed by end of day” means nobody resolved it and the close-day job failed it at midnight.

  5. Driver

    Who carried the order. Pair with the Activity Log timeline before promising the customer a story.

In the daily flow

Failures become tomorrow's redeliveries: confirm the new delivery date with the customer, and the order re-enters tomorrow's assignment run.

Watch out

A wall of “auto-closed” reasons means the day ended without the driver app closing jobs: an operations-process gap, not 270 individual customer issues.

Staff: people, roles and employment types#

/staffAdmin manages; supervisors view

Single directory for everyone in the operation: admins, supervisors and drivers. Two fields here quietly drive the rest of the system: role (what they can do) and employment type (what they're paid per delivery).

Staff directory
  1. Filters

    Role, active status, employment type. “41 staff members” counts everyone ever added; filter Active to see the live crew.

  2. Role badge

    Admin = full access including settings and payouts. Supervisor = daily ops. Driver = no CRM access, only the driver app. Changing role here changes what their login can reach immediately.

  3. Employment type

    Full-time or Contractor. This selects the payout rate: contractors earn $5.00 per delivery, full-timers $2.00 (on top of salary). Set it wrong and month-end pay is wrong.

  4. Vehicle

    The van currently assigned (see Vehicles). The plate follows the driver into route printouts.

  5. Edit / Deactivate

    Deactivate rather than delete when someone leaves: history, payouts and reports keep referencing them correctly. Deactivated drivers stop receiving zone assignments on the next tick.

Watch out

Creating a driver here creates their app login. Phone number matters: it's the WhatsApp target for job notifications and the OTP login for the driver app.

Leave: planned absence, automatic cover#

/leave

A calendar of driver leave and public holidays. Approved leave is not just a record: on the next assignment tick the leave-taker's zones fall through to the backup prefixes configured in Zones, so their orders quietly route to the covering driver.

Leave calendar
  1. How cover works

    Approved leave redirects the driver's zones via the backup-prefix matrix on the next auto-assign tick. No manual re-zoning needed for planned absence.

  2. Apply Leave

    Book leave for any driver: pick person, date(s) and full-day or AM/PM half. Half-day leave only redirects that slot's orders.

  3. Click any day

    Clicking a calendar cell opens the same apply form pre-filled with that date: fastest path when a driver calls in.

  4. Public holidays

    PH days (National Day and its substitute here) are marked automatically. Expect reduced schedules around them.

In the daily flow

Sick call at 05:30: book today as leave, run Sync & Assign, check Driver Load. The backup driver's bar absorbs the zone; rebalance if it went red.

Watch out

Leave cover depends on backup prefixes existing in Zones. A zone with no backup driver goes to Unassigned instead; the dashboard badge will tell you.

Vehicles: the fleet register#

/vehicles

Every van the operation runs, who drives it, and the two dates Singapore never lets you forget: COE expiry and next service.

Vehicles register
  1. Filters

    Status (Active / Inactive / Decommissioned) and vehicle type.

  2. IU label

    The in-vehicle unit number: what ERP and toll/parking records key on.

  3. Assigned driver

    Mirrors the Staff screen's vehicle column; assignment history is kept so past deliveries stay attributed to the right van.

  4. Status

    Decommissioned vans stay for history but can't be assigned. Inactive = temporarily off the road (repair, inspection).

  5. COE expiry & next service

    Sort by these monthly. A van whose COE lapses is an instant capacity cut of ~40 stops per slot.

Zones: the assignment brain#

/zonesPostal prefix → zone → driver

This table is the whole auto-assignment algorithm. An order's 2-digit postal prefix is looked up here; the matching zone names a primary driver (and a backup matrix for leave days). Edit this table and you have re-programmed tomorrow morning.

Zones table mapping postal prefixes to drivers
  1. Zone = route = pallet

    Zones are named after the physical routes/pallets in the warehouse (Route 1 / Pallet 1 …), so the map colours, the printed sheets and the warehouse floor all speak the same language.

  2. Postal prefixes

    The first two digits of the six-digit postal code. A prefix should live in exactly one active zone; overlaps make assignment order-dependent.

  3. Backup prefixes

    Where this zone's orders go when its driver is on leave. This is the matrix the Leave screen relies on.

  4. Primary driver

    The default assignee for every order whose prefix lands in this zone. Changing the driver re-points future syncs only; existing assignments stay.

  5. Edit / Deactivate

    Deactivating a zone sends its prefixes to Unassigned. Do it deliberately (e.g. splitting a zone) and immediately re-home the prefixes.

  6. Add Zone

    New estates and reshuffles: create the zone, list its prefixes, name the driver, then Sync & Assign to apply to today's book.

In the daily flow

When the dashboard shows Unassigned, the fix is almost always here: a prefix nobody owns. Known historical gaps: prefixes 18, 19 and 37.

Watch out

The zone engine only sees the postal prefix. A mis-typed postal code in the POS lands the order in the wrong zone. Fix the address at source, then re-sync.

Outlet Delivery Schedules: the weekly roster#

/outletsRestocking runs to retail outlets

Alongside home deliveries, drivers restock retail outlets. This grid is the weekly roster: rows are outlets, columns are days, a coloured pill means that driver does that outlet that day. The driver app turns each pill into an outlet run with its own load/deliver flow.

Outlet weekly schedule grid
  1. Driver legend

    Each driver has a colour, the same palette as the pills in the grid, so you can eyeball one driver's outlet week.

  2. Today column

    Highlighted. These runs surface in the OUTLET counters on the dashboard and in each driver's app this morning.

  3. Click any cell

    Click an empty “+” to assign a driver to that outlet/day; click a pill to change or clear it. Changes take effect from the next day's run generation.

  4. Unassigned counter

    “39 schedules · 1 unassigned”: an outlet/day with no driver. Clear it the same way you clear unassigned orders.

  5. Manage Outlets

    The outlet master list: names, addresses, active status. Add new outlets there before they can be rostered here.

In the daily flow

Outlet runs are paid separately from home deliveries (see Payout Settings → Outlets), so keeping the roster accurate keeps outlet pay accurate.

Payouts: month-end settlement#

/payoutsAdmin onlyOnly Delivered orders qualify

Where a month of delivered orders becomes driver pay. Payout rows are created automatically the moment a delivery completes; this screen gathers them into a monthly period for review and approval. August is empty at capture time: a fresh month.

Payouts screen with an empty new month
  1. Period picker

    Calendar-month periods. Look back at any month's approved run.

  2. Generate Period

    Computes payouts for every driver from that month's delivered orders: base rate × deliveries + surcharges + package add-ons ± adjustments + outlet runs. Safe to regenerate before approval.

  3. Summary cards

    Total payouts, average per driver, manual adjustments and how many rows still await approval: your month-end checklist in four numbers.

  4. Per-driver rows

    Deliveries count, base pay, adjustments, outlet pay, total, and an approval action per driver. Approval locks the row for payroll.

In the daily flow

Month-end: wait for the last close-day of the month → Generate Period → spot-check two or three drivers against Reports → Payout → approve.

Watch out

Only delivered orders count. Failed and pending never pay. If a driver disputes, the Activity Log plus POD photos settle it in minutes.

Payout Settings: the pay formula#

/settingsAdmin onlySix tabs

The rules the Generate step applies. Each tab is one term of the formula: base rate per employment type, postal surcharges, package-count add-ons, one-off adjustments, bulky item rates and outlet run rates.

Delivery rates per employment type
Postal surcharges tab
  1. Tabs

    Rates · Surcharges · Packages · Adjustments · Bulky Items · Outlets. Work left to right when onboarding a new pay policy.

  2. Add Rate = rate history

    Creating a new rate auto-closes the previous one with an effective-date range. Past months keep paying at the rate that was current then. Never edit an old rate to “fix” history.

  3. Current base rates

    Contractor $5.00 per delivery; Full-time $2.00 (full-timers also draw salary). Set per staff member via employment type on the Staff screen.

  4. No-Go prefixes

    Surcharge rows can also be marked No-Go, which blocks auto-assignment into a prefix entirely: the lever for areas we don't serve.

  5. Sentosa surcharge

    Prefix 09 pays the driver an extra $5.00 per delivery. Package add-on policy (Packages tab): orders with 7+ packets pay a flat add-on, $5 for contractors, $1 for full-time.

Watch out

Rate changes apply from their effective date forward. Change rates before generating the period, not after approving it.

Reports: the numbers that leave the building#

/reportsDaily · Driver · Zone · PayoutCSV export

Four rollups over any date range, each exportable to CSV. Daily Delivery is the day-end story; Driver Performance ranks the crew; Zone shows where the load and failures live; Payout mirrors the payouts screen for finance.

Daily delivery report
Driver performance report
  1. Report tabs

    Switch rollup without losing your date range. Deep-linkable (?tab=zone) for bookmarks.

  2. Date range

    Defaults to the trailing week. Month-to-date is the natural range for payout cross-checks.

  3. KPI cards

    Total, success rate, failed for the range.

  4. Export CSV

    Exactly the table below, as a file: the handoff format for management and finance.

  5. AM / PM split & per-driver rows

    Daily rows split by slot to show where a bad day went wrong; the Driver tab turns the same range into totals, completed, failed and success % per driver.

Activity Log: the audit trail#

/activity-log

Every lifecycle event the system or a person produces, grouped per order: assignments, scans, status changes, failures, deletions. When anyone asks “who did that and when”, the answer is here.

Activity log grouped by order
  1. Search

    By order tracking number or driver name: the quickest route to one order's full history.

  2. Filters

    Date range, event type, driver. “Failed events + yesterday” reconstructs the close-day sweep.

  3. Volume line

    “Showing 1–50 of 24,251 logs across 50 orders”: the log is complete history; always filter before scrolling.

  4. Grouped rows

    Each order expands to its timestamped events. Outlet runs log here too (OUTLET prefix). “Unknown driver” rows are system events like close-day failing an unassigned order.

Watch out

The delete (bin) icon removes a log group: admin only, and rarely the right answer. Prefer leaving history intact; reports already exclude voided orders.

Operations Settings: two numbers that gate the day#

/settings/operationsAdmin only

Deliberately small: where the warehouse is, and how far “at the warehouse” stretches. Both feed the geofence logic that turns driver GPS into operational truth.

Operations settings: warehouse location and geofence radius
  1. Warehouse location

    Postal 596227 (Toh Tuck Link), resolved via Lookup against the national postal database. Departure detection, “start early” logic and late-arrival alerts all measure from this point.

  2. Geofence radius

    250 m (recommended 200–300). Inside it a driver still counts as “at warehouse”, so late-arrival detection holds off and freshly synced orders can still join their run. Too small = false departures in the car park; too large = departures detected late.

Watch out

Changing warehouse postal mid-day confuses departure detection for drivers already out. Change it after close-day, not during operations.

The supervisor's day: a checklist#

Printable

Everything above, compressed into the rhythm of one operating day.

WhenDoScreen
05:45Confirm overnight orders synced; counters look sane; green freshness dot.Dashboard
06:00Clear Unassigned (fix zones / assign manually), then Sync & Assign.Dashboard · Zones
06:15Check Driver Load; rebalance red bars (Reassign Driver or Optimize).Dashboard · Optimize
06:30Print All Routes; confirm outlet runs have drivers.Dashboard · Outlets
MorningWatch scans progress; chase drivers still Pending Pickup after departure time.Orders
MiddayReview AM failures while PM loads; call customers where needed. Live Tracking for stuck vans.Failed Jobs · Order drawer
EveningCompleted ≈ Total? Work the remaining exceptions before close-day fails them for you.Dashboard · Failed Jobs
Next morningReview what close-day auto-closed at midnight; arrange redeliveries.Failed Jobs (yesterday)
Month endGenerate payout period, cross-check with Reports → Payout, approve.Payouts · Reports