BetterTaxi: Set Up Your Fleet

Configure service classes, the vehicle catalog, pricing, dispatch, and operating area in the Ops Console.

Last updated May 19, 2026

Almost every taxi configuration screen lives in the Ops Console (<your-slug>-admin.bettersuite.io), not the owner dashboard. The owner dashboard's onboarding wizard does collect your Operation Area — the list of cities you plan to run in, capped by your plan's locations limit — but everything below is set up in the Flutter ops console.

If you haven't picked your cities yet, do that first in Owner Dashboard → Onboarding → Operation Area. Then come back here.

What you're actually configuring

ConceptWhere it lives in the Ops ConsoleWhat it is
Service classTaxi → Management → PricingA bookable tier (Economy, Premium, XL). Carries pricing parameters and driver/vehicle eligibility rules.
Vehicle catalogTaxi → Management → VehiclesThe makes, models, and colors drivers can pick from. Distinct from individual vehicles registered to drivers.
Pricing overridesTaxi → Management → Pricing → Overridden ZonesZone-level flat fares, group flat fares, and zone surcharges that layer on top of a service class.
Dispatch rulesSettings → DispatchHow driver offers are sent (broadcast vs. sequential) and how candidates are scored.
Regions and zonesManagement Common → RegionsGeographic regions and their zones, including geofences. Used by pricing overrides and dispatch.
Map providerSettings → MapPreferred map provider and defaults for the dispatcher map.

The Drivers section is its own surface — see Onboard Drivers.

Step 1: Create your service classes

Open Taxi → Management → Pricing. The List tab shows your existing service classes; click New pricing to create one.

The form (PricingDetailsScreen) is divided into four sections.

Basic info

FieldNotes
ImageOptional; shown to passengers when picking a tier.
Namee.g. "Economy".
CodeA short uppercase identifier — the hint suggests STANDARD, PREMIUM.
DescriptionShort blurb shown in the app.
PositionSort order in the picker.
Max person capacityInteger seats.
ActiveToggle to hide a class without deleting it.

Pricing

The economics are pricing-mode-aware:

  • Pricing ModeFIXED (predetermined fee, no driver submission) or METERED (driver submits the final fee at end of ride). Source: backend/crates/taxi/domain/src/services/pricing_mode.rs.
  • Fee Policy and Payment Timing are dropdowns over the Enum$FeePolicy / Enum$PaymentTiming enums.
  • Absolute Min/Max Fee are in minor units (cents) — the form labels them minor.
  • Lower / Upper / Auth Percentage are in basis points (bp) — 10000 = 100%.
  • Stopover Per Minute Rate in minor units.
  • Can Do Delivery toggle.

Settings

  • Search Radius — meters; default search radius when this class is dispatched.
  • Fee Confirmation Timeout and Metered Fee Timeout — seconds.
  • Platform Commission — bp (10000 = 100%).
  • Platform Commission Flat — minor units, applied on top of the percentage.

Eligibility

This section controls which drivers can take rides for this service class. There are two modes (backend/crates/taxi/domain/src/services/eligibility_mode.rs):

  • Dynamic — drivers automatically qualify if they meet the criteria below.
  • Manual — only drivers explicitly added to this class's roster qualify. INCLUDE / EXCLUDE overrides in taxi.driver_service_class layer on top either way.

In Dynamic mode, the editor exposes:

  • Vehicle requirements — max vehicle age (years), allowed body types, allowed size classes, allowed fuel types, minimum seats, minimum doors. Leave any field blank to skip that requirement.
  • Driver KPIs & profile — minimum rating (e.g. 4.85), minimum completed rides, minimum acceptance rate (30d), maximum cancellation rate (30d), minimum driver tier, and an optional required-gender filter. The UI itself flags the gender filter as "Use sparingly — only for legally permitted gender-restricted services."
  • Customer & VIP gates — minimum customer tier (Unverified / Basic / Verified / Premium) the passenger must hold, and an "Only VIP-eligible drivers" toggle.
  • Compliance — require unexpired license/insurance/registration, require approved driver photo, require passed background check, and a multi-select of Required certifications that points at the catalog you manage in Management Common → KYC → Certifications.

Step 2: Curate the vehicle catalog

Taxi → Management → Vehicles is a landing page with three sub-screens: Vehicle Makes, Vehicle Models, and Vehicle Colors (VehicleLandingScreen).

