What is Charge Verification?
Charge Verification helps you trust reimbursed home charges. For charges paid from an account wallet, the platform captures evidence from the vehicle during the session and runs a set of automatic checks when the charge completes, then shows a clear result on the charge. It's designed so you can confirm that the energy you're reimbursing actually went into the expected vehicle.
What evidence is captured
On qualifying charges, the platform takes a snapshot of vehicle data at the start and end of the session, where it's available:
- Odometer — the vehicle's distance reading. It comes from the vehicle integration, or is entered manually (by the driver in the app or by your account members in Hub). Integration readings are treated as verified; manual entries as declared.
- Location (GPS) — the vehicle's position, used to check it was at the charge point.
- State of charge (SoC) — the battery percentage at the start and end of the charge.
- Vehicle identifier (VID) — the identifier the vehicle transmits during the session.
Every data point stores where it came from and two timestamps — when the vehicle produced the value and when the platform captured it. That lets the platform judge how fresh the evidence is: a GPS reading taken within about 15 minutes of the session is treated as fresh, and one older than about 2 hours as stale.
The checks that run
When the charge completes, the platform runs every check it has data for and records a pass, flag, or inconclusive for each.
Vehicle assignment
If you've pinned an expected company vehicle to the home charge point, the platform checks the charging vehicle matches it. A match passes; a different vehicle is a critical flag; if no vehicle is recorded on the charge it's inconclusive.
VID match
Compares the identifier the vehicle transmitted against the vehicle's known identifiers. In the known set passes; a known vehicle transmitting an unrecognised identifier is flagged; no identifier (or no linked vehicle yet) is inconclusive while the platform is still learning the vehicle's identifiers.
Location
Compares the vehicle's GPS position with the charge point, allowing for normal GPS error (roughly 150 m, plus a little more if the reading is old). Within about 500 m confirms the vehicle was there; up to about 3 km is plausible; a fresh reading more than 3 km away — or any reading beyond about 10 km — is flagged. A very old reading sitting right at the charge point is treated as "parked there" and accepted.
Consumption (odometer vs energy)
Compares the energy charged with the distance driven between two odometer readings, using a guide of about 0.2 kWh per km. If the energy charged is up to about 1.3× the expected amount it passes; up to about 2× is suspicious; more than 2× is flagged — for example, far more energy billed than the distance driven could explain.
State of charge vs energy
Checks that the battery percentage gained lines up with the energy delivered, using the battery's capacity and about 88% charging efficiency. If the SoC gain is well below what the energy should have added (under about 70% of expected), it's flagged. The check is skipped when the battery started nearly full (98%+) or when SoC or battery-capacity data is missing.
Odometer quality
Flags a missing odometer reading, or a reading that goes backwards within a charge.
When a check doesn't have the data it needs, it's marked inconclusive, and the platform records exactly which inputs were missing (odometer, GPS, SoC, or VID) — this is the "Not enough data to verify" message you may see.
Session plausibility checks
Beyond the vehicle-evidence checks above, the platform runs a set of automated session-plausibility checks on every paid completed charge — on your own charge points and on roaming sessions. These look for sessions that don't add up. They are detect-only: a flag is recorded for review, and the charge is never blocked or changed.
A session is flagged when:
- Duplicate session — another session on the same charge point on the same day delivered almost exactly the same energy (within 0.05 kWh).
- Charging duration — the session ran longer than 48 hours.
- Session energy — the session delivered more than 300 kWh, larger than any current EV battery.
- Peak power — the measured peak power was above 400 kW.
- Average power — the average power (energy divided by charging time) was more than 1.15× the charge point's rated maximum, or above 350 kW where no rating is known.
- Price — the total session price was above €1,000, or the price per kWh was above €5 (compared in euros so it works across currencies).
- Impossible travel — the same charge key or vehicle started sessions at charge points too far apart to travel between in the time available (an implied speed above 250 km/h).
- Invalid timeline — the session ends before it starts, or bills energy across a window of almost no time.
- Overlapping sessions — the same charge key or vehicle appears to be charging at two different charge points at the same time.
- Late or future-dated record — a roaming charge record arrives long after the session ended, or claims to end in the future.
- Meter mismatch — the billed energy doesn't match the difference between the start and end meter readings (for charges that report meter values).
- Blocked charge key — the session used a charge key that was already blocked when it started (for example a lost card, a removed team member, or a key automatically blocked by fraud detection). A block that happens after the session starts is not flagged — that is the safeguard working.
- Billed above the published price — on a roaming session, the charge was billed more than the published roaming tariff for that charge point could account for.
- Held after full charge (public) — on a public charge point, the car stayed plugged in long after it finished charging (about 1 hour on DC or 4 hours on AC by default). This is an occupancy note, not a fraud flag.
They are being rolled out gradually and may not be active for every operator yet.
The verification result
The individual checks roll up into one result on the charge, and you'll also see the counts behind it (for example, "4 passed · 3 inconclusive"):
- Verified — the checks passed.
- Flagged — at least one check raised a concern. A single flag outranks any number of passes, so a flagged charge always shows as flagged.
- Inconclusive — there wasn't enough evidence to decide.
- Not run — no checks ran for this charge.
Each flag also carries a severity — info, warning, or critical — so the most serious issues (like a mismatched vehicle) stand out.
Result reference
Each check writes a result with a key (you may see it in a charge's details or via the API) and a severity. This table lists every result and what it means.
| Result key | What it means | Severity |
|---|---|---|
vehicle_assignment.match |
The charging vehicle matches the vehicle pinned to this charge point. | Info |
vehicle_assignment.mismatch |
A different vehicle than the pinned one charged here. | Critical |
vehicle_assignment.unknown_actual |
Couldn't tell which vehicle charged. | Warning |
vehicle_assignment.unconfigured |
No expected vehicle is pinned to this charge point. | Info |
vid.match |
The transmitted vehicle identifier matches a known one for the vehicle. | Info |
vid.mismatch |
The transmitted identifier isn't among the vehicle's known ones. | Warning |
vid.unknown |
No identifier transmitted, or the vehicle's identifiers aren't learned yet. | Info |
proximity.confirmed |
The vehicle's GPS placed it at the charge point. | Info |
proximity.contradicted |
The vehicle's GPS was too far from the charge point. | Warning |
proximity.unknown |
No usable GPS to check the location. | Info |
consumption.plausible |
Energy charged fits the distance driven. | Info |
consumption.suspicious |
More energy charged than the distance suggests. | Warning |
consumption.fraudulent |
Far more energy charged than the distance can explain. | Critical |
consumption.pending |
Waiting on a later odometer reading before comparing. | Info |
consumption.unknown |
Not enough odometer data to compare. | Info |
soc.delta_within_expected |
The battery percentage gained matches the energy delivered. | Info |
soc.delta_below_expected |
The battery percentage gained is well below what the energy should add. | Warning |
soc.unknown |
Not enough state-of-charge data to check. | Info |
odometer.missing |
No odometer reading was captured for the charge. | Warning |
odometer.decreased |
An odometer reading went backwards within the charge. | Warning |
verification.insufficient_data |
There wasn't enough data to run the checks. | Info |
session.duplicate |
Looks like a duplicate of another session on the same charge point that day. | Warning |
session.duration_implausible |
The session ran longer than 48 hours. | Warning |
session.energy_implausible |
The session delivered more than 300 kWh. | Warning |
session.peak_power_implausible |
Peak power was above 400 kW. | Warning |
session.avg_power_exceeds_rated |
Average power exceeded the charge point's rated maximum. | Warning |
session.price_implausible |
Price was above €1,000 total, or above €5 per kWh. | Warning |
session.impossible_travel |
The same charge key or vehicle charged at points too far apart for the time available. | Warning |
session.timeline_invalid |
The session ends before it starts, or bills energy across almost no time. | Warning |
session.concurrent_sessions |
The same charge key or vehicle charged at two different charge points at overlapping times. | Warning |
session.cdr_arrived_late |
A roaming record arrived long after the session ended, or claims to end in the future. | Info / Warning |
session.meter_delta_mismatch |
Billed energy doesn't match the start-to-end meter reading difference. | Warning |
session.blocked_charge_key |
The charge key was already blocked when this session started. If a block during the session was later removed, the check is inconclusive rather than a pass. | Critical |
session.tariff_cost_mismatch |
A roaming session was billed above the tariff published to the partner (a €1 and 5% tolerance applies; time-varying tariffs are not applicable). | Warning |
session.overstay_after_full |
On a public charge point, the session stayed plugged in well after the car was fully charged (default ~1h DC / ~4h AC, operator-configurable). Excludes home charging and roaming. | Info |
Reviewing a charge
Open a charge to see all the captured evidence and the outcome of each individual check. If a flag has been raised, you can review it and resolve it with a note once you've looked into it — resolved flags are kept as a record. You can also re-run verification for a charge if new information becomes available.
How do I see verification across all sessions?
In Hub, go to Operations > Charging sessions and open the Verification tab. The page is titled Verification and explains how many charging sessions could be verified, and what is blocking the rest.
Use Last 30 days (or another period) to change the window. Tick Hide sessions with insufficient data if you want those sessions out of the view. Configure rules opens Verification rules.
Under Session verdicts you see counts for:
- Attention needed
- Needs review
- No issues found
- Not enough data to verify
Verdicts over time shows how those counts break down across the selected period. Below the chart, Needs attention lists unresolved checks that flagged a problem, and Why sessions could not be verified lists the most common reasons a check could not reach a conclusion.
How do I configure verification rules?
From the Verification tab, select Configure rules. The page is Verification rules (Charging sessions > Verification > Verification rules).
Choose which checks run on your completed sessions, how strict they are, and how loudly they flag. Changes apply to sessions completed from now on.
Under Checks the platform runs you can tune a threshold, change a severity, or switch a check off entirely. There are 15 built-in checks. Each row has a toggle and an edit control. When nothing has been customised, Hub shows that every check is running on the platform defaults.
Built-in checks include:
- Duplicate session
- Implausible duration
- Implausible energy
- Implausible peak power — needs meter samples
- Average power exceeds rating
Those are the first rows on the page — the rest of the 15 are further down the same list.
Your own rules is for operator-defined rules. Select New rule to add one. If none exist yet, that list is empty.
How do I find charges that need sign-off?
In Hub, go to Operations > Charging sessions. Use the Verification and Sign-off filters to find charges that need a decision. To see flagged sessions that nobody has ruled on yet, set:
- Verification: Flagged
- Sign-off: Awaiting sign-off
Verification can also be Inconclusive or Verified. Sign-off can also be Approved or Rejected.
Each row that can be signed off has Approve and Reject icons. Select one or more rows to open a bar with bulk Approve and Reject.
Bulk sign-off uses the wording Signing off N charges. The note below is recorded against every one of them.
How do I sign off from a charge?
Open the charge and select the Verification tab. The Sign-off card shows whether an operator has accepted this session, and on what grounds.
This is a decision on the whole charge — approve or reject the session. It is not the same as Resolve on a single detector flag, and it is not the 15 checks on Verification rules.
When nobody has ruled yet, the card shows Awaiting sign-off and the helper text: nobody has ruled on this session yet. Approving or rejecting records who decided, and why.
Select Approve or Reject on the card. The charge header can also show Needs review, Unresolved, or Inconclusive next to the sign-off state.
Approving records the decision in the audit trail with your name and the detector verdict at this moment. A note is optional (up to 2000 characters).
Rejecting also records that this session is not legitimate. It does not reverse a payment or change the invoice. A reason is required.
How do I resolve or recalculate detector flags?
On the charge Verification tab, Detector flags shows computed signals from the verification detectors. Resolve to clear a flag from the queue.
The card shows when the detectors last evaluated the session. Select Recalculate to run them again. Flags are grouped (for example Fraud detection and Data quality). Each flag that still needs a decision has Resolve.
A Data quality group can also show that one or more checks could not be evaluated — for example when the vehicle is not linked to a telematics integration.
Entering an odometer reading manually
If the vehicle integration can't provide an odometer reading, one can be entered manually — by the driver in the driver app, or by your account members in Hub. Readings are kept as a history; a reading is never rejected at entry, so if one looks wrong (for example it goes down, or jumps unrealistically), the verification checks surface it as a flag instead.
Linking a company vehicle
For sponsored home charge points, you can pin the expected company vehicle to the charge point. The vehicle-assignment check then knows which vehicle should be charging there, and flags charges from any other vehicle — the strongest signal that a reimbursed charge is legitimate.