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
| Concept | Where it lives in the Ops Console | What it is |
|---|---|---|
| Service class | Taxi → Management → Pricing | A bookable tier (Economy, Premium, XL). Carries pricing parameters and driver/vehicle eligibility rules. |
| Vehicle catalog | Taxi → Management → Vehicles | The makes, models, and colors drivers can pick from. Distinct from individual vehicles registered to drivers. |
| Pricing overrides | Taxi → Management → Pricing → Overridden Zones | Zone-level flat fares, group flat fares, and zone surcharges that layer on top of a service class. |
| Dispatch rules | Settings → Dispatch | How driver offers are sent (broadcast vs. sequential) and how candidates are scored. |
| Regions and zones | Management Common → Regions | Geographic regions and their zones, including geofences. Used by pricing overrides and dispatch. |
| Map provider | Settings → Map | Preferred 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
| Field | Notes |
|---|---|
| Image | Optional; shown to passengers when picking a tier. |
| Name | e.g. "Economy". |
| Code | A short uppercase identifier — the hint suggests STANDARD, PREMIUM. |
| Description | Short blurb shown in the app. |
| Position | Sort order in the picker. |
| Max person capacity | Integer seats. |
| Active | Toggle to hide a class without deleting it. |
Pricing
The economics are pricing-mode-aware:
- Pricing Mode —
FIXED(predetermined fee, no driver submission) orMETERED(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$PaymentTimingenums. - 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
- 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_classlayer 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 workspace sees them. You can't edit a global row, but the row's overflow menu (
...) lets you Hide for my workspace 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 workspace. 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 workspace-wide dispatch config.
Dispatch Strategy
- Broadcast — notify all eligible drivers at once.
- Sequential — notify drivers one by one.
(Enum$DispatchStrategy.BROADCAST / SEQUENTIAL.)
Common Options
| Field | Unit |
|---|---|
| Request Expiry Time | seconds |
| Initial Search Radius | meters (where the search starts) |
| Maximum Search Radius | meters (hard ceiling) |
Broadcast Options (when Broadcast is selected)
| Field | Unit |
|---|---|
| Wave Size | drivers per wave |
| Wave Interval | seconds between waves |
| Max Waves | total waves |
| Broadcast Radius Increment | meters added per wave |
Sequential Options (when Sequential is selected)
| Field | Unit |
|---|---|
| Per Driver Timeout | seconds |
| Max Drivers to Test | drivers |
| Max Retries Per Driver | times |
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-workspace 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 workspace-wide polygon. - No "Test mode vs. live mode" toggle. There's a per-workspace
is_demoflag that gates demo affordances in the driver/passenger apps, but it's set at workspace 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
PricingDetailsScreendon'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:
- Set your operation cities (owner dashboard).
- Add at least one Region in
Management Common → Regionswith a geofence covering your service area. - Create at least one Service Class in Dynamic mode with sensible defaults.
- Save Dispatch settings. The defaults suit a small fleet. If drivers are sparse, raise the Initial Search Radius so the first round already reaches them, rather than only the maximum — the maximum is a ceiling the search grows toward, not where it begins.
- Move on to driver onboarding.
How the search widens
A request starts at the Initial Search Radius and widens by the expansion step at each interval, never past the Maximum Search Radius. If the fully widened search still finds nobody, dispatch makes one last round with no distance limit before cancelling, so a tight ceiling cannot strand a booking that a nearby-ish driver would have taken.
Drivers also set their own pickup radius in the driver app. Both have to accept: a driver 8 km away is inside a 10 km tenant radius, but not inside their own 5 km preference, and will not be offered the ride. A driver who sets no radius has no limit of their own.
What's next
- Onboard Drivers — invite, verify, and approve the people who'll drive for this fleet.
- Plans & Billing — your plan's
locationslimit 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.