Battery Health & Degradation
Understand how lithium-ion batteries age, what affects their lifespan, and how to monitor your Zero's battery health through log data.
TL;DR
Li-ion batteries degrade through both calendar aging and cycle aging. Key factors: temperature (avoid extremes), storage SOC (50-70% ideal), and charge cycles. Zero's street and FX packs are 28 cells in series. We deliberately do not publish a cycles-to-80% number — nothing in Zero's manuals states one, and the figures that circulate for these packs are unsourced. What we can tell you is what this site does with a real number: a pack below 70% of nameplate raises an attention finding and below 50% a critical one. Watch the cell spread (B) trend in your logs, and read the measured-capacity section below.
How Lithium-Ion Batteries Degrade
Battery degradation is an inevitable process where the battery's ability to store energy decreases over time. This happens through several mechanisms at the molecular level.
Calendar Aging
Degradation that occurs simply over time, even without use:
- • SEI (Solid Electrolyte Interphase) layer growth
- • Electrolyte decomposition
- • ~2% capacity loss per year at optimal conditions
- • Accelerated at high temperatures or high SOC
Cycle Aging
Degradation from charging and discharging:
- • Lithium inventory loss during cycling
- • Electrode structure breakdown
- • ~0.02% loss per cycle for a typical automotive Li-ion cell
- • Higher C-rates accelerate degradation
Temperature Effects
Temperature dramatically affects degradation rate:
- • Optimal: 15-30°C (59-86°F)
- • >35°C doubles degradation rate
- • Cold charging (<0°C) causes lithium plating
- • Hot storage accelerates calendar aging
SOC Effects
State of Charge impacts battery stress:
- • High SOC (>90%) increases calendar aging
- • Very low SOC (<10%) can damage cells
- • Ideal storage: 50-70% SOC
- • Full charges help cell balancing
Zero Battery Specifications
Every Zero street and FX-family pack is 28 cells in series, from the 2012 ZF6 to the 2026 DSR/X, at roughly 102 V nominal. (The 2026 LS1 / XE / XB light line is the exception, at 74 V.) The manuals never name a cathode chemistry or a cell supplier, so neither do we.
For a health page only two capacity numbers matter, and confusing them is the single easiest way to compute a wrong state of health:
Badge / nominal max
The number in the name — the 14.4 in ZF14.4. This is the pack maximum, and it is the denominator this site divides by when it prints a state-of-health percentage.
Usable / published nominal
The energy Zero says you actually get, quoted on the owner-manual spec sheet as “nominal”. It runs 87.5% to 89.3% of the badge across every pack in the catalogue — never more.
Your pack, in three numbers
Only one of them is wear. Drag the health and watch which part moves.
- What you can ride on today4.58 kWh
- Lost to age — this is the degradation1.14 kWh
- Never yours — the badge counts the same charge at peak cell voltage, from day one0.78 kWh
At 80% health this pack reads 70% of its badge — which is the frightening number, and the wrong one to judge by. Against what it actually gave when new it is 80%. That is an ordinary pack doing its job.
Every Zero pack, badge against usable
| Pack | Badge (max) | Usable | Usable ÷ badge | Years |
|---|---|---|---|---|
| Modular — FX family, one or two removable bricks | ||||
| ZF2.8 | 2.8 kWh | 2.5 kWh | 89.3% | 2013-2015 |
| ZF3.3 | 3.3 kWh | 2.9 kWh | 87.9% | 2016-2017 |
| ZF3.6 | 3.6 kWh | 3.2 kWh | 88.9% | 2019-2023 |
| ZF5.7 | 5.7 kWh | 5.0 kWh | 87.7% | 2013-2015 |
| ZF6.5 | 6.5 kWh | 5.7 kWh | 87.7% | 2016-2018 |
| ZF6.5 (integrated) | 6.5 kWh | 5.7 kWh | 87.7% | 2016-2018 |
| ZF7.2 | 7.2 kWh | 6.3 kWh | 87.5% | 2018-2023 |
| ZF7.2 (integrated) | 7.2 kWh | 6.3 kWh | 87.5% | 2022-2025 (FXE) |
| Monolith — one bonded pack, not user-swappable | ||||
| ZF6 | 6.0 kWh | 5.3 kWh | 88.3% | 2012 |
| ZF8.5 | 8.5 kWh | 7.5 kWh | 88.2% | 2013-2014 |
| ZF9 | 9.0 kWh | 7.9 kWh | 87.8% | 2012 |
| ZF9.4 | 9.4 kWh | 8.3 kWh | 88.3% | 2015 |
| ZF9.8 | 9.8 kWh | 8.6 kWh | 87.8% | 2016 |
| ZF11.4 | 11.4 kWh | 10.0 kWh | 87.7% | 2013-2014 |
| ZF12.5 | 12.5 kWh | 11.0 kWh | 88.0% | 2015 |
| ZF13.0 | 13.0 kWh | 11.4 kWh | 87.7% | 2016-2017 |
| ZF14.4 | 14.4 kWh | 12.6 kWh | 87.5% | 2018-2021 |
| ZF15.6 | 15.6 kWh | 13.6 kWh | 87.2% | 2022-2025 |
| ZF17.3 | 17.3 kWh | 15.1 kWh | 87.3% | 2022-2026 |
| Supplemental — additive; never renames the main pack | ||||
| Power Tank 2.8 | +2.8 kWh | +2.5 kWh | 89.3% | 2014-2017 |
| Power Tank ZF3.6 | +3.6 kWh | +3.2 kWh | 88.9% | 2018-2025 |
| Power Pack Module | +3.6 kWh | +3.2 kWh | 88.9% | 2013-2023 |
Which model carries which pack, and how a badge that covers two different physical constructions gives itself away in your log filenames, is on Battery Fundamentals; full detail on each pack is in the battery catalogue. One footnote: the figures above are the ones Zero prints from model year 2024 on. The MY2022-2023 manuals quoted the ZF15.6 as 13.7 kWh and the ZF17.3 as 15.2 — 0.1 kWh higher in each case — so an older manual will disagree by that much.
Do not apply it to a measured reading. When a Gen3 pack reports its own full-charge capacity (next section), that number is already at badge scale — it reads at or near 100% of nameplate on a healthy bike. Discounting it by a further 0.88 before dividing would manufacture roughly 14 points of state of health out of nothing.
How we put a kWh number on your pack — two of them, never blended
There are two entirely different ways to say how much energy a used pack still holds, and this site computes both and shows them side by side. They share no inputs, so where they agree you can believe them, and where they disagree the gap is itself the finding.
Measured — read out of the pack
Every Gen3 BMS log carries 78-byte health records, and one field in them is the pack's own full-charge capacity in ampere-hours, stored twice a few bytes apart. We take the median across a file after discarding flash sentinels, requiring the two copies to agree within 2% and requiring a plausible 50-250 Ah.
Nothing here comes from a charging session. No SOC arithmetic, no energy totals — so a charge we merely inferred from an SOC gap cannot contaminate it.
Availability: Gen3 BMS logs only — 7 files across 5 bikes in the corpus behind this site. Every other file in it produces no reading at all rather than a wrong one.
Estimated — inferred from your charges
For every charge we know the energy that went in and the SOC it bought, so energy ÷ (SOC gained ÷ 100) is an estimate of the whole pack. We take the median over the good charges — big SOC swings, sane power — rather than the mean, so one odd session cannot dominate.
Charges we recovered from SOC gaps rather than measured are excluded by rule: their energy was itself derived from an assumed pack size, so including them would be circular.
Availability: any generation, given enough real charges. It measures the usable window, so it should land near 0.88 of the measured figure — the deviation from that, not the ratio itself, is the signal.
Ampere-hours to kilowatt-hours: the constant that decides the answer
The register is in ampere-hours and every published Zero figure is in kilowatt-hours, so a pack voltage has to be chosen — and getting it wrong by 12% moves state of health by 12%. We use 115.6 V, which three independent measurements converge on:
- • Series count. Divide logged pack voltage by lowest cell voltage on every Gen3 BMS file and the answer is 28.02. The packs are 28S.
- • Top of charge. The highest cell voltage anywhere in the Gen3 corpus is 4128 mV, at 95% SOC. 28 × 4.128 V = 115.6 V — and that is a floor, because the pack was not yet full.
- • Nameplate ÷ register on the one bike whose nameplate every source agrees on and whose register has not moved: 14,400 Wh ÷ 124.5 Ah = 115.64 V.
The obvious wrong choice is the resting mid-SOC voltage, ~102 V, which is all most log files ever show — it understates capacity by about 12%. Because the constant matters that much, the API echoes it back in every response instead of hiding it, so the arithmetic can be redone by hand.
Why we call it capacity-against-badge and not remaining life
This is the part worth being honest about. Here is every bike in our corpus whose nameplate resolves cleanly, with its own register reading:
| Bike | Badge | Register reads | At 115.6 V | % of badge |
|---|---|---|---|---|
| 2020 SR/F — oldest | 14.4 kWh | 127.4 Ah | 14.73 kWh | 102.3% |
| 2021 SR/F | 14.4 kWh | 124.5 Ah | 14.39 kWh | 100.0% |
| 2024 DSR/X — newest | 17.3 kWh | 144.7 Ah | 16.72 kWh | 96.7% |
Three things are wrong with reading that column as remaining life:
- • Ranked by age, the order is exactly backwards. The oldest bike reads highest and the newest reads lowest — a rank correlation of −1 on three bikes. Real degradation would run the other way.
- • Two of the three sit at or above 100% of their badge. Nothing degrades upward. Those readings are telling us about nameplate rounding and cell-lot variance, not about wear.
- • Two identical packs disagree with each other by 2.33%. The 2020 and 2021 SR/F are the same ZF14.4 one model year apart, and their registers differ by more than either differs from its own badge. That difference is the floor of what this method can resolve.
So the figure is published as capacity against nameplate, ±3 percentage points — a band measured from that scatter, not chosen to look modest — and it is never labelled state of health remaining. A pack reading three points below its badge has told you nothing. A pack reading fifteen points below it has. The stability of the register is what makes the trend the useful part: the two bikes in our corpus with more than one log file read byte-identical across them, one pair a day apart and the other about three months apart, so movement means a relearn or a pack swap rather than measurement noise.
Capacity is one axis, and on its own it is a poor summary
“How healthy is my battery” sounds like one question with one number behind it. It is not. Usable capacity is the headline because it is the one you feel — it is your range — but a pack can hold plenty of energy and still be in trouble, and it can lose a little and be perfectly sound. These are the axes worth reading together.
Usable capacity
How much energy comes back out. Falls slowly and fairly predictably with age and throughput. This is what the ladder above is about, and what a charge measures.
Cell balance, in millivolts
The spread between the highest and lowest cell in the string. A pack is a chain: the weakest cell hits the ceiling first on charge and the floor first on discharge, so it decides when everything else has to stop — however much the other twenty-seven are still holding.
Internal resistance
How hard the pack finds it to deliver current. Shows up as sag under acceleration and as heat, and it rises with age and with cold — which is part of why a winter ride costs more than the thermometer alone suggests.
How it behaves with temperature
A cold pack is a smaller pack — the energy comes back when it warms. A pack that runs hot when nothing is asking much of it, or one whose modules disagree about temperature, is saying something a capacity figure cannot.
The balance one is worth seeing rather than reading about. Both packs below hold almost the same energy; only one of them is fine. Switch between them:
This is why a single percentage is a poor summary, and why this site prints the capacity figure beside its provenance rather than as a score out of a hundred. If your logs carry per-cell voltages, the cell-imbalance trend on your battery page is reading exactly the spread shown above, over time.
Measuring it yourself, at the wall
You do not need us to do this. A cheap energy-metering plug between the socket and the charger will tell you what a charge cost, and if you note the state of charge at both ends you have measured your own pack. There is one trap in it, and it is worth more than the rest of this page.
A plug meter reads the wall, not the battery
Everything the meter counts has still to get through the onboard charger, which gives up something as heat, and past the BMS and the cooling fans, which are awake and drawing for the whole charge. Somewhere between 85% and 92% of what you paid for arrives in the cells. Divide by the state of charge without allowing for that and you will credit your pack with energy it never received.
A worked example, from a real 2016 FXS with a 6.5 kWh badge. The meter read 2.944 kWh for a charge that took the bike from 40% to 96% — 56 points of charge:
| If the charger is | Into the cells | Full pack works out at | Against 5.7 usable |
|---|---|---|---|
| 85% efficient | 2.50 kWh | 4.47 kWh | 78% |
| 88% efficient | 2.59 kWh | 4.63 kWh | 81% |
| 90% efficient | 2.65 kWh | 4.73 kWh | 83% |
| 92% efficient | 2.71 kWh | 4.84 kWh | 85% |
So that pack holds somewhere around 4.5 to 4.8 kWh usable today. Read against the 5.7 kWh it would have given when new, that is roughly 80% of its original usable energy after ten years, which is an ordinary result and not a fault.
Read against the 6.5 on the badge it would look like 71%, and that is the number that frightens people. It should not: the step from 6.5 to 5.7 was true on the day the bike left the factory and is not degradation at all. Only the step from 5.7 to 4.5 is.
Two honest limits on the method. The last few per cent of a charge run at constant voltage with the current tapering, so the energy per point of charge is not quite the same up there as it is in the middle — keep the window away from both ends where you can. And extrapolating from 56 points to a full 100 assumes the state of charge tracks energy linearly, which it does in the middle and does less well at the extremes. Both are errors of a few per cent, not of a third.
When we refuse to print a percentage at all
A percentage needs a denominator, and four sources can supply one: your own declared pack, the bike record, the VIN decode and the model spec table. If they disagree by more than 2% we do not pick a winner — we show the capacity in Ah and kWh and say why there is no percentage. Two of the five bikes in our corpus land there:
2023 SR/F — sources disagree
The VIN decodes to 15.6 kWh, our model spec table says 14.4, and the owner manual for that year says 17.3. The largest is 20% bigger than the smallest, so picking one would set the answer as much as the pack does — we pick none of them.
2021 SR/S — the answer is impossible
Every source agrees on 14.4 kWh and the register reads 16.57 — 115% of it. Either the decode is wrong or there is an undeclared Power Tank on the bike. A pack cannot be at 115% health, so no percentage is printed.
Both are fixed the same way: declare your actual pack in the component configurator. An owner-declared capacity is a human statement rather than a guess, so it wins outright over all four automatic sources and short-circuits the agreement check.
And when there simply are not enough measurements yet
A denominator is only half of it. The other half is how many times we have actually measured your pack — and below four charges the answer is noise. Across our whole fleet, of the sixteen bikes that once reported an impossible figure (over 100% health), thirteen had three measurements or fewer behind them. The same motorcycle, on that little evidence, has read anywhere from 51% to 113%.
So the page now shows a count instead of a percentage until four charges have counted — “2 of 4”, filling as they arrive. It is not a low score. It is a statement about our evidence, not about your battery, and an unmeasured pack is not a damaged one.
What makes a charge count
It has to lift the pack at least 15 points of how full it is, and the log has to record the energy that went in. A charge from about 60% to full is worth roughly twice a top-up from 80%: how full the pack is gets stored as a whole percent, so the bigger the lift, the less that rounding matters. Under 15 points we discard it entirely — across the fleet that is 1,256 charges, and 364 of them missed by five points or fewer.
Rides are shown on the capacity chart but do not count toward the four. On the bikes that log both, a ride implies about 83% of what the same pack’s charges imply, because the state-of-charge drop it divides by is inflated by voltage sag and regen. Two errors partly cancelling is not a measurement.
This matters most on Gen3 bikes, which log far fewer usable charges than Gen2 — a median of two against eight. It is why a 2023 SR/F can show a full page of telemetry and still say it is measuring.
Degradation Simulator
Use the sliders below to model how different factors affect battery degradation over time. This is a simplified educational model based on general Li-ion research.
Battery Pack Size
Battery Age
Total Charge Cycles
Average Storage SOC
Optimal: 50-70%. Avoid storing at 100% or below 20%.
Average Operating Temperature
Optimal: 15-30°C. High heat accelerates degradation significantly.
10-Year Capacity Projection
Visualizing Cell Degradation
Watch how individual cells in a battery pack degrade over time. Notice how cell capacities diverge as the pack ages, leading to increased imbalance.
Battery Degradation Animation
- • SEI layer growth on electrodes
- • Lithium inventory loss
- • Cell-to-cell capacity divergence
Signs of Degradation in Your Logs
| Indicator | Healthy | Warning | What It Means |
|---|---|---|---|
| B (cell spread, H − L) | ≤ 40 mV excellent 41-80 mV normal | 81-120 mV moderate > 120 mV significant | Cell capacity divergence. These are the bands our diagnosis engine fires on, applied to the report-level average — a single high reading under load or at low SOC is normal |
| Voltage Sag | <8V under load | >12V under load | Increased internal resistance |
| SOC Accuracy | Consistent | Jumps/Inconsistent | BMS calibration drift |
| Charge Time | As expected | Significantly shorter | Reduced usable capacity |
| Range per Charge | Stable | Noticeably reduced | Lower total energy storage |
For scale on the first row: across 10,555 real BMS discharge rows from four log files in our corpus, the median cell spread is 5 mV, 98.4% of rows sit at or under 40 mV, and only 0.2% exceed 120 mV. A pack in the 41-80 mV band is unremarkable, which is why nothing is raised there — the previous version of this table called 60 mV a warning while the product called the same reading normal.
How to Maximize Battery Life
Daily Use Tips
• Charge to 80-90% for daily commuting
• Avoid depleting below 20% regularly
• Let the bike cool after hard riding before charging
• Use Eco mode when you don't need full power
• Full charge monthly to allow balancing
Storage Tips
• Store at 50-70% SOC for extended periods
• Keep in cool, dry location (15-25°C ideal)
• Avoid storing at 100% or below 20%
• Check and top-up monthly during storage
• Avoid direct sunlight on parked bike
Charging Tips
• Avoid charging in extreme temperatures
• Don't leave plugged in at 100% for days
• A slower charge is gentler; use the wall socket when you are not in a hurry
• Occasional full charges help cell balancing
• Unplug when charge completes
Avoid
• Charging at the pack's maximum rate every single time
• Charging below 0°C (32°F)
• Leaving at 100% for weeks
• Running to 0% repeatedly
• High-power riding followed by immediate charging
Module-Level Diagnostics
As of May 2026 the parser captures per-module data from MBB Contactor events on Gen2 packs. Multi-brick configurations (e.g. FXS, dual-Long-Brick) now expose individual module voltages and balance metrics, which makes a single weak brick visible long before the BMS pack-level signals do.
Per-Module Voltage Imbalance
Each module reports its own pack voltage on every contactor event. Thevoltage_difference_voltsfield records the spread across modules:
- • <0.05 V — healthy parallel pack
- • 0.05-0.20 V — early divergence, watch the trend
- • > 0.20 V — one brick is degrading or has an open cell
Precharge Health
Before the main contactor closes, a precharge resistor brings the capacitor up. A healthy bike reachesprecharge_percent ≥ 85%in under a second:
- • 85–95% — normal
- • 70–85% — degraded precharge resistor or contactor wear
- • <70% — failure imminent, replace soon
Open-Circuit Cell Voltage (OCV)
Cell voltage measured with no load (voltage_unloaded_cell_volts) is the truest indicator of state-of-charge — load voltage sags under discharge and overshoots during charge.
- • OCV vs loaded voltage gap quantifies internal resistance
- • Growing gap over time = aging cells
- • Now extracted for Gen2 BMS too (was Gen3-only before May 2026)
Module Identity Tracking
Each module logs its ownserial_number. Useful for:
- • Detecting a module swap (warranty replacement)
- • Tracking a specific brick's health over multiple log uploads
- • Confirming all bricks in a multi-pack config are present
These diagnostics live in thelog_entries.raw_dataJSON column — surfaced in your dashboard's battery-health views and accessible via the API. Look for them on Gen2 logs (FXS, S, SR, DS, DSR, FX with multi-brick packs); single-brick configs only emit one set of values per contactor event.
Sources:
Battery degradation information is based on general Li-ion research and may vary for specific Zero models. For warranty information and official battery specifications, consult your Zero Owner's Manual.