🔒

Access Required

Enter the access code to continue.

Product Requirements Document
Ride-Hailing
Platform Rebuild
Full-stack mobile + web platform. UI/UX reference: Figma designs provided and cover all screens.
📱Flutter Rider App
🚗Flutter Driver App
⚙️Node.js Backend
🖥React Admin Panel
☁️Cloud Infrastructure
Document Type
PRD / RFQ
Version
1.0 · June 2026
Mobile
Flutter · Android + iOS
Backend
Node.js · PostgreSQL
Project Overview

What We Are Building

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.

⌨ Technical View

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.

💬 Plain English

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.

Confirmed Stack

Technology Stack

ComponentTechnologyNotes
📱 Mobile AppsFlutter 3.xSingle codebase — Android & iOS
🖥 Admin PanelReact 18 / Next.js + TypeScriptWeb dashboard, SSR-ready
⚙️ BackendNode.js — Express or NestJSREST + WebSocket (team may propose preferred)
🗄 Primary DBPostgreSQL + PostGISRelational + geospatial query support
⚡ Cache / RealtimeRedisPub/sub for live events, session & rate-limit cache
🗺 MapsGoogle Maps PlatformSDK, Geocoding, Directions, Autocomplete, Heatmap
💳 PaymentsRazorpayUPI, Cards, Netbanking, Wallets + Payouts API
☁️ InfrastructureCloud VPS (DigitalOcean preferred)Team may propose alternatives based on performance needs
💬 SMS / OTP / EmailMSG91Client has existing account — credentials provided
🔔 Push NotificationsFirebase FCMAndroid + iOS push
🔐 Social LoginGoogle (Android) · Apple (iOS)via Firebase Auth
📦 File StorageS3-compatible cloud storageKYC docs, profile photos — R2 / S3 / DO Spaces, team to decide best fit
📱
Module 01

Flutter Rider App

Android + iOS · Customer-facing app for booking, tracking, and paying for rides

⌨ Technical

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.

💬 Plain English

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.

