"How many batteries do I need" usually gets answered by dividing daily load by one battery's capacity, and that answer is wrong twice over. It ignores how many days the bank needs to cover without any charging at all, and it treats every battery's usable capacity as equal to its rated capacity — which is true for almost no battery chemistry actually sold for this use.

The formula, and the two numbers everyone skips

Bank sizing on this site runs through two functions: OffgridEngine.requiredAh() to size the bank, and OffgridEngine.bank() to check what a specific battery count actually delivers. The required-capacity formula is:

Ah = (dailyWh × daysAutonomy) / (usableDoD × systemV)

Every term after dailyWh is the part a back-of-envelope calculation tends to drop:

Skip either one and the answer is a bank sized for "an average day with no cushion," which is a different, much riskier design than the one most people think they're building.

Why usable DoD varies so much by chemistry

The verified battery catalog in this site's database makes the spread concrete rather than theoretical. Pulling usable DoD directly from the catalog:

Usable depth of discharge, verified catalog entries
BatteryChemistryCapacityUsable DoD
Renogy Deep Cycle AGM 12V 100AhAGM100 Ah0.50
Lifeline GPL-4CT 6V AGMAGM220 Ah0.50
Rolls S6 L16-HC 6V FloodedFlooded445 Ah0.50
LiTime 12V 100Ah (Group 31)LiFePO4100 Ah0.80
Renogy Pro 12V 100Ah Self-HeatingLiFePO4100 Ah0.80
Battle Born BB10012LiFePO4100 Ah1.00
LiTime 12V 200Ah Xtra MiniLiFePO4200 Ah1.00

Lead-acid chemistries — AGM and flooded alike — sit at 0.50 across every verified entry in the catalog: discharging a lead-acid battery much past half its rated capacity on a regular basis shortens its cycle life sharply, so the manufacturers' own guidance caps routine usable capacity there. LiFePO4 entries range from 0.80 to a full 1.00, because the cell chemistry tolerates deep, regular discharge far better and doesn't suffer the same cycle-life penalty for using most of its rated capacity. That's not a marketing number — it's the reason a 100Ah LiFePO4 battery and a 100Ah AGM battery, despite the identical capacity rating on the label, deliver very different amounts of usable energy.

A worked comparison: identical load, identical autonomy target, two different banks

Take a system with a 1,200 Wh daily load and a 2-day autonomy target — a reasonable cushion for a system without a backup generator. Size a bank against the LiTime 12V 100Ah LiFePO4 battery (12.8V nominal, 0.80 usable DoD) and separately against the Renogy 12V 100Ah AGM battery (12V nominal, 0.50 usable DoD), both run through Calc::requiredAh() and Calc::bank():

Same 1,200 Wh/day load, same 2-day autonomy target
BatteryRequired AhBatteries needed (100Ah each)Actual bankActual autonomy delivered
LiTime 100Ah LiFePO4 (0.80 DoD)234.4 Ah3300 Ah / 12.8V / 3,072 Wh2.56 days
Renogy 100Ah AGM (0.50 DoD)400.0 Ah4400 Ah / 12V / 2,400 Wh2.00 days

The AGM path needs 400 Ah of rated capacity to cover the same load and autonomy target that the LiFePO4 path covers with 234.4 Ah — 71% more rated capacity for an identical use case, because half of every AGM Ah is off-limits for routine use while only a fifth of every LiFePO4 Ah is. In battery count at this capacity size, that's four AGM units against three LiFePO4 units; in physical footprint and weight it's worse than the unit count alone suggests, since a 100Ah AGM battery is also considerably heavier than a 100Ah LiFePO4 unit of the same rated capacity. The LiFePO4 bank in this comparison also overshoots the 2-day target slightly (2.56 days) simply because three whole batteries were needed to clear 234.4 Ah — a rounding effect that works in the lithium bank's favor here, and is worth checking with Calc::autonomyDays() any time a required-Ah number doesn't divide evenly by a battery's rated capacity.

Why the gap isn't purely the DoD ratio

