Why Your Battery Says 100% But Shuts Down

SOC drift from BMS measurement limits, why it gets worse with bigger banks, and how to fix it.

The Measurement Blind Spot

Your lithium battery's BMS estimates state of charge by counting amp-hours in and out, a method called coulomb counting. This works well at normal loads. The problem is at the bottom of the measurement range.

Most internal BMS current sensors use a shunt resistor. At very low currents (below roughly 0.5A to 0.7A depending on the battery), the voltage drop across the shunt is so small it falls within the sensor's noise floor. The BMS reads it as zero.

Your inverter on standby might draw 0.4A. A router pulls 0.2A. A Cerbo GX draws 0.15A. None of these register on most internal BMS sensors. The coulomb counter stays frozen while the battery drains.

You might wonder why the BMS can't just use voltage instead. LiFePO4 has an extremely flat voltage curve through the middle of its charge range. A 12V battery sits between roughly 13.0V and 13.3V from about 20% to 90% SOC. That 0.3V window covering 70% of usable capacity makes voltage nearly useless for mid-range SOC estimation. The BMS has no choice but to rely on coulomb counting, and coulomb counting is only as good as the current sensor.

The Math: Single Battery

One 12V 100Ah battery with a combined standby load of 0.5A that the BMS cannot measure:

After 24 hours: 12Ah consumed. BMS reads 100%. Actual: 88%.

After 3 days: 36Ah consumed. BMS reads 100%. Actual: 64%.

After 7 days: 84Ah consumed. BMS reads 100%. Actual: 16%.

Around day 7, cell voltage drops off the flat part of the LiFePO4 curve and falls rapidly. The BMS hits low-voltage disconnect. From the app's perspective, the battery went from "full" to "dead" with no warning. No gradual decline. Just 100%, 100%, 100%, dead.

This is exactly what happens with RVs, boats, and off-grid cabins sitting in storage with an inverter on standby.

The Scaling Problem

When batteries are connected in parallel, total system current splits across every battery in the bank. Each BMS only measures the current through its own terminals.

If one battery's BMS can't measure below 0.5A, then with 4 batteries in parallel the system needs at least 2A total before any BMS counts accurately. With 10 batteries: 5A. With 25 batteries (not unusual for a large off-grid home with days of reserve): 12.5A minimum.

At 48V, 12.5A is 600 watts.

A fridge, LED lights, a router, security cameras, and monitoring equipment could easily total 200W to 400W. In a 25-battery bank, every watt of that is invisible to every BMS in the system.

On that 25-battery bank at 48V (120kWh total), an invisible 300W load consumes roughly 150Ah per day that every battery reports as zero. After two days, the bank has lost 12% of its capacity and every battery still reads 100%.

The bigger the bank, the worse the problem.

And it creates a diagnostic trap. Batteries in a parallel bank don't share current perfectly. Small differences in internal resistance, cable length, and temperature mean some batteries carry slightly more of the load. In a large bank at low draw, a few batteries might carry just enough current to cross the measurement threshold while the rest sit below it.

You check the app, see Battery 7 at 88% while the other 24 read 100%, and concludes Battery 7 is defective. In reality, Battery 7 is the only one telling the truth. Its share of current happened to be large enough for its sensor to measure. The other 24 are equally drained but their BMS boards have no idea.

This is one of the most common misdiagnoses our tech team sees. The battery that "looks bad" in the app is often the one working the most accurately.

Try it: Drag the battery count to 20 and set the load to 400W. Watch every battery in the bank go blind. Then flip on the external shunt and see the difference.

Current Connected

BMS Current Blind Spot Demo

Why every BMS reads zero in large parallel battery banks

Battery Count4
System Load300W
BMS Threshold0.8A
B11.6AmeasuringB21.6AmeasuringB31.6AmeasuringB41.6Ameasuring+EXT. MONITOR6.25AmeasuringSYSTEM48V · 300W6.25A

Each battery sees 1.56A — above the 0.8A threshold. All BMS boards are reading current.

* In real systems, current is not shared perfectly equally across batteries. Differences in internal resistance, cable length, and connection quality cause uneven distribution. [ simulate this ]

* The 0.8A threshold is configurable via the slider above. Actual thresholds vary by BMS manufacturer and model.

Why Full Recharges Fix It, and Why Some Systems Never Get One

When a LiFePO4 battery reaches full absorption voltage (14.4V to 14.6V for 12V, 57.6V for 48V), the voltage rises above the flat part of the curve. The BMS can use this as a reliable reference point to recalibrate its coulomb counter and reset SOC to 100% based on actual cell voltage. This is called a sync event.

