A dispatcher looks at a map and sees a line between the depot and the drop point. The routing engine has already decided that line is the best one available: shortest, or fastest, or cheapest by whatever cost function it was handed. What neither the map nor the engine has decided is whether the vehicle assigned to that route can physically get down the last hundred meters of it.
That gap is where last-mile operations quietly lose margin. The failure is rarely dramatic. A three ton box truck turns into a lane, gets forty meters in, meets a parked car and a low canopy, and reverses out past a corner it could not see when it committed. The parcel goes back on the van, the stop is re-attempted tomorrow at full cost, and the system that planned it learns nothing.
Deciding whether a street is passable is a different problem from routing. It uses different data, it fails in different ways, and most of its difficulty is not algorithmic. The inputs are missing, approximate, or true only at certain hours, and a system that is useful has to say which.
Routing answers reachability, suitability is a separate question
A routing engine builds a graph. Nodes are intersections, edges are road segments, each edge carries a cost and a set of restrictions: one way, turn bans, access tags, maybe a speed. The engine finds the cheapest path through that graph subject to those restrictions. This is a solved problem and the implementations are excellent.
The trouble is what the graph asserts. An edge exists, therefore the edge is traversable. The restrictions encoded on it are the restrictions someone bothered to encode, and absence of a height restriction is treated as absence of a height problem. In most open road networks the overwhelming majority of segments carry no height, width, or weight attribute at all. The routing engine is not wrong. It answered whether a path exists in the graph, not whether this specific vehicle can drive it today.
Suitability asks something narrower and harder. Given a vehicle of known dimensions, mass, and turning circle, and given a time of day, can it enter this segment, traverse it, stop long enough to unload, and leave. That question does not have a single yes or no answer at the network level. It has an answer per vehicle class, and often per hour.
The practical consequence is that suitability belongs in its own layer over the routing graph, not folded into edge costs. Fold it into cost and the ability to explain why a street was avoided disappears, along with the ability to re-evaluate for a different vehicle without rebuilding the graph. Keep the routing graph as geometry and connectivity, keep suitability as an attribute set any consumer can query.
The constraints that actually decide it
Six physical properties do most of the work.
- Carriageway width. Whether two vehicles can pass, whether one can pass a parked car, and whether the vehicle fits at all. The binding constraint is usually not the nominal width but the effective width after parking, street furniture, and drainage.
- Turning radius at the entry and at any bend inside. A long wheelbase vehicle can be defeated by a single ninety degree corner between two buildings even when the street itself is wide enough.
- Height clearance. Bridges, tunnels, awnings, overhead cables, tree canopy, and in dense informal areas the roofs and banners that residents extend over the street.
- Surface and condition. Unpaved is not automatically impassable, but unpaved plus rain plus a gradient often is. Surface interacts with load: an empty van manages what a loaded one does not.
- Weight and axle limits. Posted limits on bridges and residential streets, plus unposted limits that are real anyway, such as a culvert crossing that was built for motorcycles.
- Access control. Gates, bollards, permit zones, security barriers at estates and industrial parks, and time restricted pedestrian zones. Access control is legal or social rather than physical, and it stops a delivery just as effectively.
Two more constraints belong to the stop rather than the street: somewhere to halt without blocking a lane, and a walk from that halt to the door that the round can absorb. A street can be perfectly drivable and still be a bad stop.
Where the data comes from, and what it lacks
Open road networks carry the geometry, the classification, and a scattering of the attributes that matter. Highway class is nearly always present. Surface, lanes, width, maxheight, maxweight, and access tags are present where a contributor had a reason to add them, which correlates with places where somebody hit the problem and mapped it. Height restrictions on major routes are comparatively well covered because they matter to a lot of people. Width on a residential lane in a fast growing suburb is usually absent.
Satellite and aerial imagery gives building footprints and, at good resolution, the visible extent of the roadway, which supports an estimate of the space between building faces. Street level imagery, where it exists, is the richest source for clearance, surface, gates, and parking behavior, and its coverage is the most uneven of everything discussed here: dense on arterials in large cities, sparse to nonexistent on the exact minor streets where suitability is in doubt.
Elevation models give gradient, which matters for loaded vehicles and for surface interaction. National and municipal open data occasionally publishes restriction registers, freight route designations, and bridge inventories. These are high quality where they exist and worth wiring in individually rather than waiting for a consolidated source.
The honest summary is that the constraint most likely to stop a truck, effective width on a minor street, is the one least likely to be recorded, and the constraint that is best recorded, height on a major road, is the one least likely to be the binding one for last mile work.
Width as a modelled prior, not a measurement
Because measured width is scarce, most suitability systems end up inferring it. The common approach is to learn a prior from the attributes that are present: highway class, number of lanes, country, urban or rural context, presence of parking tags, and sometimes the gap between building footprints on either side. That yields a plausible number for every segment, and the number is a guess.
There is nothing wrong with a guess as long as it stays labelled. The failure mode is the type conversion that happens somewhere in a pipeline, where an inferred width of 3.2 meters and a surveyed width of 3.2 meters become the same float in the same column and no consumer can tell them apart. Once that happens the model has laundered its own uncertainty and every downstream decision inherits false confidence.
Three habits prevent it. Carry the provenance with the value, so every width has a source of surveyed, tagged, derived from imagery, or inferred from class. Carry an interval rather than a point where the source is inferred, because the useful question is whether a 2.4 meter vehicle fits, and an interval answers it directly while a point estimate pretends to. And when the interval straddles the vehicle width, return unknown rather than a coin flip, because unknown routes to a human or to a smaller vehicle while a wrong yes routes to a failed stop.
Building footprint separation deserves a specific warning. Setbacks, forecourts, drainage ditches, and permanent stalls all live in the gap between opposing facades, so that distance is a useful upper bound on the carriageway and a poor estimate of it.
The street changes during the day
Passability is not a property of a street, it is a property of a street at a time. This is the constraint most often left out of static suitability models, and in many markets it dominates everything else.
Market days close streets that are open the rest of the week, sometimes formally and sometimes by simple occupation. School opening and closing hours produce short windows of complete blockage on the approach roads. Loading activity for other businesses takes out the passing space on commercial lanes in the early morning. Religious observance closes streets around places of worship at predictable weekly times. Seasonal flooding makes low lying segments impassable for hours at a time during a wet season, on a distribution rather than a schedule.
Some of this is expressible in the conditional syntax that open road data already supports, and where a contributor has recorded it, it should be used directly. Most of it is recorded nowhere and has to be learned from operations: telematics traces showing where vehicles stop moving, failed delivery reasons, driver reports. That learned layer is the most valuable proprietary asset a last mile operator builds, and it is worth designing the data model for it before there is any data to put in it. A minimal representation is a per segment set of time windows carrying a state and a confidence, defaulting to the static assessment outside those windows.
The informal street problem
In rapidly built areas the map is behind the ground, and the lag is not uniform. New arterials appear in open data quickly because they are visible in imagery, they matter to many people, and somebody traces them. The lanes inside a newly built neighborhood appear later, partially, and often as a single centerline with no attributes. The lanes inside a self built settlement may appear as nothing at all, or as a footpath, or as a polygon of building outlines with implied gaps between them.
For a delivery operation this is the sharp end. The addresses exist, the customers exist, and the network representation of how to reach them does not. Treating an unmapped access route as impassable is wrong: motorcycles and handcarts use it every day. Treating it as a normal residential street is also wrong. Both errors are expensive in different directions.
What works is admitting a third state. A segment can be known passable, known impassable for this vehicle class, or unsurveyed. Unsurveyed segments get routed to the vehicle class that tolerates the widest range of conditions, usually a two wheeler in markets where two wheelers do last mile, and they get flagged for survey. The survey does not have to be an expedition: a driver confirming or denying a single proposition on a handset at the point of delivery generates a ground truth record for the cost of one tap.
The related trap is addressing. Sub addresses, block letters, and local landmarks carry the last fifty meters, and none of it is in the road graph. Suitability scoring should end where the vehicle can stop, and the rest should be reported as a walk rather than pretended away by snapping the address to the nearest drivable line.
Building a score that degrades honestly
The tempting design is a single number from zero to one per segment per vehicle class. It is compact, it sorts, it drops into a cost function. It is also the design that produces the failure described at the top of this article, because a score of 0.6 means both this street is moderately tight and we know almost nothing about this street.
A better structure separates three things that a single score conflates.
- A verdict per constraint: pass, fail, or unknown, for width, height, weight, surface, turning, and access, evaluated against the specific vehicle.
- A coverage figure: what fraction of the constraints were evaluated against real data rather than a class prior.
- A recommendation that is a function of both, where any hard fail is a fail regardless of the rest, and low coverage caps the confidence of a pass.
The rule that keeps this honest is that unknowns do not silently become passes. A common implementation error is initializing every constraint to pass and then downgrading on evidence, which means a segment with no data at all scores perfectly. Initialize to unknown, upgrade on evidence in either direction, and let the aggregate carry the count of unknowns.
When constraints are missing, redistribute weight over what is known rather than substituting a neutral value for what is not, and record that the redistribution happened. A segment assessed on two of six constraints is not equivalent to a segment assessed on six, even if both come out at the same number. Report the number and the denominator together, always, and refuse to emit a confident verdict when the denominator is small.
Vehicle profiles should be explicit inputs, not compiled into the score. Height, width, length, wheelbase, gross weight, and turning circle, supplied per query. The same segment produces different answers for a 7.5 tonne rigid, a long wheelbase van, and a cargo bike, and a system that bakes in one profile will be re-derived badly by everyone who needs another.
Validating against the only source that knows
Every input discussed so far is an estimate of what a driver will find. The driver is the ground truth, and the feedback loop from driver to model is worth more than any additional data source.
The cheap version is failure reasons with enough structure to be usable. A free text field saying could not access is nearly worthless. A short fixed list, too narrow, blocked, no clearance, gate refused, surface, no parking, produces a labelled dataset within weeks of operation. Pairing it with telematics gives the location where the vehicle actually stopped versus where it was supposed to stop, which is a direct measurement of the walk that the plan did not know about.
The discipline that matters is treating a confirmed pass as evidence too. Models get corrected quickly on failures because failures are visible and annoying. Successes are invisible, and without them the model drifts pessimistic, refusing streets that are fine and inflating route cost. Log both, weight them equally, and re-derive the priors on a schedule.
Two caveats. Driver reports encode driver caution as well as street geometry, so a street refused by one driver and used by another is a data point about both. And confirmation is vehicle specific: a pass by a small van says nothing about the box truck, so the record has to carry the profile that generated it.
The failure that gets shipped
The version of this system that reaches production and quietly hurts is the one that returns a number for every street. It looks complete, it integrates cleanly, and it is confidently wrong precisely where the data is thinnest, which is where the deliveries are hardest and the margin is smallest.
The version that works returns unknown often, and returns it loudly enough that the planner routes around it: a smaller vehicle, an earlier slot, a survey task, a human decision. That system is harder to sell internally because its dashboard has gaps in it. The gaps are the honest part. A street suitability model earns trust by being right about what it does not know, and it only gets one chance to be caught pretending otherwise.