FeaturePlain EnglishTechnical Detail
Onboarding & Auth
📞 Mobile OTP LoginEnter phone number → receive SMS code → log inMSG91 OTP API, 6-digit code, 5-min expiry, rate-limited
📧 Email + PasswordStandard email login with forgot-password reset flowJWT + bcrypt, reset link via MSG91/email
🔵 Google Sign InOne-tap login with Google account (Android primary)Firebase Auth — Google OAuth 2.0
🍎 Apple Sign InOne-tap login with Apple ID (iOS primary)Firebase Auth — Sign in with Apple (required for iOS)
Map & Booking
🗺 Live Map Home ScreenApp opens to a map showing nearby available drivers as pinsGoogle Maps Flutter SDK + real-time driver locations via Socket.io
🔍 Location Search & AutocompleteType a destination — smart suggestions appear instantlyGoogle Places Autocomplete API, reverse geocoding for current location
🏠 Saved AddressesSave Home, Work, and custom locations for quick re-bookingUser address book in DB, auto-fill on booking screen
⚡ Instant RideBook a cab right now — nearest driver gets the requestPostGIS nearest-driver query, sequential dispatch via Socket.io with timeout
📅 Scheduled RideBook a cab for a specific future date and timeCron-based pre-assignment, admin-configurable advance lead time
⏱ Car Rental (Hourly)Book a car for a set number of hours and kilometresPackages configured in admin; fare recalculated at trip end on actual KM + wait time
🔄 Return TripAdd a return journey at booking — both legs quoted togetherDual-leg booking, toll itemised per leg, waiting charges applied independently
🛣 Outstation RideBook a one-way or round-trip intercity cab — e.g. Ludhiana to DelhiPer-km outstation pricing, driver allowance, night halt charges, mandatory return time for round-trips, tolls counted both ways
📍 Multiple StopsAdd intermediate stops during a trip — driver navigates each one in orderSequential waypoints passed to Google Directions API; per-stop wait time tracked and added to fare
⚡ Surge WarningRider sees a surge multiplier and must confirm before bookingGeofence zone check at booking time, multiplier applied, rider acknowledgement required
🚗 Vehicle Category SelectionChoose 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 priceAdmin-configured fixed-price routes (e.g. Airport → Chandigarh, Delhi, Noida, Amritsar); bypasses dynamic fare engine; shown as prominent cards on rider home screen
💰 Fare EstimateFare shown before confirming — no surprises at the endServer-side fare calculation using all pricing parameters, returned before booking confirmation
Live Tracking & Trip
� Trip OTPA 4-digit code is shown on the rider's screen — driver must enter it to start the ride, preventing wrong-passenger pickupsOTP generated server-side on driver arrival event; verified by driver before state transitions to In Progress
� Real-Time Driver TrackingDriver's location updates live on the rider's mapSocket.io location events driver → server → rider room, smooth marker animation in Flutter
🔄 Trip Status UpdatesStep-by-step: Assigned → On the Way → Arrived → Started → DoneSocket.io event per state transition, FCM push notification as fallback
📞 Masked Call to DriverCall the driver without revealing either person's real numberExotel / MSG91 Voice masked calling integration
💬 In-App Chat — Rider ↔ DriverMessage the driver during the trip without leaving the appSocket.io room per trip ID; messages persisted in DB; quick-reply suggestions
💬 In-App Chat — Rider ↔ SupportContact customer support directly from the app at any timeSeparate support Socket.io/chat room; admin panel shows all open customer threads
🛣 Route on MapFull route drawn from pickup to drop while ridingGoogle Directions API polyline overlay on the Flutter map
Payments, Safety & Post-Trip
� Cash PaymentRider pays driver in cash at trip end — no app action neededRider selects Cash at booking; trip completes normally; fare recorded in DB without payment gateway call
� Save Payment MethodsSave a card or UPI ID for one-tap payment next timeRazorpay tokenisation — PAN never stored on platform; tokens linked to user ID; selectable at checkout
🔁 Payment RetryIf payment fails, rider gets a retry window before the ride is marked as unpaid5-minute retry window after failure; after expiry, ride marked as debt — new bookings blocked until cleared
� Pay by QR CodeAt trip end, a QR code appears on the driver's phone — rider scans it and pays; status auto-updatesDriver app generates a Razorpay dynamic QR (UPI intent link); payment webhook updates trip status to Paid in real time via Socket.io
�� Online PaymentPay via UPI, card, wallet, or netbankingRazorpay Flutter SDK — order create → payment → capture → webhook verify
💵 In-App WalletTop up balance; auto-deducted when trip completesWallet ledger in DB, Razorpay top-up, atomic deduction on completion
🆘 SOS ButtonOne tap sends live location to saved emergency contactsEmergency contacts in user profile, SMS + shareable link triggered instantly
🔗 Share Live TripSend a link so someone else can watch the trip liveToken-based public tracking URL, auto-expires on trip completion
⭐ Rate Driver1–5 star rating + optional comment after every tripRating stored per trip, feeds into driver performance score in admin
📋 Ride History & ReceiptsFull list of past rides with itemised fare breakdownPaginated history API, receipt with all line items (base, distance, time, tax, etc.)
🧾 GST InvoiceA GST-compliant PDF invoice is auto-emailed after every completed trip and downloadable from ride historyInvoice generated server-side on trip completion; includes HSN/SAC, GSTIN, tax breakup; PDF stored in S3 and emailed via MSG91
💸 Tip DriverOptionally add a tip after the trip ends — 100% goes directly to the driverPost-trip tip screen; tip amount added to driver earnings ledger; not included in platform commission calculation
👥 Refer & EarnShare your code — both you and your friend get wallet creditReferral code generation; credit applied on new user's first completed ride
🏷 Promo CodesEnter a code at checkout for a discountCode validation API; types: flat / percentage; per-user and total usage limits
🎫 CouponsAuto-apply or select available coupons at checkoutCoupon eligibility check at fare stage; stacking rules configurable in admin
🚗
Module 02

Flutter Driver App

