Real-time tariff integration for charge scheduling: how EPEX SPOT prices translate to fleet savings

Day-ahead and intraday EPEX SPOT pricing can vary by 10× within a single day. We explain how fleet charging software exploits these windows without compromising departure times.

Energy price chart on a monitor screen showing intraday electricity spot price fluctuations

How European wholesale electricity markets create the arbitrage opportunity

The EPEX SPOT exchange operates day-ahead and intraday markets for electricity across Central Western Europe, including Germany, France, Austria, Belgium, and the Netherlands. In the day-ahead market, hourly prices for the following calendar day are published around 13:00 CET each afternoon, following the pan-European market clearing process. Intraday trading opens for 15-minute products shortly after day-ahead results publish and continues up to 5 minutes before delivery, allowing participants to refine positions as renewable generation forecasts update.

German hourly day-ahead prices in 2024 averaged roughly €70–90/MWh but ranged from negative values (common during high-wind, low-demand overnight periods) to €400+/MWh during winter demand peaks and periods of low wind combined with high heating demand. The ratio between the cheapest and most expensive hour on a given day regularly exceeds 5:1 and frequently reaches 8:1 to 12:1. A fleet that can shift 2,000 kWh of charging demand from an evening peak hour to a low-demand overnight window is not capturing a marginal efficiency gain — it is making a structurally different energy purchasing decision.

The challenge for fleet operators is that most industrial electricity contracts in Germany are not indexed to EPEX SPOT prices. They are either fixed-rate contracts or time-of-use (TOU) contracts with two or three price bands (peak / off-peak / night). Within a TOU structure, the arbitrage opportunity is smaller but still material: German industrial TOU contracts typically show a 2:1 to 3:1 ratio between peak (06:00–22:00) and off-peak (22:00–06:00) Arbeitspreis. Moving charging sessions from evening peak to midnight off-peak reduces energy costs per kWh by 30–50% within the TOU structure alone, before any consideration of Leistungspreis management.

The data pipeline: from market publication to OCPP profile

Integrating real-time tariff data into a fleet charging scheduler requires a specific data pipeline that many fleet operators underestimate in complexity. The steps are:

1. Price data ingestion

Day-ahead prices are available via the ENTSO-E Transparency Platform API (formally ENTSO-E SFTP, now REST), which publishes hourly prices for all bidding zones shortly after market results. EPEX SPOT also provides direct API access for registered participants. For fleet operators not registered as EPEX SPOT participants, energy suppliers increasingly offer API-accessible price feeds as part of dynamic tariff products. The key technical requirement is that the ingestion process must complete before the scheduling engine's daily re-optimisation run — typically by 14:00 CET to allow a full evening and overnight schedule to be calculated before vehicles begin arriving.

2. Tariff construction

The raw EPEX SPOT price represents the wholesale energy cost. The actual cost a fleet operator faces includes grid fees (Netzentgelt, structured per StromNEV into a capacity component and an energy component), renewable energy surcharges, concession fees, and value-added tax. For most industrial consumers in Germany, the total Arbeitspreis at a given hour is the EPEX SPOT price plus 5–8 €ct/kWh in fixed network and levy components. The scheduling engine's objective function must use the full all-in cost at each time slot — not the EPEX SPOT price alone — to produce accurate tariff-weighted charging schedules.

3. Schedule optimisation and profile generation

The MILP scheduling engine ingests the 24-hour tariff vector, current vehicle connection state and SoC data from the CPMS, and departure schedule from the fleet management system (FMS). It solves the optimisation problem and outputs per-vehicle, per-time-slot power allocation targets. These targets are translated into OCPP ChargingSchedule objects and pushed to each charge point via SetChargingProfile.req with chargingProfilePurpose: TXDefaultProfile and the appropriate stackLevel.

4. Intraday updates

Day-ahead optimisation plans the overnight window; intraday updates handle deviations. If a vehicle arrives later than expected with lower SoC than planned, or if the intraday price forecast changes materially (a wind surge overnight, for example, making 01:00–03:00 significantly cheaper than day-ahead suggested), the scheduler re-solves for the remaining horizon and pushes updated profiles to affected charge points. The intraday re-solve can run as frequently as every 15 minutes with a warm-start from the previous solution, keeping computational overhead manageable.

A concrete example: 60-vehicle courier fleet, winter night, EPEX price spread

