*Calculated based on standard 3-tab shingles (3 bundles per square).
How to Calculate Roofing Shingles
Planning a roof replacement requires accurate measurements to ensure you purchase the right amount of materials. Buying too few shingles causes delays, while buying too many is a waste of money. This calculator helps you determine the exact number of squares and bundles required for your project.
Understanding Roofing Terms
Before you calculate, it is essential to understand the standard units used in the roofing industry:
Square: A "square" is the primary unit of measurement for roofing materials. One roofing square equals 100 square feet of roof surface area.
Bundle: Shingles are packaged in bundles. For standard 3-tab asphalt shingles, it typically takes 3 bundles to cover one square. Heavier architectural shingles may require 3 or 4 bundles per square depending on the brand.
Pitch: The slope of your roof affects the total surface area. A steeper roof has more surface area than a flat roof covering the same footprint dimensions.
The Calculation Formula
To estimate your material needs manually, follow these steps:
Measure Area: Multiply the length and width of your home's footprint (including overhangs).
Adjust for Pitch: Multiply your base area by a "pitch multiplier" (e.g., a 6:12 pitch has a multiplier of roughly 1.118).
Add Waste: Add 10-15% for cutting, waste, and starter courses. Valleys and hips increase waste.
Convert to Squares: Divide the total square footage by 100.
Determine Bundles: Multiply the number of squares by 3 (for standard shingles).
Why is Waste Factor Important?
You should never order the exact amount of surface area measured. Professional roofers always include a waste factor to account for:
Shingles cut at the rake edges and eaves.
Material damaged during shipment or installation.
Capping for hips and ridges (often cut from standard shingles).
For a simple gable roof, 5-10% waste is standard. For complex roofs with multiple valleys, dormers, and hips, a 15-20% waste factor is recommended.
Common Roof Pitch Multipliers
If you are measuring from the ground, you need to account for the slope. Use these multipliers based on your roof's rise per 12 inches of run:
4:12 Pitch: x 1.054
6:12 Pitch: x 1.118
8:12 Pitch: x 1.202
12:12 Pitch: x 1.414 (45 degrees)
function calculateRoofing() {
// Get input values
var lengthInput = document.getElementById('roofLength');
var widthInput = document.getElementById('roofWidth');
var pitchSelect = document.getElementById('roofPitch');
var wasteSelect = document.getElementById('wasteFactor');
var errorMsg = document.getElementById('error-message');
var resultArea = document.getElementById('result-area');
var length = parseFloat(lengthInput.value);
var width = parseFloat(widthInput.value);
var pitchMultiplier = parseFloat(pitchSelect.value);
var wastePercent = parseFloat(wasteSelect.value);
// Validation
if (isNaN(length) || isNaN(width) || length <= 0 || width <= 0) {
errorMsg.style.display = 'block';
resultArea.style.display = 'none';
return;
}
errorMsg.style.display = 'none';
// Calculation Logic
// 1. Base footprint area
var baseArea = length * width;
// 2. Adjust for pitch to get actual surface area
var actualArea = baseArea * pitchMultiplier;
// 3. Add waste factor
var totalAreaWithWaste = actualArea * (1 + (wastePercent / 100));
// 4. Calculate Squares (1 square = 100 sq ft)
// We round up to 2 decimal places for accuracy in display
var squares = totalAreaWithWaste / 100;
// 5. Calculate Bundles (Standard 3 bundles per square)
// We must round UP to the nearest whole bundle because you can't buy half a bundle
var bundles = Math.ceil(squares * 3);
// Recalculate squares based on whole bundles for purchasing accuracy?
// Or keep raw squares for technical data. Let's show raw squares rounded.
var displaySquares = squares.toFixed(2);
var displayArea = Math.ceil(totalAreaWithWaste); // Round area to nearest foot
// Display Results
document.getElementById('res-area').innerText = displayArea.toLocaleString() + " sq ft";
document.getElementById('res-squares').innerText = displaySquares;
document.getElementById('res-bundles').innerText = bundles;
resultArea.style.display = 'block';
}