Android + iOS · Driver-facing app for accepting rides, navigation, and tracking earnings

⌨ Technical

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.

💬 Plain English

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.

FeaturePlain EnglishTechnical Detail
Onboarding & KYC
📞 Sign Up via OTPRegister with phone number, verified by SMS codeMSG91 OTP flow — same auth system as rider
🏢 Organisation CodeDriver links to a fleet operator using a short alphanumeric codeShort code lookup against organisation table on registration
📄 KYC Document UploadUpload licence, Aadhaar, vehicle RC, insurance, and profile photoMultipart upload to S3-compatible storage; file type + size validation
🔄 KYC Status ScreenDriver sees live status: Pending / Approved / Rejected with reasonKYC state machine in backend; push notification on every status change
🔁 Re-upload Rejected DocsIf a document is rejected, driver can upload a corrected versionDocument version history stored; admin views all versions side by side
Availability & Ride Handling
🟢 Online / Offline ToggleDriver switches availability with one tap; auto goes offline after configurable inactivityUpdates Redis presence key; location broadcast starts/stops; background inactivity timer auto-sets offline after X minutes with no movement
🔔 Ride Request PopupIncoming request shows rider pickup, destination, fare, and distance to pickupSocket.io push with 30s accept window; auto-reject on timeout → dispatch to next driver
✅ Accept / RejectTap Accept to take the ride; Reject to pass with optional reasonAccept/reject events logged for performance reporting in admin
🗺 Navigation to PickupTap to open turn-by-turn navigation to the rider's locationDeep-link to Google Maps / Apple Maps with pickup coordinates
🎯 Trip ControlsTap to mark: Arrived → Enter OTP → Start Trip → End TripEach action triggers Socket.io event + DB state transition; OTP verified server-side before trip starts
⏳ Waiting Time LoggingTimer starts when driver marks Arrived; excess waiting added to fareServer-side timer; waiting charges applied per pricing config after free window
📅 Scheduled Rides ListView upcoming pre-booked rides assigned to themUpcoming rides sorted by time, reminder push X minutes before pickup
💬 In-App Chat — Driver ↔ RiderMessage the rider without leaving the appSame Socket.io room per trip ID — bidirectional
💬 In-App Chat — Driver ↔ SupportContact admin/support team directly from the driver appSeparate support chat room; admin panel shows all open driver threads alongside rider threads
🗺 Outstation ModeDriver receives and navigates outstation (intercity) trip requests with full route and allowance detailsOutstation trip type flag; driver sees per-km rate, night halt rules, return schedule; allowance auto-credited on completion
Earnings, Performance & Payouts
� Cash Collection TrackerDriver sees exactly how much cash they owe the company from cash tripsCash-collected ledger separate from online earnings; outstanding payable-to-company balance shown on home screen; settlement options available
�� Earnings DashboardToday / this week / this month earnings at a glanceAggregated earnings API — gross fare, platform commission, net payout breakdown
📊 Acceptance & Cancellation RateDriver sees their own performance metricsComputed from trip events; displayed as percentage with trend indicator
🎯 Incentive / Bonus TrackerProgress bar showing how close driver is to earning a bonusAdmin-defined incentive rules; progress computed and returned from backend in real time
🏦 Payout RequestDriver requests a withdrawal of their earned balancePayout request → admin approval → Razorpay Payouts API bank transfer
🗺 Demand HeatmapMap overlay showing which areas currently have the most ride demandAggregated ride request density rendered as heatmap layer on driver's map
🔔 Document Expiry AlertsDriver gets push notifications before licence, insurance, or PUC is about to expireCron job checks document expiry dates; FCM push at 30, 15, and 7 days before expiry; driver blocked from going online once expired
🔐 Profile Edit RestrictionsDriver cannot self-edit name, phone, or email after activation — only an admin can change theseSensitive fields read-only in driver app after KYC approval; edit APIs for these fields restricted to admin role JWT
🆘 SOS for DriverOne-tap emergency button for driver-side incidents — alerts admin and shares live locationSame SOS mechanism as rider; triggers admin SOS console alert + SMS to configured emergency contacts
Data Migration

