Thermal Expansion Tank Calculator for Water Heaters
This thermal expansion tank calculator estimates how much heated water will expand in a closed plumbing system, determines the tank volume needed to accept that expansion at the stated pressures, and selects the next standard tank size with a safety margin.
Run — free
Enter the water heater capacity and cold static pressure for a practical result, or adjust the temperature and maximum pressure assumptions when your installation calls for a more specific design. The result is a sizing aid, not a substitute for local code or manufacturer approval.
Why a closed plumbing system needs expansion capacity
Water occupies more volume as it warms. In an open system, a small amount of expanded water may move back toward the supply main. A check valve, backflow preventer, pressure-reducing valve, or certain meter assemblies can stop that reverse movement and create a closed system. The extra volume then has nowhere to go, so pressure rises each time the water heater completes a heating cycle. Symptoms may include a dripping temperature-and-pressure relief valve, short-lived faucet cartridges, noisy piping, or premature damage to appliances. A thermal expansion tank provides a compressible air cushion that accepts this extra water before system pressure reaches an unsafe level. This calculator starts with the stored water volume and estimates its change between the cold and hot temperatures. It then accounts for how much of a diaphragm tank can actually accept water between the initial system pressure and the chosen maximum pressure. The nominal tank is larger than the expanded-water volume because part of its shell must remain occupied by compressed air.
How the calculator sizes the tank
The calculation uses interpolated water-density values across the supported temperature range. Dividing cold-water density by hot-water density gives the volume ratio, and subtracting one produces the thermal expansion factor. Multiplying that factor by heater capacity estimates the gallons that must be accepted. Tank acceptance is calculated with absolute pressure, not gauge pressure, because gas compression depends on pressure above a vacuum. The tool assumes the tank precharge is adjusted to match the cold static system pressure, a common installation requirement that should be checked against the tank instructions. It divides the expanded-water volume by the available acceptance fraction, then adds a ten percent sizing margin and chooses the next size from a fixed list of common nominal tank capacities. This method makes pressure important: as the cold system pressure approaches the maximum permitted pressure, the air cushion has less compression range and a larger tank is required. The reported calculated volume is the mathematical minimum before margin; the recommended standard size is the practical selection output.
Measure correctly and verify the final selection
Use the water heater's actual storage capacity from its rating plate, not the rounded product name when those values differ. Measure static pressure when no fixtures are flowing, preferably with a gauge that can also record pressure spikes. If a pressure-reducing valve is present, use the downstream pressure. The default maximum is suitable only when it agrees with the system's governing relief rating and local design requirements; choose a lower limit when a component or code requires one. Cold inlet temperature varies by climate and season, while the hot value should reflect the thermostat setting rather than a momentary faucet reading. After receiving a result, confirm that the selected tank's published acceptance volume at your precharge and pressure range meets or exceeds the calculated expansion volume. Nominal capacity alone does not guarantee identical acceptance among manufacturers. Installation location, orientation, support, potable-water certification, and precharge procedure also matter. Have a qualified plumbing professional review unusual systems, high pressures, multiple heaters, recirculation arrangements, or any installation with repeated relief-valve discharge.
What you can do with it
Replace a water heater in a closed system
Estimate an appropriate expansion tank before installing a new storage water heater behind a check valve or pressure-reducing valve.
Investigate pressure rise during heating
Compare heater capacity and static pressure with the tank volume required to absorb a normal heating cycle.
Check a proposed tank size
Use project temperatures and pressure limits to see whether a commonly available nominal tank size clears the calculated minimum.
FAQ
What inputs are required?
Enter the water heater capacity in US gallons and the cold static system pressure in psig. Temperature and maximum-pressure fields have defaults that you can change.
Why is the recommended tank larger than the expanded-water volume?
A diaphragm tank can accept only part of its nominal volume because compressed air occupies the rest. The calculation also adds a ten percent sizing margin before selecting a standard size.
Should tank precharge equal the water pressure?
This calculation assumes the precharge, measured with the water side depressurized, matches the cold static system pressure. Always follow the tank manufacturer's instructions.
Does a dripping relief valve prove the expansion tank is too small?
No. Thermal expansion is one possible cause, but a failed relief valve, excessive supply pressure, incorrect precharge, or a damaged tank can produce similar symptoms.
Can I use the nominal size without checking acceptance volume?
Use the recommendation as a screening value, then verify the manufacturer's acceptance data at your actual precharge and maximum pressure because tank designs differ.
What does the API calculation cost?
The API price is $0.002 per request. The same deterministic calculation is available in the browser for interactive use.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/home/expansion-tank-sizing \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"water_heater_capacity_gal":50,"system_pressure_psi":60}'const res = await fetch("https://api.kit.forhosting.com/home/expansion-tank-sizing", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"water_heater_capacity_gal": 50,
"system_pressure_psi": 60
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/home/expansion-tank-sizing",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"water_heater_capacity_gal": 50,
"system_pressure_psi": 60
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/home/expansion-tank-sizing", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"water_heater_capacity_gal":50,"system_pressure_psi":60}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"water_heater_capacity_gal":50,"system_pressure_psi":60}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/home/expansion-tank-sizing", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"water_heater_capacity_gal": 50,
"system_pressure_psi": 60
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "home.expansion_tank_sizing",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |