{
  "slug": "metal-roofing-cost-calculator",
  "title": "Metal Roofing Install Cost Calculator (2026 Pricing)",
  "heading": "Metal Roofing Install Cost Calculator",
  "category": "financial",
  "url": "https://www.revenuelab.fyi/toolbox/metal-roofing-cost-calculator",
  "summary": "Build a metal roofing install price from real material, crew and overhead cost — not from guesswork.",
  "description": "Metal Roofing Install is priced per roofing square (100 sq ft), and the number that actually decides whether the job is profitable is the fully-loaded cost per square — material plus waste, plus crew hours at your real burdened labour rate, plus the overhead every job has to carry. This calculator builds that number from the ground up rather than reverse-engineering it from a competitor's price. At the defaults here, material runs about $420.00 per square and labour runs roughly 2.6 crew-hours per square, which at a $68/hr burdened crew rate is about $176.80 per square in labour alone. Panel runs must be measured to the eave, not the ridge line on the plan — a short panel is a wasted panel. Standing-seam metal typically prices at $1,000–$1,800 per roofing square installed. Change the crew rate to your real burdened cost — wages plus payroll tax, workers' comp, vehicle, insurance and non-billable time — because using a bare wage rate is the single most common reason a busy metal roofing install business still ends the year with no profit. The markup field is a markup on total cost, not a margin: a 35% markup on cost is a 25.9% gross margin, and confusing the two is worth thousands a year on a full schedule.",
  "formula": "Price = ((Material x Units x (1 + Waste%)) + (Crew hours x Units x Burdened rate) + Overhead) x (1 + Markup%)",
  "dateModified": "2026-08-25",
  "run_url": "https://www.revenuelab.fyi/api/public/calc?tool=metal-roofing-cost-calculator",
  "inputs": [
    {
      "id": "units",
      "label": "Job size (roofing square (100 sq ft)s)",
      "kind": "number",
      "hint": null,
      "default": 24,
      "unit": "square",
      "min": 1,
      "max": null
    },
    {
      "id": "material",
      "label": "Material cost per square",
      "kind": "number",
      "hint": null,
      "default": 420,
      "unit": "$",
      "min": 0,
      "max": null
    },
    {
      "id": "waste",
      "label": "Waste / overage",
      "kind": "number",
      "hint": null,
      "default": 8,
      "unit": "%",
      "min": 0,
      "max": 60
    },
    {
      "id": "hours",
      "label": "Crew hours per square",
      "kind": "number",
      "hint": null,
      "default": 2.6,
      "unit": "hrs",
      "min": 0,
      "max": null
    },
    {
      "id": "rate",
      "label": "Burdened crew rate",
      "kind": "number",
      "hint": null,
      "default": 68,
      "unit": "$/hr",
      "min": 0,
      "max": null
    },
    {
      "id": "overhead",
      "label": "Overhead allocated to this job",
      "kind": "number",
      "hint": null,
      "default": 0,
      "unit": "$",
      "min": 0,
      "max": null
    },
    {
      "id": "markup",
      "label": "Markup on total cost",
      "kind": "number",
      "hint": null,
      "default": 26,
      "unit": "%",
      "min": 0,
      "max": 200
    }
  ],
  "outputs": [
    {
      "id": "price",
      "label": "Quote this job at",
      "format": "currency",
      "hint": null,
      "primary": true
    },
    {
      "id": "pricePerUnit",
      "label": "Price per square",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "totalCost",
      "label": "Your total cost",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "profit",
      "label": "Gross profit",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "margin",
      "label": "Gross margin",
      "format": "percent",
      "hint": null,
      "primary": false
    },
    {
      "id": "materialCost",
      "label": "Material (incl. waste)",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "labourCost",
      "label": "Labour cost",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "crewHours",
      "label": "Crew hours",
      "format": "decimal",
      "hint": null,
      "primary": false
    },
    {
      "id": "crewDays",
      "label": "Crew days (8h)",
      "format": "decimal",
      "hint": null,
      "primary": false
    },
    {
      "id": "breakEvenPerUnit",
      "label": "Break-even per square",
      "format": "currency",
      "hint": null,
      "primary": false
    }
  ],
  "worked_example": {
    "inputs": [
      "Job size (roofing square (100 sq ft)s): 24 square",
      "Material cost per square: 420 $",
      "Waste / overage: 8 %",
      "Crew hours per square: 2.6 hrs",
      "Burdened crew rate: 68 $/hr",
      "Overhead allocated to this job: 0 $",
      "Markup on total cost: 26 %"
    ],
    "outputs": [
      "Quote this job at: $19,063",
      "Price per square: $794.30",
      "Your total cost: $15,130",
      "Gross profit: $3,934",
      "Gross margin: 20.6%",
      "Material (incl. waste): $10,886",
      "Labour cost: $4,243",
      "Crew hours: 62.4",
      "Crew days (8h): 7.8",
      "Break-even per square: $630.40"
    ]
  },
  "how_to": {
    "title": "How to use this",
    "steps": [
      "Enter job size (roofing square (100 sq ft)s) (square).",
      "Enter material cost per square ($).",
      "Enter waste / overage (%).",
      "Enter crew hours per square (hrs).",
      "Enter burdened crew rate ($/hr).",
      "Enter overhead allocated to this job ($).",
      "Enter markup on total cost (%).",
      "Read your quote this job at on the right — it updates as you type.",
      "Hit Share to keep the scenario or send it to someone."
    ]
  },
  "scenarios": [
    {
      "name": "Conservative",
      "description": "Lower-end numbers — what if things land soft?",
      "values": {
        "units": 14,
        "material": 252,
        "waste": 5,
        "hours": 1.56,
        "rate": 68,
        "overhead": 0,
        "markup": 16
      }
    },
    {
      "name": "Typical",
      "description": "Defaults — the most common real-world setup.",
      "values": {
        "units": 24,
        "material": 420,
        "waste": 8,
        "hours": 2.6,
        "rate": 68,
        "overhead": 0,
        "markup": 26
      }
    },
    {
      "name": "Ambitious",
      "description": "Higher-end numbers — what if things really pop?",
      "values": {
        "units": 38,
        "material": 672,
        "waste": 13,
        "hours": 4.16,
        "rate": 68,
        "overhead": 0,
        "markup": 42
      }
    }
  ],
  "limitations": [
    "Results are estimates before tax, fees, and inflation unless an input explicitly covers them.",
    "Rates are treated as fixed for the whole period — variable-rate products will drift from this projection.",
    "This is educational maths, not financial advice. Check anything contractual with the lender or your accountant."
  ],
  "faq": [
    {
      "q": "How much should I charge per square for metal roofing install?",
      "a": "Work from cost, not from the market. Standing-seam metal typically prices at $1,000–$1,800 per roofing square installed. Take your material cost per square, add your waste factor, add crew hours times your burdened hourly cost, add your overhead allocation, then apply your markup. If that number lands well above local pricing, the problem is usually productivity or overhead, not greed."
    },
    {
      "q": "What is a burdened labour rate and why does it matter here?",
      "a": "Burdened rate is what an hour of crew time truly costs you: wages, payroll taxes, workers' compensation, vehicle and fuel, tools, insurance, and the unbillable hours between jobs. It is commonly 1.4x to 1.8x the bare wage. Quoting off bare wages is the fastest way to run a busy, unprofitable business."
    },
    {
      "q": "Is markup the same as profit margin?",
      "a": "No, and the gap is bigger than people expect. Markup is added to cost; margin is a share of the price. A 35% markup gives a 25.9% margin, and a 50% markup gives a 33.3% margin. If you need a 40% margin you must mark up by 66.7%."
    },
    {
      "q": "How should I handle the waste factor on metal roofing install?",
      "a": "The default here is 8%, which is a reasonable starting point for straightforward work. Complex layouts, cuts, patterns and awkward access all push it higher. Track your actual waste for a few jobs and replace the default with your own number — it is one of the easiest measurable wins in estimating."
    },
    {
      "q": "Should overhead be a percentage or a fixed amount per job?",
      "a": "Both work if you are consistent. Percentage-of-cost is simpler and self-scaling; a fixed per-day allocation is more accurate when your jobs vary wildly in size. What fails is having no overhead line at all and hoping the markup covers it."
    }
  ],
  "related": [],
  "license": "CC-BY-4.0",
  "citation": "RevenueLab — Metal Roofing Install Cost Calculator (2026 Pricing) (https://www.revenuelab.fyi/toolbox/metal-roofing-cost-calculator)"
}