Migration from Existing Platform

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.

🔴 Critical Requirement

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 SetWhat Gets MigratedNotes
👥 Rider AccountsAll registered ridersProfile data, saved addresses, referral history — wallet balance not carried over
🚗 Driver ProfilesAll registered driversProfile, KYC documents, vehicle info, earnings history, ratings
📋 Ride HistoryComplete historical tripsAll past rides with fare breakdown, route data, timestamps, payment records
💳 Wallet BalancesNot migrated — wallets start freshExisting balances are not carried over; new wallet ledger starts at zero on the new platform
🏢 Organisations / FleetsFleet operator accountsOrganisation codes, linked drivers, fleet metadata
🗺 Geo & Zone ConfigExisting service zones and pricingGeofences and fare configs mapped to new schema
Ownership & Support

Code Ownership & Post-Launch Support

🔴 Full Code Ownership — Non-Negotiable

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.

🟡 6-Month Bug Support — Mandatory

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.

⚙️
Module 03

Node.js Backend & APIs

Express / NestJS · PostgreSQL + PostGIS · Redis · Socket.io

⌨ Technical

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).

💬 Plain English

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 / ServicePlain EnglishTechnical Detail
Auth & Users
🔐 Auth APIsRegister, login, OTP verify, social sign-in, forgot passwordJWT + refresh rotation, bcrypt, MSG91 OTP, Google/Apple OAuth via Firebase
👤 Profile APIsGet and update rider/driver profiles and saved addressesCRUD endpoints; address book stored per user in DB
📄 KYC Upload & StatusDriver submits docs → admin approves/rejects → driver is notifiedMultipart upload to S3-compatible storage; KYC state machine; push on every status change
Ride Lifecycle
💰 Fare Estimate APIReturn a full fare estimate before the rider confirms bookingAll pricing params applied; Google Distance Matrix for route distance + time
📌 Book RideCreate a ride: instant / scheduled / rental / return tripPOST /rides — type-specific validation, geofence surge check, driver dispatch triggered
🎯 Driver Matching EngineFind nearest available driver and send them the requestPostGIS ST_DWithin, filter by vehicle category + online status; sequential dispatch with configurable timeout
🔄 Trip State MachineManage every step from request to completionStates: Requested → Accepted → En Route → Arrived → In Progress → Completed / Cancelled
📋 Receipt GenerationItemised fare breakdown delivered to rider on completionLine-item JSON: base, distance tiers, time tiers, waiting, surge, toll, tax, tip, promo deduction
❌ Cancellation HandlerApplies the correct cancellation charge based on timing and contextChecks cancel_threshold_distance, driver arrival time; charges rider or driver accordingly
Real-Time (Socket.io)
📡 Location BroadcastDriver location pushed live to the rider's mapDriver emits coords every 3s → server → rider Socket room via Redis pub/sub (multi-instance safe)
💬 In-Trip ChatMessages between rider and driver during the tripSocket.io room per trip ID; messages persisted in DB for support reference
🖥 Admin Live RoomAdmin dashboard sees all active rides and drivers live on a mapAdmin joins global Socket room; receives all driver location events in real time
Payments & Notifications
💳 Razorpay IntegrationCollect rider payments; process driver payouts to bankOrder create → capture → webhook; commission split logic; Razorpay Payouts API for driver transfers
💵 Wallet ServiceRider wallet top-up and atomic deduction on trip endLedger table in DB; Razorpay order for top-up; DB transaction for atomic debit
🔔 Notification ServicePush, SMS, and email at every key event across all user typesFCM Admin SDK (push), MSG91 (SMS + transactional email); configurable templates; admin broadcast endpoint
📊 Analytics AggregatesRevenue, ride counts, cancellations — queryable by date and zoneAggregation queries + Redis cache for dashboard; CSV export endpoints; driver performance metrics
Fare Engine

Pricing Configuration

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.

⌨ Technical

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.

💬 Plain English

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.