0.80 versus 0.50 usable DoD alone would predict a 1.6× difference in Ah needed, but the actual ratio in the worked example above is 1.71×, not 1.6×. The rest of the gap comes from nominal voltage: LiFePO4 cells nominally sit at 12.8V rather than lead-acid's 12V, so the same Wh requirement translates to a slightly lower Ah requirement at the higher voltage — requiredAh() divides by usableDoD × systemV, and both terms move in the same direction for LiFePO4. Neither effect is large on its own, but they compound, which is exactly why running the actual numbers through the formula matters more than reasoning from the DoD figures alone.

Try it with your own load and battery

Enter a daily load, a target autonomy in days, and a battery's capacity, nominal voltage and usable DoD from its own datasheet.

Ah required: 234.4 Ah

Batteries needed (parallel): 3

Actual autonomy delivered: 2.56 days

What happens when the autonomy target is skipped entirely

Sizing a bank against one day's load with no autonomy margin at all is the same formula with daysAutonomy = 1, and it produces a bank that runs out the moment a single day underperforms — a longer-than-usual cloudy stretch, an unplanned extra day parked without driving, one appliance left running longer than planned. This site's rule engine flags exactly that condition: the autonomy-low predicate checks the ratio of actual bank Wh to daily load Wh via autonomyDays(), and warns once that ratio drops under 1.5 days, on the reasoning that anything less leaves no real margin for a below-average day. A bank sized to the formula above with an explicit, chosen autonomy target — not the default, not zero — is the only way to know in advance which side of that line a build lands on.

That 1.5-day threshold isn't an arbitrary round number picked for convenience — it's the point below which even a mildly worse-than-average day, not a genuine multi-day outage, starts eating into the next day's starting charge. A bank sitting right at 1.0 day of autonomy has no cushion at all: it assumes every single day generates enough to fully replace what was drawn, which is an assumption solar generation in particular almost never satisfies cleanly, since output varies with weather day to day even at a location with a good annual average. The gap between "sized for the average day" and "sized to survive a below-average day" is exactly what the autonomy multiplier in the formula is there to buy, and the size of that gap is a decision every build has to make explicitly, in writing, before wiring anything, rather than something to inherit by accident from whatever number a spreadsheet template happened to have left in that cell.

Parallel strings and why series count matters separately

OffgridEngine.bank() takes both a parallel count and a series count, and they do different jobs. Parallel batteries (countParallel) add capacity: more Ah at the same nominal voltage, which is what every calculation on this page has been sizing. Series batteries (countSeries) add voltage: two 12V batteries in series make a 24V bank at the same Ah rating, not a bank with more energy at 12V. Both change the resulting bank_wh, since energy scales with both capacity and the multiplied bank voltage, but only parallel count is the lever that answers "how many days can this load run" at a fixed system voltage — mixing the two up is a common way to end up with a bank at the wrong voltage for the rest of the system even when the Wh total looks correct on paper.

What this means for a build

Three practical consequences follow directly from the formula, not from a rule of thumb:

  1. Pick an autonomy target on purpose, then size to it. Two days is a reasonable default absent a specific reason to change it, but a location with frequent multi-day cloud cover or a vehicle that sits parked for a week at a time needs a larger number plugged in deliberately, not inherited from a default.
  2. Compare batteries on usable Ah, never rated Ah. A 100Ah rating means very different things at 0.50 DoD and 0.80 DoD — the rated capacity on the label is the same number in both cases, and the number that actually matters for sizing is not.
  3. Round up in whole batteries, then check the autonomy you actually got. Required Ah rarely divides evenly by one battery's capacity, and the rounding-up step can hand back more (or, if done wrong, less) autonomy than the original target — running the resulting count back through autonomyDays() is the only way to confirm what was actually built.

The battery catalog lists usable DoD, capacity and nominal voltage for every verified battery in this database, so this comparison can be re-run against any specific pairing under consideration.

These results are for reference. Wiring must be installed by a qualified electrician. Mobile installations follow ABYC E-11; stationary ones NEC 690/706.