PHP2Shell alert: critical PHP flaws CVE-2026-109618 / 109619 — check your servers and get patched fast
HashTech Systems
EV Charging

EV Charging Pricing Models: kWh, Time, Idle Fees and Tariffs

How to price EV charging: per kWh, per minute, session and idle fees, time-of-use, demand charges, and how pricing rules shape your tariff engine.

HashTech Engineering · October 26, 2026 · 5 min read

Pricing is where a charging network's costs, its drivers' expectations, and regulation meet. Get it wrong and you either lose money on every session at a site with high demand charges, or you drive away customers with prices they cannot predict. This guide covers the common price components, the cost drivers behind them, the rules that constrain them, and what a tariff engine needs to support.

Price components

ComponentCharged forGood forWatch out for
Energy (per kWh)Energy deliveredFairness; matches cost of electricityRequires accurate metering; may be mandatory
Time (per minute or hour)Time connected or chargingEncourages turnoverPenalizes slow-charging vehicles
Session feeEach sessionCovers fixed transaction costsDisproportionate on short sessions; restricted in some markets
Idle or occupancy feeTime after charging endsFrees up chargersNeeds a clear grace period and notification
Parking feeTime on siteSites where parking is the productOften outside the charger's data

Energy-based pricing

Pricing per kWh is the most intuitive for drivers and the most closely tied to the main variable cost, electricity. It needs metering accurate enough for billing, which in many jurisdictions means meters and chargers approved under weights-and-measures or metrology rules. In the US, NEVI-funded chargers must price on a $/kWh basis, and in the EU, AFIR requires ad-hoc prices at points of 50 kW and above to be based on price per kWh.

Time-based pricing

Per-minute pricing was common where selling energy by the kWh was legally awkward, and it still has a role as a turnover tool. Its weakness is fairness: a car that charges slowly pays more for the same energy. Tiered per-minute rates by delivered power reduce that problem but are harder to explain.

Idle fees

An idle fee starts when charging has finished (or after a grace period) and the car is still connected. It is the most effective tool against blocked chargers. Implementation detail matters: you need a reliable signal that charging has stopped (in OCPP 1.6, a connector moving to SuspendedEV or Finishing; in 2.0.1, TransactionEvent with a chargingState of SuspendedEV or EVConnected), a clear grace period, and a notification to the driver before the fee starts. In the EU, the Commission's AFIR Q&A indicates per-minute occupancy fees are acceptable for discouraging long occupancy, but a fee charged from the start of the session is unlikely to be proportionate.

What drives your costs

  • Energy charges: the per-kWh rate from the utility, often time-of-use.
  • Demand charges: many commercial utility tariffs bill on the highest power drawn during a billing period. A DC fast charging site with few sessions can see a large share of its bill come from a single peak. This is the cost driver most often missed in business cases.
  • Payment processing: card fees and pre-authorization costs, which weigh heavily on small sessions.
  • Roaming: the eMSP's margin and any hub fees on roaming sessions.
  • Network and operations: software, connectivity, maintenance and support, mostly fixed per port.

Demand charges are partly a pricing problem and partly a load management problem. Capping site power with smart charging can cut peaks; pricing can shift demand to off-peak periods. Most sites need both.

Time-of-use and dynamic pricing

Passing time-of-use structure through to drivers aligns their behaviour with your costs. The complication is sessions that cross a rate boundary. Some rules require the price at the start of a session to hold for the whole session: NEVI's 23 CFR 680.116(a) says the price at the start of a session cannot change during that session. Your tariff engine must snapshot the applicable tariff at session start and price the session against that snapshot, not the current tariff.

Expressing tariffs: OCPI as a model

Even if you never roam, OCPI's tariff model is a useful template: a tariff is a list of elements, each with price components (ENERGY, TIME, PARKING_TIME, FLAT) and optional restrictions (time of day, day of week, kWh or duration ranges, power ranges). Here is a tariff with a per-kWh rate, and a parking fee that applies only to parking time between 08:00 and 20:00:

json
{
  "country_code": "US",
  "party_id": "HTS",
  "id": "DC-STD-01",
  "currency": "USD",
  "elements": [
    {
      "price_components": [
        { "type": "ENERGY", "price": 0.45, "step_size": 1 }
      ]
    },
    {
      "price_components": [
        { "type": "PARKING_TIME", "price": 24.00, "step_size": 60 }
      ],
      "restrictions": { "start_time": "08:00", "end_time": "20:00" }
    }
  ],
  "last_updated": "2026-10-26T00:00:00Z"
}

Prices in TIME and PARKING_TIME components are per hour, and step_size is the billing increment in seconds (or Wh for energy). The OCPI tariffs post works through how a CDR is priced against a tariff like this.

Member, roaming and ad-hoc prices

Most networks end up with several prices for the same kWh: a subscription or member rate, the standard rate for app users, the wholesale tariff published to roaming partners, and the ad-hoc price for card payments. That is legitimate, but each adds a dimension to tariff assignment, and some rules limit the differences. NEVI forbids requiring a membership to charge, and AFIR requires prices to be non-discriminatory between end users and mobility service providers unless differences are proportionate and objectively justified. Keep the assignment logic explicit and auditable so you can show which tariff applied to any session and why.

Showing prices on the charger

Drivers need to see the price before they start and ideally the running cost during the session. OCPP 1.6 has no standard tariff messages, so displays depend on vendor extensions. OCPP 2.0.1 adds tariff and cost functionality (CostUpdated, cost in transaction responses, SetDisplayMessage) and OCPP 2.1 extends it further. See display messages and costs.

Tariff engine requirements

  • Versioned tariffs, with the version used stored on each session.
  • Components for energy, time, flat fees and idle time, with restrictions by time of day, day of week, power and duration.
  • Tariff assignment by site, EVSE, customer group, and roaming partner.
  • Timezone-correct evaluation using the location's local time.
  • Deterministic rounding rules that match what you publish to partners and print on receipts.
  • Re-pricing tools for disputes, using the stored tariff version and the raw meter data.

Key takeaways

  • Per-kWh pricing is the default and is required in some regulated contexts; time and idle fees manage turnover.
  • Demand charges can dominate DC site economics; address them with load management as well as pricing.
  • Snapshot the tariff at session start, and model tariffs in a structure that maps cleanly to OCPI.

HashTech builds tariff and billing engines into the charging platforms we deliver.

Let's Talk

Ready to build something that lasts?

Whether it's a charging network, an AI rollout, or a core enterprise system — let's talk about what you're building.