The electricity spot price is not what you pay. It is the first term of a sum, and everything that makes it into a bill — the supplier's cut, the network, the state — comes after it.
That gap is where almost every wrong cost figure comes from. Feed a wholesale price into a dashboard and the number comes out too low; add your contract's parts to a price that already contains them and it comes out too high. Both look the same from where you are standing: a figure that does not match the bill.
So here is the whole of it, in the order the arithmetic happens.
The two kinds of price
| What it is | What it needs from you | |
|---|---|---|
| Spot | the wholesale price for that period, from the exchange | your contract's components, added on top |
| All-in | what your supplier bills for that period, taxes and all | nothing — it is taken as it stands |
Which kind you have is the single most consequential setting in this whole subject, and it is not a preference: it is a property of where the price came from. An exchange publishes spot. A supplier's own feed publishes all-in. Getting it wrong is not a rounding error — it is the difference between a figure missing half its weight and a figure carrying it twice.
The formula, in full
For a spot source, each 15-minute period is priced like this:
( spot × factor + markup [+ zone rate] + grid fee + energy tax + levy ) × ( 1 + VAT / 100 )
For an all-in source, there is no formula. The price is used as it arrives, and VAT is never applied again — it is already in there.
Component by component, with the words your own bill is likely to use:
| Component | What it is | Called, locally |
|---|---|---|
| spot | the exchange price for the period | Börsenstrompreis, spotprijs, spotpris |
| factor | a multiplier on the exchange price; 1.0 unless your contract scales it | rarely named — if your contract does not mention one, it is 1.0 |
| markup | your supplier's own addition per kilowatt-hour | Aufschlag, opslag leverancier, påslag |
| zone rate | your plan's own rate for that hour, when your contract stacks a time-of-use rate on top of the market | Hochtarif / Niedertarif, piek / dal |
| grid fee | the network operator's charge per kilowatt-hour | Netzentgelte, netbeheerkosten, nättariff |
| energy tax | the state's charge on energy | Stromsteuer, energiebelasting, energiskatt |
| levy | whatever else is charged per kilowatt-hour | Umlagen, ODE, elcertifikat |
| VAT | applied once, at the end, to the sum of everything above. A percent: 19 % is entered as 19, not 0.19 |
MwSt, btw, moms |
Everything is net. VAT is applied once
This is the first of the two mistakes, and it is the common one.
Enter every component without VAT. The grid fee, the energy tax, the levy, the markup — net, all of them. VAT is then applied once, to the sum. Put in a figure that already includes VAT and it is taxed twice, which is exactly the shape of a cost that comes out mysteriously high while every individual number on the screen looks like something off your bill.
Your bill is the trap here, because a bill often shows components with VAT already in them, as the amounts you actually paid. Those are not the numbers to type in — divide them out first. A grid fee printed as 3.50 cents including 19 % VAT is 0.035 / 1.19 = 0.0294 in the field.
And an all-in price is never taxed again. If your source is all-in and you also fill in your contract's components, you are not describing your tariff — you are adding it twice.
One unit, everywhere: per kilowatt-hour, in your currency's main unit
This is the second mistake, and it is the dangerous one, because part of it happens silently.
Every money field is per kilowatt-hour, in the main unit of your currency — EUR/kWh, SEK/kWh, GBP/kWh. Not cents. Not per megawatt-hour. A markup of 2.5 cents goes in as 0.025.
VAT is the exception, because it is not money: it is a percent. 19 % goes in as 19. Entering 0.19 would mean 0.19 % VAT — which is why the formula above carries the / 100.
The public sources are already handled. They quote the wholesale price per megawatt-hour, and the hub divides by a thousand itself; there is nothing for you to convert and nothing to check.
If you push prices yourself, from Home Assistant or your own script, the conversion is yours — and this is where it goes wrong quietly:
- a per-megawatt-hour value of 100 or less — an ordinary spot hour, say 85 — is accepted as
85per kilowatt-hour, with no error at all. Those periods then cost about a thousand times too much; - a value above 100 is rejected, and the push stops there — but the entries sent before it stay stored. A day can end up half priced at a thousand times over and half on the plan.
So the symptom to recognise: a buy price and period costs that are suddenly about a thousand times too high, with no error anywhere. The applied-price log, which keeps 40 days with one row per closed period, is where you confirm it.
⚠️ Again: this is about prices you push, not about the built-in sources. There is one range check — buy and sell between −100 and +100 per kilowatt-hour — and no plausibility check by magnitude. The hub cannot tell an expensive hour from a unit mistake, so this one is on you.
Filling it in, by the shape of your contract
No presets, and the reason is not politeness: suppliers change their terms monthly, so a preset would be a public claim about somebody else's tariff with an expiry date on it — wrong for some readers from the day it is published, and wrong for everyone eventually. Contracts come in a small number of shapes instead:
- Exchange price plus a fixed addition. The common European dynamic contract.
factor= 1.0;markup= your supplier's per-kilowatt-hour addition, net; then the grid fee, tax and levy from your network operator and your country; VAT last. - Exchange price scaled, then an addition. Some contracts multiply the exchange price (a factor above 1.0 covering the supplier's imbalance costs). Same as above, with
factorfrom your terms. - Your supplier publishes the final price. Then use an all-in source, or push their price, mark it all-in, and leave every component empty. Filling them in here is the double-count described above.
If your contract puts a time-of-use rate on top of the market — cheaper at night, on top of spot — that is the zone rate term, and it comes from your plan's zones rather than from the source.
Negative prices, and whether to put a floor under them
When the market goes negative, the hub keeps the negative price and books a negative cost for that period. Under a contract that follows the market, that is the honest reading: consuming during those hours credits you.
If your contract does not pass negative prices through, set a floor — a lowest buy price and a lowest sell price. Left alone, both read "none", and negative prices pass through. The floor is applied last, after everything else in the formula.
Floors exist because a market price can go below zero and your contract may not follow it. Plan rates never go below zero in the first place.
What this figure is not
It is the cost of the energy. Per kilowatt-hour, and only that.
A standing charge — a daily or monthly fixed amount, whatever your country calls it: Grundpreis, vastrecht, netbeheer, a standing charge — is not in it. Nothing you can configure puts it in.
That matters for checking your work, because it gives you two different gaps and they mean different things:
| Your month differs from the bill by… | What it means |
|---|---|
| roughly the net-to-gross difference on your bill | the price kind is probably set wrong — the common case |
| roughly your fixed charge | nothing is wrong; that part was never counted |
Checking it, on the first full day
- Compare against your supplier's own figures, not against a wholesale chart. The chart is the first term, not the answer. The hub's cost figure is gross — VAT included, the same nature as the amount a supplier bills — so it compares directly with theirs. Export is the other way round: a sell price carries no VAT, because none is charged on it.
- Check the magnitude before anything else. A factor of a thousand is a unit mistake, not a tariff mistake.
- Then check the direction. Too high by about the net-to-gross difference on your bill: a component entered gross, or an all-in price with the components also filled in. Too low by the same amount: a spot source with the components still empty.
- Read one period in the applied-price log. It shows which price was used and where it came from, so you can tell a wrong setting from a substituted source.
Where to read more
- Where your price comes from — every field, every failure reason, and the full source list.
- Where the hub gets the price — choosing a source for your zone, and what each asks in return.
- How cost is calculated — the same chain from the measurement side.
- Tariffs and plans — zones, fees and VAT, where a spot source's other half lives.