ParameterDescriptionCategory
Base & Distance
base_fareFixed charge applied to every ride regardless of distanceBase
minimum_fareMinimum total — rider always pays at least this amountBase
threshold_distance_1End of first distance pricing bracket (km)Distance
fare_per_km_tier_1Rate applied from 0 km to threshold_distance_1Distance
threshold_distance_2End of second distance pricing bracket (km)Distance
fare_per_km_tier_2Rate from threshold_1 to threshold_distance_2Distance
fare_per_km_beyondRate per km for any distance beyond threshold_distance_2Distance
Time & Waiting
threshold_time_1End of first time bracket (minutes)Time
fare_per_minute_tier_1Per-minute rate from 0 to threshold_time_1Time
threshold_time_2End of second time bracket (minutes)Time
fare_per_minute_tier_2Per-minute rate from threshold_1 to threshold_time_2Time
fare_per_minute_beyondRate per minute beyond threshold_time_2Time
threshold_waiting_timeFree waiting window before charges start (minutes)Waiting
fare_per_waiting_minuteCharge per minute after the free waiting window expiresWaiting
No-Show & Cancellation
no_show_threshold_minutesMinutes after driver arrival before no-show penalty appliesNo-Show
no_show_charges_per_minutePer-minute penalty charge during no-show windowNo-Show
cancellation_chargesFlat fee if rider cancels before driver has travelled farCancellation
cancel_threshold_distanceMinimum distance driver must travel before cancellation fee appliesCancellation
cancellation_charges_after_arrivalHigher flat fee if rider cancels after driver has arrivedCancellation
Pickup Zone, Night & Tax
pickup_charge_before_thresholdPickup surcharge for short-range pickup zonesPickup Zone
pickup_charge_after_thresholdPickup surcharge for longer-range pickup zonesPickup Zone
schedule_ride_fareAdditional charge or multiplier for pre-scheduled ridesScheduled
driver_allowance_hoursHours threshold after which driver receives a daily allowanceDriver Cost
driver_allowance_amountFixed allowance amount paid to driver after threshold hoursDriver Cost
night_time_chargesFlat or percentage surcharge applied during night hoursNight
night_time_start / endConfigurable night window (e.g. 22:00 – 06:00)Night
tax_percentageGST / tax percentage applied to the final calculated fareTax
🖥
Module 04

React Admin Panel

Next.js + TypeScript · Web dashboard for operations, fleet management, finance, and settings

⌨ Technical

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.

💬 Plain English

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.