During absorption, voltage holds at the setpoint while current tapers down. This is also when the BMS's passive cell balancers do their work, equalizing individual cell voltages within the pack. Cutting the charge short before absorption completes means no SOC recalibration and no cell balancing. Both of these processes need time. A battery that touches 14.4V for 30 seconds and then gets disconnected from the charge source hasn't completed a sync event. The BMS needs to see that voltage sustained while current drops, confirming that the cells are genuinely full and not just momentarily spiking under charge current.

Systems that cycle daily with solar and reach full absorption every day rarely accumulate meaningful drift. The sun does the reset for you. The problem hits hardest in scenarios where that daily reset doesn't happen.

Systems in storage. RVs, boats, and seasonal properties with standby loads and no charging. Drift compounds every day without correction.

Extended cloudy weather. Off-grid systems that go days without enough solar to reach full absorption. Each partial charge day is another day without a sync event.

Generator-dependent systems. This is a big one. Customers running off a generator often watch the SOC reading and shut the generator down as soon as the batteries show 100% to save fuel. But if the batteries have been drifting, that 100% reading could be 85% or 75% in reality. The generator charges until the already-wrong coulomb counter ticks to 100%, the owner kills the generator, and the system is right back where it started with less actual charge than the display suggests. Worse, if the charge session was short enough that the batteries never truly reached absorption voltage and held it, the BMS didn't get a sync event, so the drift carries forward into the next cycle. The fuel-saving instinct works against accurate monitoring.

Systems that intentionally limit charge to 90%. This one surprises people. Some owners configure their charge controllers to stop at 90% SOC via CAN bus communication, believing it extends cycle life. This advice is carried over from phone and laptop lithium cobalt chemistry, where high-voltage stress does degrade cells. But LiFePO4 is a different chemistry entirely.

The result is that the batteries never reach the voltage where the BMS can recalibrate. The system is permanently locked out of sync events. And because SOC is already drifting from unmeasured loads, the 90% the system thinks it's stopping at might actually be 72%. The owner is carefully managing a number that's wrong, and their charging strategy is the reason it stays wrong.

For LiFePO4 specifically, charging to 100% regularly is not harmful. LiFePO4 does not suffer from the same high-voltage stress degradation as cobalt-based chemistries. Reaching full absorption daily is not just safe, it's necessary for accurate monitoring and proper cell balancing.

The Fix: Measure Current in One Place

The fundamental problem is that each battery's BMS measures its own fraction of total current with a sensor that isn't precise enough for small loads. The fix is to measure total system current at a single point with a purpose-built monitor.

An external shunt-based battery monitor sits on the main negative bus between your battery bank and the rest of your system. Every amp in or out passes through one shunt. These devices measure down to the milliamp level. A 0.3A standby draw that's invisible to 25 individual BMS boards is clearly visible to an external shunt.

The external monitor becomes your system's true SOC source. You still have each battery's BMS for cell-level protection (overvoltage, undervoltage, overcurrent, temperature), but you stop relying on them for system-level state of charge.

One caveat for internally heated batteries. If your batteries have built-in heaters (common in cold-climate LiFePO4 packs), the heater current flows inside the battery enclosure. It never passes through the external shunt on the main bus, so the shunt can't see it. During cold weather when heaters are cycling, the batteries are consuming energy that neither the individual BMS nor the external shunt is accurately accounting for. This is a smaller source of drift than unmeasured system loads (heaters typically only run intermittently in cold conditions), but it's worth knowing about. If you're in a climate where your battery heaters run frequently, factor in that your actual capacity is reduced by the heater draw and your SOC tracking will be slightly optimistic during cold periods.

Every lithium battery using coulomb counting with an internal shunt is subject to this limitation. The threshold varies by manufacturer, but the fundamental problem is universal. We are actively testing specific batteries to identify any that handle low-current measurement better than others, and we'll update this page with our findings.

This is one of the most common misconceptions we encounter. CAN bus is a communication protocol. It transmits whatever data the battery's BMS reports. If the BMS coulomb counter has drifted because it can't measure low current, CAN bus faithfully delivers that wrong number to your inverter, your display, and your monitoring app. The inverter shows 95% because the battery told it 95%. The battery said 95% because its BMS counted zero amps for three days. Everyone in the chain is trusting data from a sensor that couldn't see the load. CAN bus doesn't add measurement accuracy. It just moves the BMS's data (accurate or not) to other devices in the system. An external shunt on the main bus is the only way to get an independent, accurate current measurement.

Drift itself doesn't cause damage. The damage happens when drift leads to discharge below safe minimums without the system or the owner knowing. Deep discharge below the BMS low-voltage cutoff stresses cells and reduces cycle life. The BMS will eventually intervene, but by that point the batteries may have been stressed in ways that shorten their lifespan.