Each list mixes two row types:

  • Global rows seeded by the platform — every tenant sees them. You can't edit a global row, but the row's overflow menu (...) lets you Hide for my tenant so it stops showing up to drivers picking a vehicle. Hidden rows can be brought back via Unhide.
  • Yours rows — makes / models / colors you've added for your tenant. These are editable and deletable.

Add a custom make from Vehicle Makes → Add. Models live under their make; colors are flat.

This catalog is what drivers (and the "Create Driver" form in the next step) pick from when registering a vehicle. It does not track individual vehicles or vehicle approval — that happens implicitly when a driver is approved (see Onboard Drivers).

Step 3: Define pricing overrides (optional)

Back on Taxi → Management → Pricing, the Overridden Zones tab lets you layer zone-specific fares on top of a service class. The sub-tabs are:

  • Zone Flat Fares — a fixed price for trips that match a (origin zone, destination zone, service class) combination.
  • Group Flat Fares — flat fares for groups of zones.
  • Zone Surcharges — extra fees applied when an origin or destination zone matches.

Zones themselves come from Management Common → Regions, where each region carries a polygon geofence drawn on a map (RegionDetailsScreen uses a GeofenceFormField). You add regions before you can reference them in a flat fare.

Step 4: Configure dispatch

Open Settings → Dispatch. The screen (SettingsDispatchScreen) writes a single tenant-wide dispatch config.

Dispatch Strategy

  • Broadcast — notify all eligible drivers at once.
  • Sequential — notify drivers one by one.

(Enum$DispatchStrategy.BROADCAST / SEQUENTIAL.)

Common Options

FieldUnit
Request Expiry Timeseconds
Search Areameters (max search radius)

Broadcast Options (when Broadcast is selected)

FieldUnit
Wave Sizedrivers per wave
Wave Intervalseconds between waves
Max Wavestotal waves
Broadcast Radius Incrementmeters added per wave

Sequential Options (when Sequential is selected)

FieldUnit
Per Driver Timeoutseconds
Max Drivers to Testdrivers
Max Retries Per Drivertimes

Driver Scoring

Sliders 0–100 for Distance Weight, Driver Rating Weight, Idle Time Weight, Cancel Rate Weight, plus a numeric Threshold and Top N drivers to keep. The page renders an Impact Breakdown widget below the sliders so you can see how a candidate driver gets scored before you save.

Tier-aware policy

A separate section for per-customer-tier overrides:

  • wait_time_grace_seconds_by_tier — JSON keyed by tier (unverified / basic / verified / premium); seconds the driver waits at pickup before billable charges start.
  • no_show_radius_meters_by_tier — JSON keyed by tier; how close the driver must be to mark a no-show.
  • Auto-rebook minimum tier — dropdown over Disabled / Basic / Verified / Premium. If a trip drops and the passenger is at or above this tier, the system automatically attempts to re-match.

Reset to default restores the platform defaults; Save changes writes the config.

Step 5: Set the map provider

Settings → Map picks the preferred map provider and defaults shown on the dispatcher live map. This is a per-tenant preference, not a per-class one.

What we don't have (so you don't go looking)

A few capabilities that the previous version of this article suggested exist, but don't:

  • No "Live Map → Service Area" polygon editor in the ops console. Geofences are drawn per region in Management Common → Regions, not as a single tenant-wide polygon.
  • No "Test mode vs. live mode" toggle. There's a per-tenant is_demo flag that gates demo affordances in the driver/passenger apps, but it's set at tenant provisioning, not flipped from the operator UI.
  • No vehicle approval queue. Individual vehicles aren't approved separately — they're attached to a driver and reviewed as part of the driver's pending verification (see the next article).
  • No "surge multiplier" field on service classes. The eligibility / pricing fields in PricingDetailsScreen don't include a surge knob. Demand-shaping is done through pricing overrides and dispatch scoring.

Suggested order on day one

This is advisory — not enforced by the product:

  1. Set your operation cities (owner dashboard).
  2. Add at least one Region in Management Common → Regions with a geofence covering your service area.
  3. Create at least one Service Class in Dynamic mode with sensible defaults.
  4. Save Dispatch settings (the defaults are reasonable for a small fleet — increase the search radius if drivers are sparse).
  5. Move on to driver onboarding.

What's next

  • Onboard Drivers — invite, verify, and approve the people who'll drive for this fleet.
  • Plans & Billing — your plan's locations limit caps how many cities you can register in Operation Area.
  • Dashboard Tour — the two-dashboard split, in case you're hunting for a setting you remember seeing elsewhere.

Build the foundation once. Expand without limits.

BetterSuite is built for teams who see on-demand as a business — not a feature.