Enter the access code to continue.
A complete rebuild of an existing live cab-hailing platform — full source-code ownership, no white-label licensing. The Figma design file is already provided and covers all screens end-to-end.
Flutter 3.x cross-platform apps (single codebase, Android + iOS). Node.js REST + Socket.io backend. PostgreSQL + PostGIS for geospatial queries. Redis for real-time pub/sub and caching. React/Next.js admin dashboard consuming the same Node.js APIs.
One app that works on both Android and iPhone. A live backend that handles all logic and data. A web control panel for the operations team. The map and driver location update in real time with no manual refresh needed.
| Component | Technology | Notes |
|---|---|---|
| 📱 Mobile Apps | Flutter 3.x | Single codebase — Android & iOS |
| 🖥 Admin Panel | React 18 / Next.js + TypeScript | Web dashboard, SSR-ready |
| ⚙️ Backend | Node.js — Express or NestJS | REST + WebSocket (team may propose preferred) |
| 🗄 Primary DB | PostgreSQL + PostGIS | Relational + geospatial query support |
| ⚡ Cache / Realtime | Redis | Pub/sub for live events, session & rate-limit cache |
| 🗺 Maps | Google Maps Platform | SDK, Geocoding, Directions, Autocomplete, Heatmap |
| 💳 Payments | Razorpay | UPI, Cards, Netbanking, Wallets + Payouts API |
| ☁️ Infrastructure | Cloud VPS (DigitalOcean preferred) | Team may propose alternatives based on performance needs |
| 💬 SMS / OTP / Email | MSG91 | Client has existing account — credentials provided |
| 🔔 Push Notifications | Firebase FCM | Android + iOS push |
| 🔐 Social Login | Google (Android) · Apple (iOS) | via Firebase Auth |
| 📦 File Storage | S3-compatible cloud storage | KYC docs, profile photos — R2 / S3 / DO Spaces, team to decide best fit |
Android + iOS · Customer-facing app for booking, tracking, and paying for rides
Flutter widget tree with BLoC/Provider state management. Firebase Auth for Google/Apple SSO. MSG91 for OTP. Google Maps SDK for live map rendering. Socket.io client for real-time ride events. Razorpay Flutter SDK for payment collection.
The app a customer downloads to book a cab. They log in, pick a destination, see nearby drivers live on the map, choose ride type, confirm fare, and pay — all in one seamless flow. Driver location updates continuously without any refresh.
| Feature | Plain English | Technical Detail |
|---|---|---|
| Onboarding & Auth | ||
| 📞 Mobile OTP Login | Enter phone number → receive SMS code → log in | MSG91 OTP API, 6-digit code, 5-min expiry, rate-limited |
| 📧 Email + Password | Standard email login with forgot-password reset flow | JWT + bcrypt, reset link via MSG91/email |
| 🔵 Google Sign In | One-tap login with Google account (Android primary) | Firebase Auth — Google OAuth 2.0 |
| 🍎 Apple Sign In | One-tap login with Apple ID (iOS primary) | Firebase Auth — Sign in with Apple (required for iOS) |
| Map & Booking | ||
| 🗺 Live Map Home Screen | App opens to a map showing nearby available drivers as pins | Google Maps Flutter SDK + real-time driver locations via Socket.io |
| 🔍 Location Search & Autocomplete | Type a destination — smart suggestions appear instantly | Google Places Autocomplete API, reverse geocoding for current location |
| 🏠 Saved Addresses | Save Home, Work, and custom locations for quick re-booking | User address book in DB, auto-fill on booking screen |
| ⚡ Instant Ride | Book a cab right now — nearest driver gets the request | PostGIS nearest-driver query, sequential dispatch via Socket.io with timeout |
| 📅 Scheduled Ride | Book a cab for a specific future date and time | Cron-based pre-assignment, admin-configurable advance lead time |
| ⏱ Car Rental (Hourly) | Book a car for a set number of hours and kilometres | Packages configured in admin; fare recalculated at trip end on actual KM + wait time |
| 🔄 Return Trip | Add a return journey at booking — both legs quoted together | Dual-leg booking, toll itemised per leg, waiting charges applied independently |
| 🛣 Outstation Ride | Book a one-way or round-trip intercity cab — e.g. Ludhiana to Delhi | Per-km outstation pricing, driver allowance, night halt charges, mandatory return time for round-trips, tolls counted both ways |
| 📍 Multiple Stops | Add intermediate stops during a trip — driver navigates each one in order | Sequential waypoints passed to Google Directions API; per-stop wait time tracked and added to fare |
| ⚡ Surge Warning | Rider sees a surge multiplier and must confirm before booking | Geofence zone check at booking time, multiplier applied, rider acknowledgement required |
| 🚗 Vehicle Category Selection | Choose from available cab types (Mini, Sedan, SUV, etc.) | Categories defined in admin; fare engine applies per-category pricing rules |
| ✈️ Airport Pickup (Fixed Fare) | Pre-set destination cards on the home screen — tap to book an airport drop/pickup at a fixed price | Admin-configured fixed-price routes (e.g. Airport → Chandigarh, Delhi, Noida, Amritsar); bypasses dynamic fare engine; shown as prominent cards on rider home screen |
| 💰 Fare Estimate | Fare shown before confirming — no surprises at the end | Server-side fare calculation using all pricing parameters, returned before booking confirmation |
| Live Tracking & Trip | ||
| � Trip OTP | A 4-digit code is shown on the rider's screen — driver must enter it to start the ride, preventing wrong-passenger pickups | OTP generated server-side on driver arrival event; verified by driver before state transitions to In Progress |
| � Real-Time Driver Tracking | Driver's location updates live on the rider's map | Socket.io location events driver → server → rider room, smooth marker animation in Flutter |
| 🔄 Trip Status Updates | Step-by-step: Assigned → On the Way → Arrived → Started → Done | Socket.io event per state transition, FCM push notification as fallback |
| 📞 Masked Call to Driver | Call the driver without revealing either person's real number | Exotel / MSG91 Voice masked calling integration |
| 💬 In-App Chat — Rider ↔ Driver | Message the driver during the trip without leaving the app | Socket.io room per trip ID; messages persisted in DB; quick-reply suggestions |
| 💬 In-App Chat — Rider ↔ Support | Contact customer support directly from the app at any time | Separate support Socket.io/chat room; admin panel shows all open customer threads |
| 🛣 Route on Map | Full route drawn from pickup to drop while riding | Google Directions API polyline overlay on the Flutter map |
| Payments, Safety & Post-Trip | ||
| � Cash Payment | Rider pays driver in cash at trip end — no app action needed | Rider selects Cash at booking; trip completes normally; fare recorded in DB without payment gateway call |
| � Save Payment Methods | Save a card or UPI ID for one-tap payment next time | Razorpay tokenisation — PAN never stored on platform; tokens linked to user ID; selectable at checkout |
| 🔁 Payment Retry | If payment fails, rider gets a retry window before the ride is marked as unpaid | 5-minute retry window after failure; after expiry, ride marked as debt — new bookings blocked until cleared |
| � Pay by QR Code | At trip end, a QR code appears on the driver's phone — rider scans it and pays; status auto-updates | Driver app generates a Razorpay dynamic QR (UPI intent link); payment webhook updates trip status to Paid in real time via Socket.io |
| �� Online Payment | Pay via UPI, card, wallet, or netbanking | Razorpay Flutter SDK — order create → payment → capture → webhook verify |
| 💵 In-App Wallet | Top up balance; auto-deducted when trip completes | Wallet ledger in DB, Razorpay top-up, atomic deduction on completion |
| 🆘 SOS Button | One tap sends live location to saved emergency contacts | Emergency contacts in user profile, SMS + shareable link triggered instantly |
| 🔗 Share Live Trip | Send a link so someone else can watch the trip live | Token-based public tracking URL, auto-expires on trip completion |
| ⭐ Rate Driver | 1–5 star rating + optional comment after every trip | Rating stored per trip, feeds into driver performance score in admin |
| 📋 Ride History & Receipts | Full list of past rides with itemised fare breakdown | Paginated history API, receipt with all line items (base, distance, time, tax, etc.) |
| 🧾 GST Invoice | A GST-compliant PDF invoice is auto-emailed after every completed trip and downloadable from ride history | Invoice generated server-side on trip completion; includes HSN/SAC, GSTIN, tax breakup; PDF stored in S3 and emailed via MSG91 |
| 💸 Tip Driver | Optionally add a tip after the trip ends — 100% goes directly to the driver | Post-trip tip screen; tip amount added to driver earnings ledger; not included in platform commission calculation |
| 👥 Refer & Earn | Share your code — both you and your friend get wallet credit | Referral code generation; credit applied on new user's first completed ride |
| 🏷 Promo Codes | Enter a code at checkout for a discount | Code validation API; types: flat / percentage; per-user and total usage limits |
| 🎫 Coupons | Auto-apply or select available coupons at checkout | Coupon eligibility check at fare stage; stacking rules configurable in admin |
Android + iOS · Driver-facing app for accepting rides, navigation, and tracking earnings
Background location service (Geolocator plugin) broadcasting via Socket.io only when driver is online. KYC document upload to S3-compatible cloud storage. FCM high-priority channel for ride requests even when app is backgrounded. Payout via Razorpay Payouts API.
The app a driver uses to work. Sign up, upload documents, get approved — then go online to start receiving ride requests. A popup appears for each request; tap Accept, navigate to the rider, start the trip. All earnings tracked in-app with a payout request button.
| Feature | Plain English | Technical Detail |
|---|---|---|
| Onboarding & KYC | ||
| 📞 Sign Up via OTP | Register with phone number, verified by SMS code | MSG91 OTP flow — same auth system as rider |
| 🏢 Organisation Code | Driver links to a fleet operator using a short alphanumeric code | Short code lookup against organisation table on registration |
| 📄 KYC Document Upload | Upload licence, Aadhaar, vehicle RC, insurance, and profile photo | Multipart upload to S3-compatible storage; file type + size validation |
| 🔄 KYC Status Screen | Driver sees live status: Pending / Approved / Rejected with reason | KYC state machine in backend; push notification on every status change |
| 🔁 Re-upload Rejected Docs | If a document is rejected, driver can upload a corrected version | Document version history stored; admin views all versions side by side |
| Availability & Ride Handling | ||
| 🟢 Online / Offline Toggle | Driver switches availability with one tap; auto goes offline after configurable inactivity | Updates Redis presence key; location broadcast starts/stops; background inactivity timer auto-sets offline after X minutes with no movement |
| 🔔 Ride Request Popup | Incoming request shows rider pickup, destination, fare, and distance to pickup | Socket.io push with 30s accept window; auto-reject on timeout → dispatch to next driver |
| ✅ Accept / Reject | Tap Accept to take the ride; Reject to pass with optional reason | Accept/reject events logged for performance reporting in admin |
| 🗺 Navigation to Pickup | Tap to open turn-by-turn navigation to the rider's location | Deep-link to Google Maps / Apple Maps with pickup coordinates |
| 🎯 Trip Controls | Tap to mark: Arrived → Enter OTP → Start Trip → End Trip | Each action triggers Socket.io event + DB state transition; OTP verified server-side before trip starts |
| ⏳ Waiting Time Logging | Timer starts when driver marks Arrived; excess waiting added to fare | Server-side timer; waiting charges applied per pricing config after free window |
| 📅 Scheduled Rides List | View upcoming pre-booked rides assigned to them | Upcoming rides sorted by time, reminder push X minutes before pickup |
| 💬 In-App Chat — Driver ↔ Rider | Message the rider without leaving the app | Same Socket.io room per trip ID — bidirectional |
| 💬 In-App Chat — Driver ↔ Support | Contact admin/support team directly from the driver app | Separate support chat room; admin panel shows all open driver threads alongside rider threads |
| 🗺 Outstation Mode | Driver receives and navigates outstation (intercity) trip requests with full route and allowance details | Outstation trip type flag; driver sees per-km rate, night halt rules, return schedule; allowance auto-credited on completion |
| Earnings, Performance & Payouts | ||
| � Cash Collection Tracker | Driver sees exactly how much cash they owe the company from cash trips | Cash-collected ledger separate from online earnings; outstanding payable-to-company balance shown on home screen; settlement options available |
| �� Earnings Dashboard | Today / this week / this month earnings at a glance | Aggregated earnings API — gross fare, platform commission, net payout breakdown |
| 📊 Acceptance & Cancellation Rate | Driver sees their own performance metrics | Computed from trip events; displayed as percentage with trend indicator |
| 🎯 Incentive / Bonus Tracker | Progress bar showing how close driver is to earning a bonus | Admin-defined incentive rules; progress computed and returned from backend in real time |
| 🏦 Payout Request | Driver requests a withdrawal of their earned balance | Payout request → admin approval → Razorpay Payouts API bank transfer |
| 🗺 Demand Heatmap | Map overlay showing which areas currently have the most ride demand | Aggregated ride request density rendered as heatmap layer on driver's map |
| 🔔 Document Expiry Alerts | Driver gets push notifications before licence, insurance, or PUC is about to expire | Cron job checks document expiry dates; FCM push at 30, 15, and 7 days before expiry; driver blocked from going online once expired |
| 🔐 Profile Edit Restrictions | Driver cannot self-edit name, phone, or email after activation — only an admin can change these | Sensitive fields read-only in driver app after KYC approval; edit APIs for these fields restricted to admin role JWT |
| 🆘 SOS for Driver | One-tap emergency button for driver-side incidents — alerts admin and shares live location | Same SOS mechanism as rider; triggers admin SOS console alert + SMS to configured emergency contacts |
The existing live app is built on Flutter + Node.js. All user and operational data must be migrated to the new platform with zero data loss.
Migration of all live data from the existing platform is a hard requirement — not optional. This includes complete ride history, rider accounts, and driver profiles. Wallet balances are not carried over — all wallets start fresh on the new platform. The existing app uses the same core stack (Flutter + Node.js), which significantly reduces migration complexity.
| Data Set | What Gets Migrated | Notes |
|---|---|---|
| 👥 Rider Accounts | All registered riders | Profile data, saved addresses, referral history — wallet balance not carried over |
| 🚗 Driver Profiles | All registered drivers | Profile, KYC documents, vehicle info, earnings history, ratings |
| 📋 Ride History | Complete historical trips | All past rides with fare breakdown, route data, timestamps, payment records |
| 💳 Wallet Balances | Not migrated — wallets start fresh | Existing balances are not carried over; new wallet ledger starts at zero on the new platform |
| 🏢 Organisations / Fleets | Fleet operator accounts | Organisation codes, linked drivers, fleet metadata |
| 🗺 Geo & Zone Config | Existing service zones and pricing | Geofences and fare configs mapped to new schema |
Upon project completion, 100% of the source code — all Flutter apps, Node.js backend, admin panel, database schemas, CI/CD configs, and infrastructure scripts — must be handed over and registered in the client's name. No vendor lock-in, no proprietary dependencies, no withheld repositories. The client must have full admin access to all code repositories, cloud accounts, and app store listings from day one of launch.
The development company must provide 6 months of free bug-fix support post-launch. This covers any defects, regressions, or functional issues arising from the delivered code. Scope: bug fixes only — not new features or change requests. Response SLA and escalation process to be agreed before contract signing.
Express / NestJS · PostgreSQL + PostGIS · Redis · Socket.io
RESTful API + Socket.io server. JWT auth with refresh token rotation. PostGIS ST_DWithin for proximity-based driver matching. Redis pub/sub for cross-instance real-time events (multi-server safe). Razorpay webhook handler. FCM Admin SDK for server-triggered push. Role-based middleware (rider / driver / admin / sub-admin).
The brain of the whole platform. Every tap in either app sends a request here. It matches riders with the nearest available driver, calculates fares, handles payments, and pushes live updates to everyone. Designed to scale horizontally as the platform grows.
| API / Service | Plain English | Technical Detail |
|---|---|---|
| Auth & Users | ||
| 🔐 Auth APIs | Register, login, OTP verify, social sign-in, forgot password | JWT + refresh rotation, bcrypt, MSG91 OTP, Google/Apple OAuth via Firebase |
| 👤 Profile APIs | Get and update rider/driver profiles and saved addresses | CRUD endpoints; address book stored per user in DB |
| 📄 KYC Upload & Status | Driver submits docs → admin approves/rejects → driver is notified | Multipart upload to S3-compatible storage; KYC state machine; push on every status change |
| Ride Lifecycle | ||
| 💰 Fare Estimate API | Return a full fare estimate before the rider confirms booking | All pricing params applied; Google Distance Matrix for route distance + time |
| 📌 Book Ride | Create a ride: instant / scheduled / rental / return trip | POST /rides — type-specific validation, geofence surge check, driver dispatch triggered |
| 🎯 Driver Matching Engine | Find nearest available driver and send them the request | PostGIS ST_DWithin, filter by vehicle category + online status; sequential dispatch with configurable timeout |
| 🔄 Trip State Machine | Manage every step from request to completion | States: Requested → Accepted → En Route → Arrived → In Progress → Completed / Cancelled |
| 📋 Receipt Generation | Itemised fare breakdown delivered to rider on completion | Line-item JSON: base, distance tiers, time tiers, waiting, surge, toll, tax, tip, promo deduction |
| ❌ Cancellation Handler | Applies the correct cancellation charge based on timing and context | Checks cancel_threshold_distance, driver arrival time; charges rider or driver accordingly |
| Real-Time (Socket.io) | ||
| 📡 Location Broadcast | Driver location pushed live to the rider's map | Driver emits coords every 3s → server → rider Socket room via Redis pub/sub (multi-instance safe) |
| 💬 In-Trip Chat | Messages between rider and driver during the trip | Socket.io room per trip ID; messages persisted in DB for support reference |
| 🖥 Admin Live Room | Admin dashboard sees all active rides and drivers live on a map | Admin joins global Socket room; receives all driver location events in real time |
| Payments & Notifications | ||
| 💳 Razorpay Integration | Collect rider payments; process driver payouts to bank | Order create → capture → webhook; commission split logic; Razorpay Payouts API for driver transfers |
| 💵 Wallet Service | Rider wallet top-up and atomic deduction on trip end | Ledger table in DB; Razorpay order for top-up; DB transaction for atomic debit |
| 🔔 Notification Service | Push, SMS, and email at every key event across all user types | FCM Admin SDK (push), MSG91 (SMS + transactional email); configurable templates; admin broadcast endpoint |
| 📊 Analytics Aggregates | Revenue, ride counts, cancellations — queryable by date and zone | Aggregation queries + Redis cache for dashboard; CSV export endpoints; driver performance metrics |
All parameters are configurable per vehicle category from the Admin Panel — no code changes needed to adjust pricing. The backend applies all relevant parameters at booking and returns a full line-item receipt.
Tiered distance + tiered time pricing with independent thresholds. Waiting, no-show, cancellation, pickup zone, night, and scheduled surcharges. Surge multiplier overlaid from geofence check. All computed server-side, receipt returned as line-item JSON.
Think of this as a fully programmable fare meter. The ops team sets all rates from the admin panel — different rates for short vs long trips, extra charges for waiting, night rides, cancellations. The system calculates everything automatically, no human intervention needed per trip.
| Parameter | Description | Category |
|---|---|---|
| Base & Distance | ||
| base_fare | Fixed charge applied to every ride regardless of distance | Base |
| minimum_fare | Minimum total — rider always pays at least this amount | Base |
| threshold_distance_1 | End of first distance pricing bracket (km) | Distance |
| fare_per_km_tier_1 | Rate applied from 0 km to threshold_distance_1 | Distance |
| threshold_distance_2 | End of second distance pricing bracket (km) | Distance |
| fare_per_km_tier_2 | Rate from threshold_1 to threshold_distance_2 | Distance |
| fare_per_km_beyond | Rate per km for any distance beyond threshold_distance_2 | Distance |
| Time & Waiting | ||
| threshold_time_1 | End of first time bracket (minutes) | Time |
| fare_per_minute_tier_1 | Per-minute rate from 0 to threshold_time_1 | Time |
| threshold_time_2 | End of second time bracket (minutes) | Time |
| fare_per_minute_tier_2 | Per-minute rate from threshold_1 to threshold_time_2 | Time |
| fare_per_minute_beyond | Rate per minute beyond threshold_time_2 | Time |
| threshold_waiting_time | Free waiting window before charges start (minutes) | Waiting |
| fare_per_waiting_minute | Charge per minute after the free waiting window expires | Waiting |
| No-Show & Cancellation | ||
| no_show_threshold_minutes | Minutes after driver arrival before no-show penalty applies | No-Show |
| no_show_charges_per_minute | Per-minute penalty charge during no-show window | No-Show |
| cancellation_charges | Flat fee if rider cancels before driver has travelled far | Cancellation |
| cancel_threshold_distance | Minimum distance driver must travel before cancellation fee applies | Cancellation |
| cancellation_charges_after_arrival | Higher flat fee if rider cancels after driver has arrived | Cancellation |
| Pickup Zone, Night & Tax | ||
| pickup_charge_before_threshold | Pickup surcharge for short-range pickup zones | Pickup Zone |
| pickup_charge_after_threshold | Pickup surcharge for longer-range pickup zones | Pickup Zone |
| schedule_ride_fare | Additional charge or multiplier for pre-scheduled rides | Scheduled |
| driver_allowance_hours | Hours threshold after which driver receives a daily allowance | Driver Cost |
| driver_allowance_amount | Fixed allowance amount paid to driver after threshold hours | Driver Cost |
| night_time_charges | Flat or percentage surcharge applied during night hours | Night |
| night_time_start / end | Configurable night window (e.g. 22:00 – 06:00) | Night |
| tax_percentage | GST / tax percentage applied to the final calculated fare | Tax |
Next.js + TypeScript · Web dashboard for operations, fleet management, finance, and settings
Next.js SSR dashboard consuming the same Node.js APIs. Socket.io client for live ride tracking. Role-based sidebar (admin vs sub-admin). Recharts for analytics charts. Google Maps JS API for geofence drawing (polygon/circle) and demand heatmap layer.
The control room — accessible from any browser. The ops team manages drivers, approves KYC docs, watches all live rides on a map, sets pricing, manages payouts, and sends notifications. No technical knowledge needed for day-to-day operations.
| Feature | Plain English | Technical Detail |
|---|---|---|
| Dashboard & Live Map | ||
| 📊 KPI Overview | Revenue, rides, active drivers, new users — all at a glance with trends | Aggregated API with date filters; trend vs previous period calculated server-side |
| 🗺 Live Ride Map | All active rides and online drivers visible on a live updating map | Socket.io admin room + Google Maps JS API; driver markers animate in real time |
| 🔥 Demand Heatmap | Visual map layer showing hotspot areas with high ride demand | Google Maps Heatmap layer; data from ride request density aggregation query |
| User & Driver Management | ||
| 👥 Rider Management | Search, view, edit, suspend, or delete rider accounts | Full CRUD; filter by status / date; ride history and wallet balance inline |
| 🚗 Driver Management | View all drivers, their status, KYC state, and performance | Driver list with filters; inline KYC doc viewer; performance stats per driver |
| 📄 KYC Review | View uploaded documents and approve or reject with a written reason | Document viewer with version history; approval/rejection triggers push notification to driver |
| 🏢 Organisation / Fleet Management | Create organisations; assign drivers; view fleet-level stats | Organisation CRUD; short code generation; fleet aggregated earnings and trip counts |
| Ride & Trip Management | ||
| 📋 All Rides Log | Full searchable history of every trip on the platform | Paginated trips table; filter by date, zone, status, driver, rider; CSV export |
| 🔍 Live Ride Detail | Click any active ride to see full details and live map position | Trip detail modal with real-time location, state timeline, chat log, fare breakdown |
| ⚡ Manual Dispatch | Manually assign a driver to a ride when automatic matching fails | Admin override endpoint; bypasses normal dispatch queue |
| Pricing, Zones & Surge | ||
| 💰 Fare Configuration | Set all 27 pricing parameters per vehicle category | Admin UI form saving to pricing_config table; changes apply to new bookings immediately |
| 🗺 Geofence Manager | Draw zones on a map to define service areas, surge zones, or restricted areas | Google Maps Drawing Manager; polygon/circle saved as GeoJSON; used in PostGIS zone checks |
| ⚡ Surge Zone Control | Set a surge multiplier for any zone — turn on/off manually or by schedule | Surge config per geofence zone; multiplier applied at fare estimate time |
| 🏙 Multi-City Support | Run the platform across multiple cities, each with independent pricing | City entity with its own fare configs, geofences, and service zones |
| Finance & Payouts | ||
| 💳 Payment Transactions | Full log of all payments — collections, refunds, wallet top-ups | Transactions table with Razorpay order/payment IDs; filter and export |
| 🏦 Driver Payout Requests | Review and approve driver withdrawal requests | Payout queue; approve triggers Razorpay Payouts API transfer to driver's bank |
| 📈 Revenue Reports | Revenue by date range, city, vehicle type, or driver | Aggregated query + Recharts visualisation; CSV export |
| Driver Wallet Ledger | Full per-driver financial ledger — deposits, commissions, cash collected, payouts, bonuses | Ledger table per driver; detailed drill-down per transaction type; settlement reconciliation view |
| 💰 Customer Dues Management | Flag riders with outstanding unpaid balances; their new bookings are blocked until cleared | Debt ledger per rider; booking API checks for open debt before creating a new ride; admin can clear or waive dues |
| 🔄 Manual Refunds | Issue a refund to the rider’s original payment method or wallet, with a mandatory reason | Refund endpoint calls Razorpay refund API or credits wallet; reason + admin ID logged immutably |
| GST Reports | Tax-ready reports for the accountant — GSTR-1 / GSTR-3B prep, invoice register | GST-aggregated query by period and city; CSV/Excel export with HSN/SAC, taxable value, CGST, SGST columns |
| Promotions & Communications | ||
| 🏷 Promo Code Manager | Create, edit, enable, or disable promo codes | Code CRUD; flat / percentage discount; per-user limits, expiry dates, min fare conditions |
| 🎫 Coupon Manager | Manage auto-apply coupons and eligibility rules | Coupon entity with ride conditions; stacking rules; campaign-linked coupons |
| 🎯 Incentive / Bonus Rules | Create driver bonus programs (e.g. 20 rides this week = ₹500 bonus) | Incentive rule engine; progress computed per driver; bonus credited to wallet on achievement |
| 📣 Broadcast Notifications | Send push / SMS messages to all riders, all drivers, or a filtered segment | FCM topic messaging + MSG91 bulk SMS; segment filters by city, status, last active date |
| 🏷 Referral Code Management | View, create, edit, or delete referral codes per city | Referral code CRUD scoped per city; reward config (amount, cap per user); usage analytics |
| Settings & Access Control | ||
| 👤 Sub-Admin Roles | Create staff accounts with limited access (e.g. support can view but not edit pricing) | Role-based access control; permission matrix per module; JWT role claim |
| 🚗 Vehicle Category Manager | Add/edit vehicle types (Mini, Sedan, SUV, etc.) with icons and seating info | Category CRUD; linked to fare config and driver app vehicle selector |
| ⚙️ App Config | Set global settings — commission %, cancellation rules, OTP expiry, etc. | Key-value config table; cached in Redis; invalidated on update |
| 🔐 Two-Factor Authentication (2FA) | Admin and sub-admin logins require a second verification step | TOTP (Google Authenticator) or SMS OTP as second factor; mandatory for all admin roles; backup codes generated on setup |
| 💬 Support Chat Console | Admin can chat with riders and drivers directly from the panel | Unified inbox showing all open rider ↔ support and driver ↔ support threads; Socket.io; assignable to sub-admin agents |
Focused ops interface — live map, manual bookings, customer call workflow, and issue resolution
Subset of the Admin Panel optimised for live ops agents. Same Next.js app, separate role-gated route. Socket.io client for live map. All dispatch and override actions write to the same backend with full audit trail. CTI integration hooks into incoming call system to auto-pull customer profile.
The screen ops agents use all day to handle phone calls, manually book rides, reassign drivers, and resolve mid-ride issues. Fast, focused, no clutter. When a customer calls in, their profile and ride history auto-appears.
| Feature | Plain English | Technical Detail |
|---|---|---|
| Live Operations | ||
| 🗺 Live Map | All online drivers and active rides on one map with filters | Socket.io admin room; filter by vehicle type, status, geofence; driver cards show ETA + current status |
| 🔍 Ride Detail Drill-Down | Click any active ride to see full route, fare, state timeline, and chat log | Trip detail panel with polyline, fare breakdown, state history, payment status |
| 🚨 SOS Console | All SOS alerts in one queue — one tap to call the rider, alert emergency contacts, or share live location | SOS events pushed to dispatcher room via Socket.io; response actions logged with timestamp and agent ID |
| Manual Dispatch | ||
| 📞 Manual City Booking | Agent creates a city ride on behalf of a customer and assigns a driver manually or lets the system auto-match | Booking API with dispatcher role flag; driver-picker shows nearby drivers with ETA + rating; geofence rules enforced |
| 🛣 Manual Rental & Outstation Booking | Same manual booking flow available for hourly rentals and intercity outstation rides | Ride type flag passed to booking API; fixed-fare option available for negotiated trips |
| ⚡ Re-assign Driver | Swap the assigned driver on any active or upcoming ride | Override endpoint; previous driver notified; new driver gets Socket.io request; audit log entry created |
| 💲 Fare Override | Dispatcher can manually set a fixed fare for a negotiated trip | Override requires senior-role permission; reason mandatory; logged with dispatcher ID and timestamp |
| Customer Call Workflow | ||
| 📞 Auto-Pull Customer Profile | When a customer calls in, their profile and last few rides appear automatically | CTI integration hooks on incoming call event; phone number lookup pulls customer record + ride history |
| 💬 Live Chat with Driver | Dispatcher can message a driver in real time from the panel | Admin-to-driver Socket.io channel; messages logged; driver sees message as in-app notification |
| Issue Resolution | ||
| 🔄 Cancel & Re-dispatch | Cancel a ride on behalf of a rider and immediately trigger a new driver search | Cancel with reason code; dispatcher cancellations exempt from cancellation fee; re-dispatch triggered automatically |
| 💵 Issue Refund / Adjust Fare | Refund to original payment method or wallet; adjust fare with a reason | Refund API with mandatory reason + agent ID; fare adjustment creates correction ledger entry; all logged for audit |
| 🎫 Issue Coupon | Send a one-time coupon to a rider as compensation for a bad experience | One-time coupon generated and linked to rider ID; reason + dispatcher ID stored |
| 🗓 Scheduled Ride Board | All upcoming pre-booked rides in a timeline view; reassign if assigned driver cancels | Sorted by pickup time; filter by city and vehicle type; manual reassignment available for any upcoming ride |
The recommended setup below is a starting point. The team may propose alternatives based on performance requirements, familiarity, or cost optimisation — all options are flexible as long as they meet reliability and scalability needs.
| Area | Recommended Solution | Notes |
|---|---|---|
| ☁️ Hosting | DigitalOcean VPS / App Platform | Or AWS EC2, Hetzner — team to propose best fit |
| 🔀 Load Balancer | Nginx / DO Load Balancer | Required for multi-instance Socket.io with Redis adapter |
| 📦 Containerisation | Docker + Docker Compose | Local dev parity; production via Docker or managed services |
| 🔁 CI/CD | GitHub Actions | Auto-deploy on merge to main; run tests before deploy |
| 🗄 Database Backups | Automated daily snapshots | Point-in-time recovery; retention policy configurable |
| 📦 File Storage | S3-compatible (R2 / S3 / DO Spaces) | KYC docs, profile photos — team to select based on cost and region |
| 📊 Monitoring | Uptime monitoring + error alerting | Sentry for error tracking; Uptime Robot or Better Uptime for availability |
| 🔐 SSL / TLS | Let's Encrypt via Certbot / Nginx | Auto-renewing certificates on all endpoints |
| 📱 App Distribution | Google Play + Apple App Store | Standard store release pipeline; TestFlight for iOS beta |
Everything below is part of this build scope.
Ride-Hailing Platform · Product Requirements Document · v1.0 · June 2026
Confidential