A customer opens a stops report and finds three kinds of value in one column. One row has a depot name, one a street address, one a pair of coordinates. The Excel export of the same month has addresses near the top and coordinates further down. The CSV has no address column at all.
None of this is random. Each value comes from a specific layer, and each export spends a fixed geocoding budget. Once you know the order of the layers, you can predict every cell and fix the ones that matter.
Devices send coordinates, and the report engine stores coordinates, not addresses. The app turns a coordinate into text late, at the moment someone looks at it. Reports, exports, trip details, the map and alert messages all ask the same shared resolver, so one point gets the same answer everywhere.
Two settings decide what you see:
Street addresses come from the geocoding provider, an external reverse-geocoding service that your Polygon operator configures. Every lookup is a network call, so the resolver avoids them wherever it can.
The resolver takes a whole batch of points and passes each one through these layers in order. All six exist in the current build.
Earlier design notes had the resolver format that fallback text itself. In the current build it returns no text, and the screen or the export writes the coordinates.
Every answer carries its source: geofence, cache, provider, miss (the provider had no name), unavailable (the provider was not reached) or invalid (no fix). Only provider and miss count as lookups. The cache stores a miss but never an unavailable answer, so an outage does not stick.
Harbor Fresh Foods runs Truck 12 out of a depot with two address geofences. "Harbor Fresh Depot" covers the yard and has the description "Gate 2". "Cold Store Bay" is a smaller geofence inside it. Tuesday's stops report has six rows:
Stop Where Layer Start location Lookup
1 Depot gate geofence Harbor Fresh Depot (Gate 2) no
2 Loading bay inside the depot geofence Cold Store Bay no
3 New customer, first visit ever provider 14 Mill Road, Riverside yes
4 Customer Truck 9 visited Monday cache 2 Quay Street, Riverside no
5 Lay-by on a farm track miss 51.512340, -0.204512 yes
6 Second drop, 6 m from stop 3 grid 14 Mill Road, Riverside no
Stop 2 lies inside both geofences, and the smaller one wins. Stop 6 shares a grid cell with stop 3, so it reuses that answer. Six rows cost two lookups.
A geofence names a point when all of these hold:
The resolver uses the account you have selected when you open a report or start an export. The text is the geofence name. If the geofence has a Description, the description follows the name in brackets. Where geofences overlap, the one with the smallest area names the point.
The resolver checks geofences before it reads the cache, and it never caches a geofence answer. A rename, a redraw or a deletion therefore shows on the next report, with nothing to recalculate. A geofence is also the only way to override what the provider says about a place.
The trade-off is upkeep: each named site is one more geofence to keep. It pays off for depots, customer sites and yards your units visit every day, because those points then cost no lookup.
On screen, the app resolves only the rows on the current page, in one batch. There is no budget; the page size, at most 500 rows, bounds the work. Moving to another page resolves that page. The address column filter narrows only the rows already on the page. The message catalogue holds a screen notice about too many positions to geocode. The current screen never applies a budget, so you do not see it.
Exports to Excel and PDF resolve the whole file under one budget, shared by every sheet. The default is 5,000 lookups per export; your operator can change it. Geofence and cache answers are free and have no limit.
The export sends distinct positions in chunks of 500 and checks the budget between chunks. Spending can therefore pass 5,000 by up to one chunk. Once the budget runs out, the remaining positions keep their coordinates. Those rows sit later in the file. The sheet, or the PDF table, then ends with this note:
Addresses were resolved for the first 5,000 distinct positions; the rest are blank.
Despite the wording, those cells hold coordinates, not blanks.
CSV exports never resolve addresses. They keep the coordinate columns, even ones the template hides, so the file still says where each row happened.
Back to Harbor Fresh Foods. A March export to Excel for 40 units comes to 9,000 distinct positions. Geofences name 3,500 of them and the cache answers 2,000. The remaining 3,500 lookups fit the budget, so every row gets text.
A second fleet runs the same export with no geofences and a cold cache. It needs 9,000 lookups. After ten chunks the budget is spent, and the last 4,000 positions keep coordinates under the note. Adding geofences for regular sites lowers that number for every future export. A shorter period or fewer units per export also helps.