With a dynamic price contract, the energy part of your bill follows the wholesale market instead of a fixed rate. Cheap hours get cheaper, sometimes close to zero or below, and the evening peak gets more expensive. Whether that saves money depends almost entirely on one thing: how much of your consumption you can move, and whether you move it automatically. Nobody checks tomorrow's prices every afternoon for long.
This guide covers how these contracts work in the EU, using Poland as the detailed example, where to get the price data for automations, which household loads are worth shifting and what the automation logic should look like.
How dynamic prices work
Under Article 11 of the EU electricity directive 2019/944, customers with a smart meter must be able to sign a dynamic price contract with at least one supplier and with every supplier that has more than 200,000 final customers. In Poland, the obligation to offer such contracts applies to suppliers with at least 200,000 final customers and has been in force since 24 August 2024. Smaller suppliers can offer such contracts too, and some do.
The price usually comes from the day-ahead market. Across the EU, the day-ahead auction runs at 12:00 CET for delivery on the following day. Since the delivery day of 1 October 2025, it has used 15-minute intervals instead of hours in all bidding zones (Ireland stays at 30 minutes). So the prices for tomorrow are known today, in 15-minute steps.
In Poland, the reference is the day-ahead market (RDN) of the Polish Power Exchange, TGE. According to the regulator URE's 2026 report on dynamic contracts, all offers it analysed tied the price to TGE's Fixing I, and prices for day n are published on day n-1 at 13:30. URE's advice follows from that: plan the next day's consumption each afternoon after 13:30.
What the contract really changes
Only the energy price is dynamic. Network charges, taxes and fixed fees are still on the bill. URE points out that the fixed, consumption-independent part of a bill is relatively large, so shifting consumption takes a lot of effort for a relatively small reduction of the total.
The contract formula matters as much as the market. In the offers URE analysed for 2025, Polish suppliers typically took the hourly exchange price, added a cost coefficient and sometimes a margin, and multiplied it by the energy used in that hour. Five suppliers charged fixed monthly fees. One set a floor of 0 PLN/MWh, which means negative prices weren't passed on, and a cap of 4,000 PLN/MWh. Read the formula before signing, not after the first bill.
Some Polish distribution system operators now offer tariffs designed for active customers, which add a second price signal on the network side. URE lists Tauron Dystrybucja's G14 Dynamic (since 1 January 2025, with zones driven by the transmission operator PSE's "Kompas energetyczny" signals), Energa-Operator's G11f (from 30 May 2025) and Enea Operator's G12eco and G13active (from 1 August 2025).
You also need a smart meter with remote reading. In Poland, distribution operators have to install them at 80% of metering points by the end of 2028. At the end of 2025, about 48% of household metering points had one, according to URE. Without one, you would typically have to pay for the installation yourself.
When prices are low
URE's analysis of Polish day-ahead prices in 2025 shows a clear seasonal pattern:
- in summer, average hourly prices are lowest in the early afternoon (11:00-16:00), when solar generation peaks
- in winter, the lowest prices fall in the night (1:00-6:00)
- in both seasons, the peak is usually in the evening (18:00-21:00)
This has a consequence for homes with solar panels. URE found that prosumers made up 73% of household customers on dynamic contracts at the end of 2025, but they may find it harder to benefit. The cheapest hours coincide with the hours when their own panels cover their consumption anyway. A home battery changes that, because it lets you buy cheap energy at night in winter and avoid the evening peak.
Where to get the price data
You need tomorrow's prices in a machine-readable form. There are several sources, and the right one depends on your market and your platform.
- The exchange itself. TGE publishes day-ahead results on its website, including a page dedicated to dynamic prices. Use it to check what your contract is based on.
- ENTSO-E Transparency Platform. The European transmission operators' platform publishes day-ahead prices for European bidding zones through a REST API. You need a free account and a security token: register, send an email to [email protected] with "RESTful API access" in the subject and your registered address in the body, wait for confirmation (up to 3 working days), then generate the token under "My Account". Day-ahead prices are document type
A44. - Nord Pool. Home Assistant, for example, has a built-in Nord Pool integration that creates sensors with spot prices for chosen market areas. Its documentation notes that it shows only the base energy price, without VAT or other costs.
- Your supplier. Some suppliers publish their final prices in their own app or portal. These include their margin, but they are rarely available through an API.
Whichever source you use, remember that the market price is in EUR/MWh or PLN/MWh, while your bill is in PLN/kWh or EUR/kWh, and your supplier adds its own components. For deciding when to run a load, the raw market price is usually enough, because you're comparing intervals with each other. For calculating cost, use your contract formula.
Which loads are worth shifting
The best candidates are loads that are large, flexible in time and able to store energy in some form.
Electric water heater. A tank heater stores heat for hours. Heating the tank in the cheapest intervals and letting it coast through the evening peak is the simplest win. A resistive heater of a few kilowatts must be switched with a contactor rated for the load, installed by an electrician, not with a smart plug.
Heat pump. Many heat pumps have an SG Ready input. In version 1.1 of the specification (valid from 1 May 2025), two signals, SG1 and SG2, select three states: limited consumption (SG1 on), normal operation (both off) and boost mode (SG1 off, SG2 on), in which the heat pump raises target temperatures in the buffer or hot water tank. The control voltage is defined by the manufacturer, anywhere between 3 and 250 V, so drive the inputs with relay contacts as described in the installation manual. Boost in cheap intervals, and use the limited state carefully, because the building still has to be heated.
Electric car. An EV usually has the largest flexible load in the house and a long parking window. Charging only in the cheapest intervals overnight (or at midday on a summer weekend) is easy to automate if the charger or the car has a local or cloud API.
Home battery. Charging in cheap intervals and discharging in the evening peak is exactly what a battery is for. Make sure the price spread covers conversion losses before you build schedules around it.
Washing machines and dishwashers. They're flexible, but a single cycle uses relatively little energy. A delayed start is nice, but don't expect it to change much.
Automation logic
The core problem is the same on every platform: given tomorrow's prices in 15-minute intervals, pick the cheapest window for each load. Here's the logic in plain Python, which you can translate to Node-RED, Home Assistant templates or any other system:
def cheapest_block(prices, slots_needed, start_idx=0, end_idx=None):
"""prices: list of (start_time, price) for 15-minute intervals.
Returns the start index of the cheapest contiguous block."""
end_idx = end_idx or len(prices)
best_start, best_cost = None, float("inf")
for i in range(start_idx, end_idx - slots_needed + 1):
cost = sum(p for _, p in prices[i:i + slots_needed])
if cost < best_cost:
best_start, best_cost = i, cost
return best_start
# Example: a 2-hour run is 8 intervals, anywhere in tomorrow's 96
start = cheapest_block(prices, 8)
A contiguous block suits loads that shouldn't start and stop often, like a heat pump or a washing machine. For a water heater or an EV, picking the N cheapest individual intervals is fine and often cheaper.
Some rules that make the automation reliable:
- Compute the plan once a day, after the prices are published. Store it, then switch loads according to the stored plan. Don't recompute every 15 minutes.
- Always have a fallback. If the prices don't arrive (API down, token expired, network problem), run the load on a fixed schedule, such as the night hours. Cold water or a flat car battery costs more than a few expensive kilowatt-hours.
- Set limits that comfort can't cross. Minimum water temperature, minimum car charge by morning, minimum room temperature. Price logic decides when, not whether.
- Log what happened. Record when each load ran and at what price. After a month you'll know if the effort pays off.
- Use the time zone correctly. Market data is often in UTC or CET. Check how your source handles daylight saving time, because those days have 92 or 100 intervals instead of 96.
Common mistakes
- Comparing only the exchange price with your old tariff. Add your supplier's coefficient, margin and fixed fees.
- No flexible load. Without a water heater, heat pump, EV or battery to shift, a dynamic contract mostly adds risk.
- Assuming hourly data. Since October 2025, the day-ahead market runs in 15-minute intervals, so automations written for 24 values a day may need updating. Check in your contract whether your price is set per hour or per 15 minutes.
- Switching big loads with smart plugs. Use contactors and the device's own control inputs.
- Forgetting about your solar panels. If your panels already cover midday consumption, the cheap summer hours bring you less than you think.