Planning a dry-stack or mortared stone wall requires precision to ensure you order enough material without excessive overspending. This calculator helps you determine the total tonnage of stone required based on the volume of the wall and the specific gravity of the stone being used.
The Calculation Formula
To calculate the amount of stone needed, we follow these steps:
Apply Density: Multiply the volume by the density of the stone (typically 150-170 lbs per cubic foot).
Convert to Tons: Divide the total weight in pounds by 2,000 to get the total in tons.
Add Waste: Add a percentage (usually 10-20%) to account for irregular shapes and breakage.
Standard Stone Densities
Stone Type
Average Weight (lbs/ft³)
Granite / Fieldstone
165 – 175 lbs
Limestone
155 lbs
Sandstone
150 lbs
Estimation Example
If you are building a 20-foot long fieldstone wall that is 3 feet high and 1.5 feet thick:
Volume: 20 × 3 × 1.5 = 90 cubic feet.
Weight: 90 × 165 lbs = 14,850 lbs.
Tons: 14,850 / 2000 = 7.43 tons.
With 15% Waste: 7.43 × 1.15 = 8.54 tons.
Professional Tips for Stone Walls
When ordering stone, always consider the "face feet" vs. the depth. For thin veneers, you may calculate by square footage, but for structural or retaining walls, cubic volume and weight are the industry standards. Always ensure your base is at least 6-12 inches deep with compacted crushed stone to prevent settling and wall failure.
function calculateStoneWall() {
var length = parseFloat(document.getElementById('wallLength').value);
var height = parseFloat(document.getElementById('wallHeight').value);
var depth = parseFloat(document.getElementById('wallDepth').value);
var density = parseFloat(document.getElementById('stoneType').value);
var waste = parseFloat(document.getElementById('wasteFactor').value);
var cost = parseFloat(document.getElementById('costPerTon').value);
if (isNaN(length) || isNaN(height) || isNaN(depth) || length <= 0 || height <= 0 || depth 0) {
var totalCost = totalTonsNeeded * cost;
document.getElementById('resTotalCost').innerText = "$" + totalCost.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
costRow.style.display = "flex";
} else {
costRow.style.display = "none";
}
// Show result container
document.getElementById('results').style.display = "block";
}