What Size Heating System Does Your House Actually Need?
Your thermostat already measured it. Upload a winter's worth of data and find out what your house really requires.
What kind of heating equipment do you have?
This tool reads runtime data, so you'll need an Ecobee thermostat (it logs the runtime data we need). It works best on older, simpler equipment — pick the closest match.
Where's your house?
We use your ZIP code to look up your local design temperature — the cold-weather target your system should be sized for — from 30 years of weather data. Nothing is sent anywhere.
Upload your thermostat data
From your Ecobee, download December, January, and February — one month at a time, then drop all three here together. The tool finds your coldest nights automatically, so more cold-weather data is always better.
How do I download my data from Ecobee?
- Log in to your Ecobee account at ecobee.com
- Select your thermostat (if you have more than one)
- Click Home IQ
- Click System Monitor (bottom right)
- Click Download Data, then download December, January, and February — one month at a time
Ecobee keeps roughly the last 10–12 months. For the best result, grab data from a genuine cold snap. (Some Honeywell models log data to a USB thumb drive — that CSV will work too, if you can get it off.)
Reading your data…
Your system is bigger than your house needs
What size equipment do you actually need?
Tell us about your current equipment and we can tell you. The oversize factor above needed nothing from you — to turn it into a real size in BTUs and tons, we need your equipment's output. Grab a photo of the rating plate and type the details in.
Look for "Output," "DOE Heating Capacity," or "Net Rating." If you only see "Input," multiply by about 0.85.
The model number has the size in thousands of BTU: 024 = 2 ton, 036 = 3 ton, and so on.
A couple of optional questions about your house
These don't change the math — they just help us explain an unusually low number.
Help me make it better
You're one of the first people to try this. If you're willing, I'd love to see how it did on your house — it's the fastest way for me to find where it's still rough. I read every email.
Send me your thermostat CSV file(s), the number the tool gave you, and anything that felt off or confusing. If a contractor has given you a load number or a quote, that comparison is gold.
Email Nate your results →The whole idea, in one sentence
Your heating system can only put out so much heat. Your thermostat already recorded how many minutes per hour it ran. So on the coldest nights, how hard it worked tells you how much heat your house actually loses — no guessing required. If it ran about half the time on the coldest nights, it’s roughly twice as large as your house needs.
Plain-language version
Think of your furnace or heat pump like a faucet, and your house like a bucket with a hole in the bottom. The colder it is outside, the bigger the hole — heat leaks out faster. Your system’s job is to pour heat in as fast as the house loses it.
On the coldest night of the year — your design temperature — a system that’s sized just right has to run almost constantly to keep up. That’s good: it means the faucet matches the hole.
But most systems are far too big. If your system holds your house at temperature while only running half the time on the coldest night, it’s pouring twice as fast as the hole leaks — so it’s about twice the size your house needs. Run a third of the time? Three times too big.
That’s all this tool does: it reads how much your system ran on your coldest nights, compares it to how much heat your equipment can make, and works out how much your house actually needs. An oversized system isn’t a safer one — it short-cycles, controls humidity poorly, and wears out faster. Knowing your real number lets you buy the right size next time.
Nerdy version (the full methodology)
The principle. Delivered heat over an interval = (runtime fraction) × (equipment output capacity). Held at a steady indoor temperature, delivered heat equals the building’s heat loss at that moment. Heat loss is roughly linear in ΔT (indoor minus outdoor), so a handful of cold-night observations locate the line, and we read it at the design temperature.
1. Parse & aggregate. Ecobee CSVs are parsed by column name (formats differ per home). Five-minute records are aggregated to hourly — the outdoor-temp field updates roughly hourly anyway, so the hour is the honest grain.
2. Classify hours. Only steady-state hours count. We discard any hour where the setpoint rose within the prior ~2 hours (morning-recovery pulses inflate runtime with thermal-mass recharge, not load) and any hour where indoor temp sits more than ~1°F below setpoint. Setback hours at a stable lower setpoint are kept, using their actual measured ΔT rather than an assumed 70°F.
3. Isolate the cold nights. We use only night hours (8 PM–6 AM): no solar gain, and the overnight hours of a cold snap sit closest to design conditions, minimizing extrapolation. The tool ranks the nights in your data by how cold they got and analyzes the coldest.
4. Two independent reads. Direct read (primary): average the runtime of clean night hours within ~3°F of design temperature, multiply by equipment output. No extrapolation — it’s a measurement at (or near) the target condition. Regression (cross-check): least-squares fit of delivered BTU/hr against ΔT across all clean night hours, evaluated at design temp, with a 95% confidence interval. When the two agree, confidence is high; when they diverge, the result is flagged directional.
5. Equipment output. Furnaces/boilers: input × AFUE (or plate output), treated as constant with outdoor temp. Heat pumps: a single-stage capacity curve (~60% of nominal at 17°F, ~40% at 0°F, near-linear between) evaluated at each hour’s outdoor temperature, since a heat pump’s output falls as it gets colder.
6. Design temperature. Your ZIP maps to the nearest of 185 weather stations; the 99% heating design temp is computed from 30 years of hourly records (1991–2020). You can override the station — nearest-by-distance isn’t always nearest-by-climate in hilly terrain.
7. Normalization. The load is computed at your actual measured setpoint, then normalized to a standard 70°F indoors (a ΔT ratio) so it’s comparable to a Manual J and a contractor’s quote.
Worked example (a real house). An 80s-built house with an 80,000 BTU input furnace (~96% AFUE → ~76,800 BTU output), design temp 11°F. Across February, 18 clean night hours fell within 3°F of design, averaging 29 minutes of runtime per hour. Direct read: 0.48 × 76,800 ≈ 36,900 BTU/hr, a 2.1× oversize factor. The regression independently gave 34,200 ±1,500 BTU (R² 0.58). A prior manual analysis said ~37K; a Manual J said 34,900. Three methods, one answer.
Honest limitations. (a) The heat-pump curve is a generic single-stage shape, not your exact model. (b) Inverter/modulating equipment can’t be read this way — runtime doesn’t reflect delivered capacity when the unit varies its own output, which is why the tool asks about equipment type up front. (c) Design temps are computed from regional reanalysis data and can differ from a local Manual J by a few degrees, especially in complex terrain. (d) An open-combustion furnace inflates the number by drawing makeup air through the envelope. (e) The R² of the hourly fit is modest (~0.5–0.6) because individual hours scatter with wind, occupancy, and mass lag — but with hundreds of points the line’s position at design is well-determined (typically ±5%). (f) A linear fit is used; whether some leaky houses go superlinear overnight is an open question we’re still gathering data on. Every result carries a confidence tier based on how close your coldest data got to design temperature.
I’d like to thank my old partner Ted Kidd for suggesting the runtime-to-heat-load method. This calculator is built on what he taught me.
This tool reads delivered heat from your thermostat's runtime and projects it to your local design temperature. It's a measurement, not a Manual J — think of it as ground truth. Built by Nate the House Whisperer. Weather data: 30-year hourly records (1991–2020).