Whether you are pouring a patio, a driveway, or a shed foundation, calculating the correct amount of concrete is crucial. Ordering too little can result in a "cold joint" and a structurally weak slab, while ordering too much wastes money.
The Concrete Formula
To determine the volume of concrete needed, you need to calculate the cubic footage of the slab and convert it to cubic yards (the standard unit for ordering ready-mix trucks). The formula is:
Since thickness is usually measured in inches, divide the inches by 12 to get feet. For example, a 4-inch slab is 0.33 feet thick.
To convert Cubic Feet to Cubic Yards, divide the total by 27.
Standard Slab Thicknesses
4 Inches: Standard for residential sidewalks, patios, and garage floors for passenger cars.
5-6 Inches: Recommended for driveways that handle heavier vehicles like trucks or RVs.
6+ Inches: Heavy-duty industrial floors or agricultural pads.
Why Include a Waste Margin?
Our calculator includes a default 10% waste margin. This is essential because:
The ground is rarely perfectly level; dips require more concrete.
Spillage occurs during wheelbarrow transport.
Some concrete remains in the mixer or pump hose.
Forms may bow slightly outward under the weight of the wet concrete.
Bags vs. Ready-Mix Truck
Pre-mixed Bags (60lb or 80lb): Best for small projects under 1 cubic yard (approx. 45-50 bags). It is labor-intensive to mix by hand.
Ready-Mix Truck: Best for projects over 1 cubic yard. It is more consistent and saves immense physical labor, though often requires a minimum order fee (short load fee).
function calculateConcrete() {
// Get Inputs
var length = parseFloat(document.getElementById('slabLength').value);
var width = parseFloat(document.getElementById('slabWidth').value);
var thickness = parseFloat(document.getElementById('slabThickness').value);
var waste = parseFloat(document.getElementById('wasteMargin').value);
var priceYard = parseFloat(document.getElementById('pricePerYard').value);
var priceBag = parseFloat(document.getElementById('pricePerBag').value);
// Validation
if (isNaN(length) || isNaN(width) || isNaN(thickness)) {
alert("Please enter valid numbers for Length, Width, and Thickness.");
return;
}
if (isNaN(waste)) waste = 0;
// Calculations
// 1. Thickness in feet
var thicknessFeet = thickness / 12;
// 2. Cubic Feet (Raw)
var cubicFeetRaw = length * width * thicknessFeet;
// 3. Add Waste
var totalCubicFeet = cubicFeetRaw * (1 + (waste / 100));
// 4. Cubic Yards
var totalCubicYards = totalCubicFeet / 27;
// 5. Bags Calculation
// Standard yield: 80lb bag ~= 0.60 cu ft, 60lb bag ~= 0.45 cu ft
var yield80 = 0.60;
var yield60 = 0.45;
var bags80 = Math.ceil(totalCubicFeet / yield80);
var bags60 = Math.ceil(totalCubicFeet / yield60);
// Display Results
document.getElementById('resCubicYards').innerText = totalCubicYards.toFixed(2);
document.getElementById('resCubicFeet').innerText = totalCubicFeet.toFixed(2);
document.getElementById('resBags80').innerText = bags80;
document.getElementById('resBags60').innerText = bags60;
// Cost Calculation
var showCosts = false;
var costYardTotal = 0;
var costBagTotal = 0;
if (!isNaN(priceYard) && priceYard > 0) {
costYardTotal = totalCubicYards * priceYard;
document.getElementById('resCostYard').innerText = "$" + costYardTotal.toFixed(2);
document.getElementById('card-cost-yard').style.display = "block";
showCosts = true;
} else {
document.getElementById('card-cost-yard').style.display = "none";
}
if (!isNaN(priceBag) && priceBag > 0) {
costBagTotal = bags80 * priceBag;
document.getElementById('resCostBag').innerText = "$" + costBagTotal.toFixed(2);
document.getElementById('card-cost-bag').style.display = "block";
showCosts = true;
} else {
document.getElementById('card-cost-bag').style.display = "none";
}
var costSection = document.getElementById('cost-results');
if (showCosts) {
costSection.style.display = "block";
} else {
costSection.style.display = "none";
}
// Show result container
document.getElementById('result-section').style.display = "block";
// Scroll to results
document.getElementById('result-section').scrollIntoView({ behavior: 'smooth' });
}