Rebalance Recommendations
The rebalance recommender lives at Dashboard > Operations > Rebalance. It turns the demand forecast into a ranked list of "move N vehicles from hex A to hex B by T" suggestions, each with a dollar lift estimate.
This page is only available when the subaccount has ai_ops_tier set to pro or enterprise.
Card anatomy
Each card represents one recommended move:
+----------------------------------------------+
| Move 3 ES400B from hex 89283082c1bffff |
| to hex 8928308347bffff by 16:00 |
| |
| Projected lift: $42.50 |
| Confidence: 78% |
| Distance: 1.2 mi |
| |
| [ Accept ] [ Snooze ] [ Dismiss ] |
+----------------------------------------------+
| Field | Meaning |
|---|---|
| Vehicle model | The vehicle model the rec targets (e.g. ES400B). If a hex has mixed models, the rec picks the model in oversupply. |
| Source hex | Where vehicles are now (oversupplied). |
| Destination hex | Where vehicles should go (undersupplied). |
| Recommended count | How many to move. |
| By T | Deadline — the rec expires four hours after generation. |
| Projected lift | Net dollars of expected incremental revenue. |
| Confidence | How tight the forecast CI is on this pair (0-100%). |
| Distance | Straight-line miles between hex centers. |
How projected lift is calculated
The recommender uses closed-form math on top of forecasts, not a separate model. For each candidate pair:
projected_lift_usd =
(destination_gain - source_loss) * avg_fare
- distance_miles * tech_cost_per_mile_usd
- destination_gain — additional rides on the destination hex if you add
nvehicles. - source_loss — rides we'd lose on the source hex by removing those
n. - avg_fare — rolling 30-day average fare for the subaccount.
- tech_cost_per_mile_usd — subaccount setting (default
0.50). Tunable; see Feature flags and tiers.
If the math goes negative (the move would cost more than it earns), the rec is never generated.
How candidates are picked
Once an hour, the recommender:
- Pulls the 4-hour-horizon forecast for every hex.
- Compares forecast to current supply (vehicles with
availability_status='available'and battery aboverebalance_battery_floor). - Picks under-supplied hexes ordered by gap.
- For each, finds the nearest over-supplied hex with capacity to give up vehicles.
- Scores, then writes the top-N as
rebalance_recommendationswith statusopen.
The cron also tombstones expired recommendations (status='expired') — it doesn't delete them, so you can measure historical acknowledgement rate.
Acting on a card
Each card has three buttons:
- Accept — marks the rec
acceptedand assigns the move to the default technician queue. If you're on the Enterprise tier, the next route-solver run will incorporate accepted recs as stops. - Snooze — marks the rec
snoozedand bumps its expiry by +2 hours. Use this when a move is good but you can't act on it right now. - Dismiss — marks the rec
dismissedwith the current timestamp. The rec stays in the database for the model to learn from, but disappears from the active queue.
Every acknowledgement (accepted, dismissed, snoozed) feeds back into the training data for the next nightly model retrain. The more honest you are with Dismiss, the better the model gets at picking moves you'll actually accept.
Sorting and filtering
The page sorts by projected lift (descending) by default. You can re-sort by:
- Vehicle count
- Distance (shortest first — useful when a tech is already nearby)
- Confidence
The status filter defaults to open. Switch to accepted, dismissed, snoozed, or expired to see history.
Top-3 widget
For a faster pass, the operations dashboard at /dashboard/operations shows a RebalanceTop3Widget with the three highest-lift open recommendations. Each card links to the full recommender page.
If you don't see the widget on your dashboard, the component is exported but may need to be wired into the page. Email support if you'd like it added.
Deduplication
The recommender refuses to create a new open rec for the same (source_h3, destination_h3) pair if one is already open. This prevents flooding the queue when a hex has been chronically under-supplied for hours.
What dismissing teaches the model
Dismissals are signal. A pattern of dismissing a particular destination hex tells the model that lift estimates in that direction are unreliable — maybe there's a permit issue, a closed street, or a no-park zone the recommender doesn't know about. The nightly retrain weights features like recent acknowledgement rate per destination, so your team's dismissals do tune the system.
Related
- Demand forecast map — the layer feeding these recommendations.
- Technician routes — how accepted recommendations turn into a tech's route.
- Feature flags and tiers —
tech_cost_per_mile_usd,rebalance_battery_floor, and tier requirements.