Three numbers, three systems, one charge
A single charge session generates three independent claims about money. They almost never line up on the first pass.
The charger and its CSMS report energy delivered — a CDR that says 23.4 kWh crossed the cable. The payment layer reports a captured amount — what was actually taken from the card after the hold. The acquirer’s settlement file reports a third figure — what cleared the rails, net of the bits the acquirer batched, split, or held back.
In the happy path, these collapse into one truth: energy priced at the tariff equals the capture equals the settlement. The happy path is also the rarest path at scale. Every other path is where margin quietly leaks — and where an auditor, months later, finds a gap nobody can explain.
Reconciliation is the discipline of forcing those three numbers to agree: continuously, per session, with a clear story for every discrepancy. OCPI gives you the raw materials — a pre-authorization tied to a tariff, a start/stop, a CDR. It does not give you the reconciliation. Newer revisions added a payments module that can carry a captured amount back from the terminal, but even that reports what your capture took — not what the acquirer’s settlement file cleared. And the operator’s pricing is the commercial source of truth regardless of what the roaming tariff says. The third number still lives outside OCPI. So either you build the reconciliation between the three, or Bolt builds it once.
Why the numbers diverge
The divergence isn’t sloppiness. It’s structural — and it begins the moment payment moves card-present to an unattended terminal: the ad-hoc, no-app flow that AFIR now mandates for new public chargers. That shift is what turns pre-authorization, capture, and settlement into a network-wide reconciliation problem instead of an app’s internal bookkeeping.
A driver keys in a target amount and the terminal holds it — a hold against a session that hasn’t happened yet. Everyone in this audience knows what a hold is. The structural fact is that the capture rarely equals the hold:
- The car hits a battery taper and stops early.
- The driver unplugs at the supermarket exit.
- The charger drops the connection mid-session, and the CSMS may or may not emit a clean CDR for the partial energy.
So you hold for one amount, capture what was actually delivered, and release the rest. Per session, that gap is small. Across a fleet of AC chargers running slow, frequent, low-value sessions all day, the same gap is systematic.
Then the acquirer adds its own layer. Settlement is not a mirror of your captures — it’s batched, it can split a capture across files, it can reject one for a stale token, and it reports on its own clock. The CDR closed Tuesday; the money clears Thursday; the file that proves it arrives Friday. Three timelines, three numbers, one session you’re still trying to close.
Walking the non-happy paths
This is where OCPI stops and product begins, and the part that decides whether your unattended network is actually solvent. Each path below is a place a number goes missing.
Partial capture. The hold was for the driver’s target; the session delivered less. The CDR says 23.4 kWh, and the capture must price exactly that against the tariff — no more, no less. If your capture is computed from the terminal’s view while the CDR comes from the CSMS’s view, those two have to be the same calculation. Otherwise you’ve baked in a recurring mismatch you’ll only notice in aggregate.
Refunding the unused hold. The hold minus the capture has to come back. On many acquirers, a hold doesn’t auto-expire cleanly — or it expires on a timeline that looks, to the driver, like you double-charged them. An unreleased hold is the single most common source of a furious driver and a chargeback. And a chargeback is a discrepancy that arrives with a deadline and a fee attached.
Failed finalization. The energy flowed, the CDR exists, but the capture call failed — the acquirer API hiccuped, the token aged out, the network blinked. Now you have delivered energy with no money behind it. Without a finalization queue that retries idempotently and knows the difference between “not captured yet” and “captured twice,” you either lose the revenue or risk billing it twice. Both are reconciliation failures: one leaks margin, the other manufactures a dispute.
Session drops mid-charge. The connection between charger and CSMS breaks. Sometimes you get a partial CDR, sometimes a late one, sometimes none. The money layer can’t wait forever for an energy figure that may never arrive, and it can’t capture against a number it doesn’t have — so the wait becomes an explicit decision. Hold the session open through a grace window keyed to thresholds you set — energy delivered, elapsed duration, accumulated cost on your own pricing — then either capture against the best evidence you have or release, and true up if a late CDR contradicts that choice. OCPP and OCPI define the messages; the policy is product.
Double-charge risk. Every retry, every reconnection, every “did that actually go through?” moment is a chance to capture the same session twice. The only defense is idempotency carried end to end: a stable session identity shared by the pre-authorization, the capture, the refund, and the settlement match. Lose that thread and you can’t even tell whether two records are one event or two.
The dispute. When a driver contests a charge, you’re not arguing about a feeling — you’re assembling evidence: the CDR showing energy, the tariff in force, the capture tied to it, the settlement that cleared. If those four don’t already live together against one session identity, you reconstruct them under a deadline, by hand. And you usually lose.
Reconciliation is continuous, not month-end
The instinct is to treat this as accounting’s problem: pull the acquirer statement at month-end, diff it against the CDRs in a spreadsheet, chase the gaps. At a handful of sessions, that works. At an unattended network running thousands of small AC sessions and high-value DC sessions every day, the spreadsheet hunt is where margin goes to die. By the time you find a systematic capture mismatch, it’s thirty days deep across every charger. By the time you find the unreleased holds, the chargebacks have already landed.
Continuous reconciliation means each session carries its own state machine — held, delivered, captured, released, settled — and a session stuck between states is flagged the moment it’s stuck, not thirty days later.
The CDR-to-capture check runs per session. The capture-to-settlement match runs as each acquirer file lands. Anything that can’t be matched becomes an exception with a reason, not a mystery in a quarterly variance line.
The settlement side is also where the operator remaining the merchant of record changes what the reconciler can actually see. Because funds settle to the operator’s own acquirer, the file Bolt reconciles against is the operator’s real bank statement — the authoritative record of what cleared, line by line. Route the money through an intermediary instead, and what comes back is a re-aggregated payout: captures already netted, splits already smoothed, the exact discrepancies you most need to catch dissolved into a single number before you ever see them. There is no intermediary ledger here, because the money never routes through Bolt. The reconciler reads the source of record, not a summary of it — and the third number is the real one, line by line.
The figure that survives an audit
There’s a fourth number that matters more than the three: the one on the receipt the tax office accepts. Fiscalization is a country-specific round trip — the fiscal signature travels from the invoicing provider out to the unattended terminal and back, and OCPI carries nothing for it. A receipt that shows the right amount but doesn’t match the captured, settled, fiscally-signed figure is a discrepancy with a regulator’s name on it.
So the real test of reconciliation isn’t whether your books balance internally. It’s whether the energy in the CDR, the money in the capture, the amount in the settlement, and the figure on the legal receipt all tell the same story about the same session — and whether you can produce that story, per session, on demand, years later.
That’s the difference between a payment that worked once and a system that can still prove it was right. The charge is the easy part. Making three systems agree about it, then keeping them in agreement, is the engine.