FeaturePlain EnglishTechnical Detail
Dashboard & Live Map
📊 KPI OverviewRevenue, rides, active drivers, new users — all at a glance with trendsAggregated API with date filters; trend vs previous period calculated server-side
🗺 Live Ride MapAll active rides and online drivers visible on a live updating mapSocket.io admin room + Google Maps JS API; driver markers animate in real time
🔥 Demand HeatmapVisual map layer showing hotspot areas with high ride demandGoogle Maps Heatmap layer; data from ride request density aggregation query
User & Driver Management
👥 Rider ManagementSearch, view, edit, suspend, or delete rider accountsFull CRUD; filter by status / date; ride history and wallet balance inline
🚗 Driver ManagementView all drivers, their status, KYC state, and performanceDriver list with filters; inline KYC doc viewer; performance stats per driver
📄 KYC ReviewView uploaded documents and approve or reject with a written reasonDocument viewer with version history; approval/rejection triggers push notification to driver
🏢 Organisation / Fleet ManagementCreate organisations; assign drivers; view fleet-level statsOrganisation CRUD; short code generation; fleet aggregated earnings and trip counts
Ride & Trip Management
📋 All Rides LogFull searchable history of every trip on the platformPaginated trips table; filter by date, zone, status, driver, rider; CSV export
🔍 Live Ride DetailClick any active ride to see full details and live map positionTrip detail modal with real-time location, state timeline, chat log, fare breakdown
⚡ Manual DispatchManually assign a driver to a ride when automatic matching failsAdmin override endpoint; bypasses normal dispatch queue
Pricing, Zones & Surge
💰 Fare ConfigurationSet all 27 pricing parameters per vehicle categoryAdmin UI form saving to pricing_config table; changes apply to new bookings immediately
🗺 Geofence ManagerDraw zones on a map to define service areas, surge zones, or restricted areasGoogle Maps Drawing Manager; polygon/circle saved as GeoJSON; used in PostGIS zone checks
⚡ Surge Zone ControlSet a surge multiplier for any zone — turn on/off manually or by scheduleSurge config per geofence zone; multiplier applied at fare estimate time
🏙 Multi-City SupportRun the platform across multiple cities, each with independent pricingCity entity with its own fare configs, geofences, and service zones
Finance & Payouts
💳 Payment TransactionsFull log of all payments — collections, refunds, wallet top-upsTransactions table with Razorpay order/payment IDs; filter and export
🏦 Driver Payout RequestsReview and approve driver withdrawal requestsPayout queue; approve triggers Razorpay Payouts API transfer to driver's bank
📈 Revenue ReportsRevenue by date range, city, vehicle type, or driverAggregated query + Recharts visualisation; CSV export
🯧 Driver Wallet LedgerFull per-driver financial ledger — deposits, commissions, cash collected, payouts, bonusesLedger table per driver; detailed drill-down per transaction type; settlement reconciliation view
💰 Customer Dues ManagementFlag riders with outstanding unpaid balances; their new bookings are blocked until clearedDebt ledger per rider; booking API checks for open debt before creating a new ride; admin can clear or waive dues
🔄 Manual RefundsIssue a refund to the rider’s original payment method or wallet, with a mandatory reasonRefund endpoint calls Razorpay refund API or credits wallet; reason + admin ID logged immutably
🯧 GST ReportsTax-ready reports for the accountant — GSTR-1 / GSTR-3B prep, invoice registerGST-aggregated query by period and city; CSV/Excel export with HSN/SAC, taxable value, CGST, SGST columns
Promotions & Communications
🏷 Promo Code ManagerCreate, edit, enable, or disable promo codesCode CRUD; flat / percentage discount; per-user limits, expiry dates, min fare conditions
🎫 Coupon ManagerManage auto-apply coupons and eligibility rulesCoupon entity with ride conditions; stacking rules; campaign-linked coupons
🎯 Incentive / Bonus RulesCreate 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 NotificationsSend push / SMS messages to all riders, all drivers, or a filtered segmentFCM topic messaging + MSG91 bulk SMS; segment filters by city, status, last active date
🏷 Referral Code ManagementView, create, edit, or delete referral codes per cityReferral code CRUD scoped per city; reward config (amount, cap per user); usage analytics
Settings & Access Control
👤 Sub-Admin RolesCreate 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 ManagerAdd/edit vehicle types (Mini, Sedan, SUV, etc.) with icons and seating infoCategory CRUD; linked to fare config and driver app vehicle selector
⚙️ App ConfigSet 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 stepTOTP (Google Authenticator) or SMS OTP as second factor; mandatory for all admin roles; backup codes generated on setup
💬 Support Chat ConsoleAdmin can chat with riders and drivers directly from the panelUnified inbox showing all open rider ↔ support and driver ↔ support threads; Socket.io; assignable to sub-admin agents
📡
Module 05

Dispatcher Panel

Focused ops interface — live map, manual bookings, customer call workflow, and issue resolution

⌨ Technical

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.

💬 Plain English

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.

