I use an electric car more than once a month.
The car is not charged at a wallbox at home, so one of the cheaper ways to charge the car is with an Ionity subscription.
There are two subscription plans that reduce the price a lot: Power and Motion.
Example calculation for the Power subscription (€11.99):
# (price without subscription) - (price with power subscription)
€0.75/kWh - €0.39/kWh = €0.36/kWh
# subscription price divided by savings
€11.99 / 0.36 = 33kWh
So the break-even is at 33kWh in a month.
When regular charging at Ionity this is worth it really fast.
The cheaper Subscription (Motion) has a break-even at 23kWh, but the Power subscription with €0.10/kWh less, is obviously better after 33kWh.
I track all my expenses with the plain text accounting tool hledger.
So for every subscription and charge I have records.
Some example records, exported with
`hledger register Expenses:Car:Ionity -O csv > expenses-ionity.csv`:
"txnidx","date","code","description","account","amount","total"
"7260","2025-10-21","","Ionity Power Monthly","Expenses:Car:Ionity:SubPower","€11.99","€11.99"
"7262","2025-10-21","","Ionity Charge","Expenses:Car:Ionity:Charge39","€6.96","€19.87"
"7274","2025-10-27","","Ionity Charge","Expenses:Car:Ionity:Charge39","€11.67","€31.54"
"7293","2025-11-04","","Ionity Charge","Expenses:Car:Ionity:Charge39","€9.52","€63.44"
"7312","2025-11-11","","Ionity Charge","Expenses:Car:Ionity:Charge39","€12.67","€76.11"
"7329","2025-11-18","","Ionity Charge","Expenses:Car:Ionity:Charge39","€9.09","€85.20"
"7335","2025-11-20","","Ionity Power Monthly","Expenses:Car:Ionity:SubPower","€11.99","€97.19"
"7364","2025-12-01","","Ionity Charge","Expenses:Car:Ionity:Charge39","€8.58","€105.77"
"7365","2025-12-01","","Ionity Charge","Expenses:Car:Ionity:Charge39","€8.63","€114.40"
"7366","2025-12-01","","Ionity Charge","Expenses:Car:Ionity:Charge39","€7.41","€121.81"
"7397","2025-12-16","","Ionity Charge","Expenses:Car:Ionity:Charge39","€6.49","€132.25"
"7412","2025-12-22","","Ionity Power Monthly","Expenses:Car:Ionity:SubPower","€11.99","€144.24"
"7420","2025-12-29","","Ionity Charge","Expenses:Car:Ionity:Charge39","€14.93","€159.17"
As you can see I named the accounts with the name of the subscription (SubPower) and with the costs per kWh (Charge39).
I did the same for the charges with EnBW and Stadtwerke Stuttgart (but with different paths, i.e. Expenses:Car:EnBW:Charge59).
I haven't subscribed to either, and I don't plan to. I've only used each once, and I'll use them again only if convenience outweighs cost.
Looking at the data it is obvious that the Ionity subscription is worth it.
But I would actually like to know what I paid per kWh.
For this we need to establish one other detail.
The date in the ledger is not the charging date, but the transaction date on my banking account.
For example the Power subscription starts every 17th, but the transaction is between the 20th and the 22nd.
And for the charges it is the same.
They have happened in the days before and depending if weekends were between them this could be 2-5 days.
So some inaccuracies are expected and would be hard to remove completly (i.e. with parsing the pdf invoices from Ionity).
Code to calculate the actual costs:
import csv
from datetime import datetime
from decimal import Decimal
POWER_MONTHLY, POWER_RATE = Decimal("11.99"), Decimal("0.39")
# update csv with: hledger register Expenses:Car:Ionity -O csv > expenses-ionity.csv
rows = [
(
datetime.strptime(r["date"], "%Y-%m-%d").date(),
Decimal(r["amount"].replace("€", "").replace(",", ".")),
r["account"],
)
for r in csv.DictReader(open("expenses-ionity.csv"))
]
rows.sort()
sub_dates = [d for d, _, a in rows if "SubPower" in a]
periods = {d: [] for d in sub_dates}
for date, amount, account in rows:
if "Charge39" in account:
periods[max(d for d in sub_dates if d <= date)].append(
(date, amount, amount / POWER_RATE)
)
elif "SubPower" not in account:
raise ValueError(f"only Charge39/SubPower supported, got {account}")
total_kwh, total_cost = Decimal(0), Decimal(0)
for charges in periods.values():
period_kwh = sum(kwh for _, _, kwh in charges)
for date, cost, kwh in charges:
sub_share = POWER_MONTHLY * kwh / period_kwh
print(
f"{date} {kwh:6.2f} kWh €{cost:6.2f} + €{sub_share:5.2f} sub -> €{(cost+sub_share)/kwh:.3f}/kWh"
)
total_kwh += period_kwh
total_cost += sum(c for _, c, _ in charges) + POWER_MONTHLY
print("-" * 70)
print(
f"Total: {total_kwh:6.2f} kWh €{total_cost:6.2f} -> €{total_cost/total_kwh:.3f}/kWh average"
)
This results in a table with all charges and adds the actual cost per kWh for every subscription period:
2025-10-21 17.85 kWh € 6.96 + € 1.67 sub -> €0.484/kWh
2025-10-27 29.92 kWh € 11.67 + € 2.80 sub -> €0.484/kWh
2025-11-04 24.41 kWh € 9.52 + € 2.29 sub -> €0.484/kWh
2025-11-11 32.49 kWh € 12.67 + € 3.04 sub -> €0.484/kWh
2025-11-18 23.31 kWh € 9.09 + € 2.18 sub -> €0.484/kWh
2025-12-01 19.00 kWh € 7.41 + € 2.86 sub -> €0.540/kWh
2025-12-01 22.00 kWh € 8.58 + € 3.31 sub -> €0.540/kWh
2025-12-01 22.13 kWh € 8.63 + € 3.33 sub -> €0.540/kWh
2025-12-16 16.64 kWh € 6.49 + € 2.50 sub -> €0.540/kWh
2025-12-29 38.28 kWh € 14.93 + €11.99 sub -> €0.703/kWh
----------------------------------------------------------------------
Total: 246.03 kWh €131.92 -> €0.536/kWh average
The last month is ongoing which skews the total value a bit.
I have a Forgejo action running a version of this script that generates a report per subscription period and commits it to my plain text accounting repository.