Roofing Squares Calculator
A roofing square is the trade unit used to order shingles, and each square covers one hundred square feet of roof surface.
Run — free
This calculator converts a base roof area into squares while accounting for slope and material waste. Enter the area in square feet, apply a pitch factor when the measurement is a horizontal plan area, and choose a waste percentage for cuts, valleys, laps, and damaged pieces. The result shows every intermediate area, the exact calculated squares, and the whole-square quantity to order, making the estimate easy to check before requesting a quote or placing an order.
Start with the right roof area
Begin with a roof area in square feet and identify what that measurement represents. A footprint taken from a plan, satellite outline, or building dimensions is a horizontal projected area, so it does not yet include the extra surface created by a slope. In that case, enter the projected area and supply the appropriate pitch factor. If a field measurement already follows the sloped roof planes, use a pitch factor of 1 because the slope is already represented. The calculator multiplies roof_area by pitch_factor to produce pitched_area_sq_ft. For example, 1,800 square feet multiplied by 1.118 becomes 2,012.4 square feet of sloped surface. Measure every roof plane that will receive shingles, and combine their areas before calculating when they share the same pitch. If sections have different pitches, calculate them separately and add their order areas or exact squares afterward. Do not use linear measurements alone, and do not enter square yards or square meters without converting them to square feet first. The roofing-square convention used here is specifically 100 square feet. Careful input matters because an underestimated footprint flows through both the pitch adjustment and the waste allowance, magnifying a measurement error in the final order.
Apply pitch and waste in the correct order
Pitch and waste solve different estimating problems. The pitch factor converts a flat plan measurement into the true surface to be covered, while the waste percentage adds material for cuts, overlaps, breakage, pattern alignment, hips, and valleys. This calculator first multiplies the base area by the pitch factor. It then calculates waste from that pitched surface and adds the waste area to obtain order_area_sq_ft. Algebraically, the complete formula is roof area times pitch factor times one plus waste percent divided by one hundred. That order prevents a common mistake: adding waste to the footprint but forgetting that cut allowance also applies across the extra sloped surface. A simple gable roof with long uninterrupted courses may need a modest allowance, while a complex roof with dormers, hips, valleys, or many small planes can require more. The calculator does not prescribe a universal waste rate because product layout, installer practice, and roof geometry matter. Confirm the allowance with the shingle manufacturer, supplier, or installer. A default of 10 percent is provided as a practical starting point, but it is not a building-code rule or a substitute for a takeoff. Values from zero through one hundred are accepted, allowing a no-waste theoretical calculation as well as conservative planning scenarios.
Read the exact and ordering results
After pitch and waste are included, the calculator divides order_area_sq_ft by 100. The result named roofing_squares_exact preserves the calculated quantity to six decimal places, which is useful for comparing alternatives, documenting a takeoff, or converting into product-specific packages. The roofing_squares_to_order field rounds that value upward to the next whole square so the estimate never recommends a fraction when planning by whole squares. Suppliers often sell shingles by the bundle rather than as a literal one-square package, and the number of bundles per square varies by product. Therefore, treat the whole-square result as an ordering target and use the manufacturer’s coverage and bundle count to translate it into packages. Accessories such as starter strips, ridge caps, underlayment, flashing, nails, and drip edge are not included. Review those separately. The response also returns pitched area, waste area, total order area, the fixed 100-square-foot square size, and the formula, so you can audit the calculation without reverse engineering a single total. API calls use the published price of $0.002 per item, while the browser calculator can run locally. Identical numeric inputs always return identical results because the calculation uses no network access, randomness, or current time.
What you can do with it
Homeowner budget estimate
Turn a measured footprint into a pitch- and waste-adjusted square quantity before comparing shingle quotes.
Contractor material takeoff
Record exact and rounded squares for each roof section with a transparent calculation that purchasing staff can review.
Supplier order check
Verify that the square quantity behind a proposed shingle order includes both slope and an intentional waste allowance.
FAQ
What is one roofing square?
One roofing square represents 100 square feet of roof surface.
Should I use a pitch factor of 1?
Use 1 when your entered area already measures the sloped roof surface. Use an appropriate multiplier when entering horizontal plan area.
Why is the order quantity rounded up?
Rounding upward avoids recommending less than the calculated coverage when planning in whole roofing squares.
Does this calculate shingle bundles?
No. Bundle coverage varies by product, so use the manufacturer’s bundles-per-square specification to convert the result.
How much does an API calculation cost?
Each successful API item costs $0.002. The browser version can run locally for free.
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/roofing-squares \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"roof_area":1800}'const res = await fetch("https://api.kit.forhosting.com/home/roofing-squares", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"roof_area": 1800
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/home/roofing-squares",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"roof_area": 1800
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/home/roofing-squares", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"roof_area":1800}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"roof_area":1800}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/home/roofing-squares", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"roof_area": 1800
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "home.roofing_squares",
"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. |