How fleet data flows from franchisee tools into your HQ rollup
Verinode | HQ never queries a franchisee's private database directly. Every number on the Fleet page (vehicle counts, insurance premiums, accident history, driver risk) is read from a single pre-ag…
On this page
- What this article covers
- The nightly aggregation job
- What the job reads
- What the job writes
- The privacy boundary, in practice
- Where to find it
- What's on the page
- Network fleet hero
- Insurance Risk
- Compliance & Driver Risk
- Accidents
- Fleet by Franchisee
- Drilling into one franchisee
- How to use this page
- What HQ never sees here
- Related articles
What this article covers
Verinode | HQ never queries a franchisee's private database directly. Every number on the Fleet page (vehicle counts, insurance premiums, accident history, driver risk) is read from a single pre-aggregated table, the network data, that a nightly job rebuilds. This article explains what that job does, what it reads, what it writes, and where the privacy boundary sits, so you know exactly what HQ can and cannot see about a franchisee's vehicles.
If you only want to know what the Fleet page shows and how to use it, skip to Where to find it. If you want the mechanics of how the data gets there, start with the next section.
The nightly aggregation job
The job is called hq-aggregate-refresh. It is the one and only bridge between franchisee operator data (stored in the PII database, region-deployable, owned by the franchisee) and the HQ side of the platform (stored in the core database, which HQ leadership reads from). Every group-level table under the network data*, fleet included, is written exclusively by this job. No HQ page, chat agent, or export ever opens a direct connection to a franchisee's PII tables.
Fleet is one of roughly twenty sub-refreshers this job runs per franchise group, alongside Facilities, Equipment, Commercial, Compliance, Team, and others. Because a large network can have dozens of franchisees, the job runs on a checkpointed schedule rather than a single midnight run: it fires every 10 minutes across a two-hour early-morning window, and each run resumes from where the last one left off using a saved per-group cursor. The run that finishes the last group in the network marks the sweep complete; later runs in the window simply do nothing. For your network, this means fleet numbers you see in the morning reflect data from franchisee tools as of sometime in that overnight window, not the instant you load the page.
Note
If a franchisee edits a vehicle, logs a service, or renews a policy this afternoon, you will not see it reflected in HQ until the next overnight refresh. The Fleet page is a rollup, not a live feed.
What the job reads
For every franchisee in your network's member directory, the Fleet sub-refresher reads seven tables from the PII side:
operator_fleet, one row per vehicle: status, ownership type (owned, leased, financed), model year, and current mileage.fleet_maintenance, the service work log: what was serviced and when.fleet_compliance_events, the compliance schedule: registration renewals, DOT inspections, and their due dates and status (open, overdue, or resolved).fleet_insurance_policies, commercial auto coverage: status, annual premium, and policy end date.fleet_recurring_costs, ongoing vehicle expenses such as lease or loan payments, with start and end dates.fleet_drivers, the driver roster: status, license expiration, and the date each driver's motor vehicle record (MVR) was last pulled.fleet_accidents, the accident log going back 36 months, including whether the franchisee's driver was at fault.
None of these tables, or any row from them, ever lands in a table HQ can query. The job reads them in memory, computes totals per franchisee, and writes only the totals forward.
What the job writes
For each franchisee, the job computes and upserts exactly one row into the network data, keyed on (group_id, operator_id). A rerun replaces that franchisee's row rather than adding to it, so the table always holds each franchisee's current state, not a history. The columns, and what each one means:
vehicle_countandactive_vehicle_count, total vehicles on file and the subset with statusactive(a vehicle with no status recorded also counts as active).vehicles_owned,vehicles_leased,vehicles_financed, the ownership-type breakdown.total_mileage_current, the sum of current odometer readings across every vehicle that has one recorded.avg_vehicle_age_years_x10, the vehicle-count-weighted average age in years, stored as a whole number ten times the true value (so 4.7 years is stored as 47) to keep the math in integers.services_last_30d, maintenance records logged in the trailing 30 days.services_overdue_count, derived not from the maintenance log but fromfleet_compliance_eventsrows with statusoverdue. The maintenance table is the record of work already done; the compliance table is the schedule of what's due, so "overdue" is a compliance-schedule concept, not a maintenance-log one.registrations_expiring_90danddot_inspections_expiring_90d, compliance events of the matching type with a due date inside the next 90 days.open_compliance_events, the count of compliance events currentlyopenoroverdue, of any type.active_policy_count,total_annual_premium_cents,policies_expiring_90d,earliest_policy_end_date, all computed from currently active insurance policies only. Premium is a straight sum across active policies; "expiring 90d" and "earliest end date" only look at policies with an end date on file.total_monthly_recurring_cents, the sum of recurring vehicle costs whose start and end dates (where set) bracket today, i.e. costs that are actually in effect right now.driver_count,drivers_with_expired_license,drivers_with_stale_mvr, computed over drivers with statusactive(or no status recorded). A license counts as expired if its expiration date has passed. An MVR counts as stale if it was never pulled, or was last pulled more than a year ago.accidents_36mo_count,at_fault_36mo_count, accidents in the trailing 36 months, and the subset flagged at-fault. Soft-deleted accident records are excluded.franchisee_name, the franchisee's directory name, written in two forms: plaintext, and an encrypted ciphertext under the group's own shared encryption key. HQ pages read the ciphertext and decrypt it on the fly; the plaintext column exists as a fallback if decryption ever fails. Either way, the name is not visible to anyone outside your group's HQ access.computed_at, the timestamp of the run that last wrote this row.
A franchisee only gets a row if they appear in your network's member directory under a location name. Vehicles belonging to an operator who isn't in that directory yet are not aggregated.
The privacy boundary, in practice
Two separate protections sit between a franchisee's raw fleet data and what you see on the Fleet page.
Name anonymization depends on your network's entity model, a setting your Verinode team configures for your group. Independent-operator and franchise networks (the default and the safer posture) see franchisee rows labeled Franchisee #A1B2, a short stable code derived from the franchisee's internal ID rather than their real name. Enterprise networks flagged as a single legal entity across locations see real location names, because there's nothing to anonymize: it's the same business viewing its own locations.
Small-network suppression protects networks too small for anonymization alone to work. Because each per-franchisee tile on the Fleet page is inherently a group of one, showing three tiles in a five-location independent-operator network would let you work out which franchisee is which by process of elimination, even with names masked. So when your network has fewer than three active franchisees and is running in independent-operator mode, every per-franchisee row (Insurance Risk, Compliance & Driver Risk, Accidents, Fleet by Franchisee) returns empty, and the page shows this notice instead:
Aggregate-only view. Your network currently has fewer than three active operators, so per-franchisee fleet posture tiles are suppressed to protect operator privacy (small-cohort identification risk). Hero aggregates still surface. Tiles return once the network reaches 3+ active operators, or change the network data posture in Settings → Group → Data posture.
The network-wide hero numbers at the top of the page still show, because a single total across the whole network doesn't identify any one franchisee.
Heads up
If your network recently added franchisees and per-franchisee tiles suddenly appeared where they weren't before, that's this gate lifting, not a change in what HQ is allowed to see. The underlying rule (name anonymization by entity model, row suppression below a minimum active count) never changes; only whether your network currently clears it does.
Where to find it
Open the Assets entry under Operations in the HQ sidebar, at hq.verinode.ai/facilities. Assets is a single nav entry with three pill tabs across the top: Facilities, Fleet, Equipment. Click Fleet (or go straight to hq.verinode.ai/fleet) to land on this page. See hq-overview for how Assets sits alongside the rest of the HQ sidebar.
What's on the page
Network fleet hero
The top panel reads Network fleet as its eyebrow, with the network's total active vehicle count as the large headline number. A pill beside it reads "N franchisees" (the count of franchisees with at least one vehicle on file), or "No data yet" if none do.
Below the headline, a summary line reads total vehicle count, then the owned / leased / financed split, then average vehicle age if any vehicle has a year recorded, for example: "42 total · 30 owned · 8 leased · 4 financed · 4.7yr avg age." If your network is in independent-operator mode, this line adds: "Franchisee rows are anonymized (independent-operator network)."
Three secondary tiles sit beside the headline:
- Total mileage, the sum of current odometer readings across the network, with a note that this is a sum across active vehicles.
- Annual premium, the network's total active commercial-auto premium, with the total monthly recurring vehicle cost (leases, loans, parking, tolls) noted beneath it when there is one.
- Policies expiring 90d, the count of active policies with an end date inside the next 90 days, with the earliest end date on file shown beneath it.
If your total vehicle count is zero, the hero reads: "Vehicle data will appear as franchisees register their fleets and policies."
Note
A handful of demo and sample networks show a small delta note ("vs national") beside these hero numbers, comparing your network's per-franchisee average to a synthetic reference. Real production networks never see this comparison: national deltas are computed only for networks flagged internally as demo data, so what you see on a live network is always your own numbers with no external comparison layered in.
Insurance Risk
Franchisees with at least one active commercial-auto policy ending inside the next 90 days, sorted by how many policies are expiring (most first). Each tile shows the franchisee, a label of Expiring (one policy) or Multiple (two or more), how many policies are ending in the 90-day window, the earliest end date, and, when there's enough data, a premium comparison against the network's median premium-per-vehicle for that franchisee's own vehicle count (shown as a plus or minus dollar figure "vs peer").
Empty state: "No active commercial-auto policies expire inside the 90-day window."
Compliance & Driver Risk
Franchisees with at least one open compliance issue: an overdue service, a registration renewal or DOT inspection due inside 90 days, a driver with an expired license, or a driver whose MVR hasn't been pulled in the last year. Each tile lists up to two of these issues by name (for example "2 overdue · 1 reg expiring"), with a "+N more" note if there are additional issue types beyond that.
Empty state: "All registrations, DOT inspections, driver licenses, and MVR pulls are current."
Accidents
Franchisees with at least one at-fault accident in the trailing 36 months, sorted by at-fault count. Each tile shows the at-fault count as its label and the total accident count (at-fault plus not-at-fault) beneath it.
Empty state: "No at-fault accidents recorded across the network in the last 36 months."
Fleet by Franchisee
Every franchisee with at least one vehicle on file, sorted by vehicle count, showing active vehicle count, average vehicle age and total mileage, and (when both premium and vehicle count are known) annual premium alongside the same premium-per-vehicle peer comparison used on the Insurance Risk row.
Empty state: "Fleet data will appear as franchisees register their vehicles."
Drilling into one franchisee
Clicking any franchisee tile, on any of the four rows above, opens a detail view for that franchisee with three sections: Fleet shape (counts, age, premium, ownership mix), Compliance (registrations, inspections, overdue services, driver license and MVR posture), and Safety (accidents and at-fault counts). A scope switcher lets you view the franchisee's own numbers or the network view, and each metric carries a confidence label, High confidence, Directional, Low confidence, or Hidden, reflecting how much peer data backs that specific comparison. The same privacy gates that apply to the row tiles (name anonymization, small-network suppression) apply inside this detail view.
How to use this page
- 1Start with the hero to gauge the network's overall exposure: total vehicles, how much is owned versus leased or financed, and whether policies are bunching up near expiration.
- 2Scan Insurance Risk and Compliance & Driver Risk first. These are the two rows where a gap becomes a real cost (a lapsed policy, a failed DOT inspection) if it isn't caught before the due date.
- 3Check Accidents for a pattern worth raising at the network level, not to single out one franchisee, but to see whether a training gap or a vehicle-age issue is showing up more than once.
- 4Click into any tile you want to understand further. The detail view breaks the same numbers down by peer comparison so you can tell whether one franchisee's premium or age profile is typical for their fleet size or genuinely out of line.
What HQ never sees here
To be explicit about the boundary this page sits behind: HQ never sees an individual vehicle's VIN, an individual driver's name or license number, a specific policy number or carrier contact, or a specific maintenance invoice. Every number on this page is a count, a sum, or an average that the nightly job computed from a franchisee's own records and wrote forward. Franchisees retain full detail on their own vehicles, drivers, and policies in their own operator tools; HQ's role is aggregate visibility and network-level pattern detection, not per-vehicle record-keeping.
Related articles
- hq-overview, the HQ sidebar and how sections like Assets fit together.
- network-health, how fleet risk contributes to overall network health scoring.
- hq-compliance, the network-wide compliance surface that this page's Compliance & Driver Risk row feeds into.
- hq-benchmarks, how premium-per-vehicle and other peer comparisons are built and gated.
Data sources
- 1.the network data schema. supabase/migrations/20260517c_group_fleet_summary.sql.
- 2.hq-aggregate-refresh cron (Fleet sub-refresher). the product.
- 3.Fleet read layer. the product.