Consider a courier depot in the Frankfurt Rhine-Main area operating 60 light commercial electric vehicles (LCV), each with 75 kWh usable capacity. Vehicles return between 17:00 and 19:30 with average SoC at arrival of 25–40%. The depot has a 500 kVA transformer dedicated to EV charging with a 450 kW active power budget at 0.9 power factor. All 60 charge points are 11 kW, 3-phase AC.

On a January evening, day-ahead prices for the Frankfurt area bidding zone (DE/LU) show the following pattern: 17:00–22:00 at 145 €/MWh, 22:00–02:00 at 38 €/MWh, 02:00–05:00 at 52 €/MWh, 05:00–06:30 at 95 €/MWh. The day-ahead schedule publishes at 13:00; the scheduling engine calculates the optimal plan and begins pushing profiles as vehicles connect from 17:00 onwards.

The schedule assigns minimal charging power (6A / ~4.1 kW per vehicle) during the 17:00–22:00 window — just enough to maintain SoC above 20% for any vehicle with a low battery — then ramps all connected vehicles to maximum (16A / ~11 kW) during the 22:00–02:00 cheap window, targeting full charge by 02:00 for all vehicles with a 06:00 departure. The aggregate demand during the cheap window peaks at 390 kW, within the 450 kW budget with a 60 kW safety margin. During the 17:00–22:00 peak window, aggregate EV draw is held below 80 kW.

The energy cost comparison: without tariff-optimised scheduling, the 60 vehicles charging from 17:00 at maximum rate consume approximately 2,700 kWh during the 17:00–22:00 window at 145 €/MWh = €391.50. With tariff-aware scheduling, most of that 2,700 kWh shifts to 22:00–02:00 at 38 €/MWh = €102.60. The energy cost for one overnight charging cycle falls by roughly €290 on a single night with a strong price spread. Annualised across 240 operating nights, with an average spread of half the winter peak value, the directional saving runs €15,000–25,000 on energy charges alone, before Leistungspreis management is considered.

Where real-time tariff integration gets complicated

The straightforward case — static time-of-use tariff, predictable departure schedule, all vehicles same model — rarely represents the full complexity of an operating fleet. Several complications deserve explicit discussion.

Dynamic tariff contracts and supplier risk. Spot-indexed electricity contracts carry price risk. On most nights, overnight wholesale prices are well below day-ahead averages and the scheduling arbitrage is strongly positive. But during severe grid events — cold snaps, generation outages, network congestion — intraday prices can spike dramatically. A fleet with a fully spot-indexed contract and no price ceiling has exposure to very high energy costs on those nights, even if the scheduler correctly responds to the prices. Fleet operators considering dynamic tariff contracts should model their worst-case energy cost under historical extreme price scenarios, not just the median case.

Intraday price changes during charging windows. The scheduler optimises based on day-ahead prices and intraday forward curves. If a large wind farm trips offline at 01:00 and intraday prices spike from 40 €/MWh to 180 €/MWh during an active charging window, the scheduler may not have real-time intraday price visibility unless the integration pipeline includes continuous intraday price polling. This is a data pipeline design choice that affects the hardware and software complexity of the integration.

We're not saying that tariff integration replaces transformer management. Both constraints are active simultaneously: the transformer limit is a hard physical bound that cannot be relaxed by any tariff argument, and the departure SoC requirement is a non-negotiable operational constraint. Tariff optimisation operates within the feasible space defined by these hard constraints — it doesn't override them. A scheduling engine that ignores the transformer limit in pursuit of cheap-energy windows is operationally dangerous.

Measuring tariff integration value: the right metrics

The natural metric for tariff integration value is the difference between the actual weighted-average Arbeitspreis paid (total energy cost divided by total kWh consumed) and the counterfactual flat-rate price. For a well-tuned tariff-aware scheduler on a TOU contract, this difference should be 20–35% lower than the average daily flat rate across the same period. On spot-indexed contracts with strong overnight wind generation (common in northern Germany), the average purchase price achieved can be 40–55% below the day-ahead average.

A more operationally relevant metric is the scheduling success rate: the percentage of nights where 100% of vehicles met their departure SoC requirement while staying within the transformer limit and tariff budget. That rate should be at or near 100% except during exceptional events (vehicle arriving with an unexpectedly depleted battery that requires emergency charging at peak prices, or a CPMS communication failure). When that rate drops below 98%, the root cause is almost always either departures scheduled too aggressively relative to available overnight charging window, or transformer headroom set too conservatively for the fleet's actual overnight demand.