FeaturePlain EnglishTechnical Detail
Live Operations
🗺 Live MapAll online drivers and active rides on one map with filtersSocket.io admin room; filter by vehicle type, status, geofence; driver cards show ETA + current status
🔍 Ride Detail Drill-DownClick any active ride to see full route, fare, state timeline, and chat logTrip detail panel with polyline, fare breakdown, state history, payment status
🚨 SOS ConsoleAll SOS alerts in one queue — one tap to call the rider, alert emergency contacts, or share live locationSOS events pushed to dispatcher room via Socket.io; response actions logged with timestamp and agent ID
Manual Dispatch
📞 Manual City BookingAgent creates a city ride on behalf of a customer and assigns a driver manually or lets the system auto-matchBooking API with dispatcher role flag; driver-picker shows nearby drivers with ETA + rating; geofence rules enforced
🛣 Manual Rental & Outstation BookingSame manual booking flow available for hourly rentals and intercity outstation ridesRide type flag passed to booking API; fixed-fare option available for negotiated trips
⚡ Re-assign DriverSwap the assigned driver on any active or upcoming rideOverride endpoint; previous driver notified; new driver gets Socket.io request; audit log entry created
💲 Fare OverrideDispatcher can manually set a fixed fare for a negotiated tripOverride requires senior-role permission; reason mandatory; logged with dispatcher ID and timestamp
Customer Call Workflow
📞 Auto-Pull Customer ProfileWhen a customer calls in, their profile and last few rides appear automaticallyCTI integration hooks on incoming call event; phone number lookup pulls customer record + ride history
💬 Live Chat with DriverDispatcher can message a driver in real time from the panelAdmin-to-driver Socket.io channel; messages logged; driver sees message as in-app notification
Issue Resolution
🔄 Cancel & Re-dispatchCancel a ride on behalf of a rider and immediately trigger a new driver searchCancel with reason code; dispatcher cancellations exempt from cancellation fee; re-dispatch triggered automatically
💵 Issue Refund / Adjust FareRefund to original payment method or wallet; adjust fare with a reasonRefund API with mandatory reason + agent ID; fare adjustment creates correction ledger entry; all logged for audit
🎫 Issue CouponSend a one-time coupon to a rider as compensation for a bad experienceOne-time coupon generated and linked to rider ID; reason + dispatcher ID stored
🗓 Scheduled Ride BoardAll upcoming pre-booked rides in a timeline view; reassign if assigned driver cancelsSorted by pickup time; filter by city and vehicle type; manual reassignment available for any upcoming ride
Infrastructure & DevOps

Deployment & Operations

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.

AreaRecommended SolutionNotes
☁️ HostingDigitalOcean VPS / App PlatformOr AWS EC2, Hetzner — team to propose best fit
🔀 Load BalancerNginx / DO Load BalancerRequired for multi-instance Socket.io with Redis adapter
📦 ContainerisationDocker + Docker ComposeLocal dev parity; production via Docker or managed services
🔁 CI/CDGitHub ActionsAuto-deploy on merge to main; run tests before deploy
🗄 Database BackupsAutomated daily snapshotsPoint-in-time recovery; retention policy configurable
📦 File StorageS3-compatible (R2 / S3 / DO Spaces)KYC docs, profile photos — team to select based on cost and region
📊 MonitoringUptime monitoring + error alertingSentry for error tracking; Uptime Robot or Better Uptime for availability
🔐 SSL / TLSLet's Encrypt via Certbot / NginxAuto-renewing certificates on all endpoints
📱 App DistributionGoogle Play + Apple App StoreStandard store release pipeline; TestFlight for iOS beta
Scope

What's Included

Everything below is part of this build scope.

✅ Deliverables

  • Flutter Rider App (Android + iOS)
  • Flutter Driver App (Android + iOS)
  • Node.js backend — all APIs + Socket.io
  • React/Next.js Admin Panel
  • PostgreSQL + PostGIS + Redis setup
  • Google Maps — all features
  • Razorpay payments + QR + payouts
  • MSG91 SMS/OTP/email + Firebase FCM
  • KYC upload & review flow
  • All ride types (instant, scheduled, rental, return)
  • Airport fixed-price pickups
  • Fare engine — all 27 parameters
  • Promo codes, coupons, referral system
  • Demand heatmap (driver + admin)
  • Multi-city support
  • Full data migration from existing platform
  • CI/CD pipeline + staging + production deployment
  • UI from provided Figma file
  • Full source code ownership transferred to client
  • 6-month post-launch bug support

Ride-Hailing Platform · Product Requirements Document · v1.0 · June 2026

Confidential