{
  "slug": "route-density-profit",
  "title": "Route Density Profit Calculator",
  "heading": "Route Density Profit Calculator",
  "category": "financial",
  "url": "https://www.revenuelab.fyi/toolbox/route-density-profit",
  "summary": "See how tighter routes turn drive time into billable time and real profit.",
  "description": "Route density is the quiet lever that separates profitable lawn, cleaning, and pest routes from ones that limp along. Two businesses charging the same price per stop can have wildly different profit if one drives 4 miles between stops and the other drives 12. This calculator converts average drive distance and stop count into daily revenue capacity and profit per route day.",
  "formula": "Drive hours = stops × avg miles between stops ÷ avg speed. Available service hours = shift hours − drive hours. Stops served = service hours ÷ avg service time. Profit = (stops served × revenue per stop) − (shift hours × crew cost) − fuel cost.",
  "dateModified": "2026-09-30",
  "run_url": "https://www.revenuelab.fyi/api/public/calc?tool=route-density-profit",
  "inputs": [
    {
      "id": "shiftHours",
      "label": "Shift length",
      "kind": "number",
      "hint": null,
      "default": 8,
      "unit": "hrs",
      "min": 2,
      "max": 14
    },
    {
      "id": "avgMiles",
      "label": "Average miles between stops",
      "kind": "number",
      "hint": null,
      "default": 4,
      "unit": null,
      "min": 0.1,
      "max": null
    },
    {
      "id": "avgSpeed",
      "label": "Average driving speed",
      "kind": "number",
      "hint": null,
      "default": 25,
      "unit": "mph",
      "min": 5,
      "max": null
    },
    {
      "id": "serviceMin",
      "label": "Average service time per stop",
      "kind": "number",
      "hint": null,
      "default": 25,
      "unit": "min",
      "min": 5,
      "max": null
    },
    {
      "id": "revenuePerStop",
      "label": "Revenue per stop",
      "kind": "number",
      "hint": null,
      "default": 55,
      "unit": "$",
      "min": 1,
      "max": null
    },
    {
      "id": "crewCostHour",
      "label": "Crew cost per hour",
      "kind": "number",
      "hint": null,
      "default": 50,
      "unit": "$",
      "min": 5,
      "max": null
    },
    {
      "id": "mpg",
      "label": "Vehicle MPG",
      "kind": "number",
      "hint": null,
      "default": 12,
      "unit": null,
      "min": 3,
      "max": null
    },
    {
      "id": "fuelPrice",
      "label": "Fuel price per gallon",
      "kind": "number",
      "hint": null,
      "default": 3.6,
      "unit": "$",
      "min": 1,
      "max": null
    }
  ],
  "outputs": [
    {
      "id": "stops",
      "label": "Stops per shift",
      "format": "number",
      "hint": null,
      "primary": true
    },
    {
      "id": "revenue",
      "label": "Route revenue",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "profit",
      "label": "Route profit",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "totalMiles",
      "label": "Total miles driven",
      "format": "number",
      "hint": null,
      "primary": false
    },
    {
      "id": "profitPerStop",
      "label": "Profit per stop",
      "format": "currency",
      "hint": null,
      "primary": false
    }
  ],
  "worked_example": {
    "inputs": [
      "Shift length: 8 hrs",
      "Average miles between stops: 4",
      "Average driving speed: 25 mph",
      "Average service time per stop: 25 min",
      "Revenue per stop: 55 $",
      "Crew cost per hour: 50 $",
      "Vehicle MPG: 12",
      "Fuel price per gallon: 3.6 $"
    ],
    "outputs": [
      "Stops per shift: 13",
      "Route revenue: $715",
      "Route profit: $299",
      "Total miles driven: 52",
      "Profit per stop: $23.03"
    ]
  },
  "how_to": {
    "title": "How to use this",
    "steps": [
      "Enter shift length (hrs).",
      "Enter average miles between stops.",
      "Enter average driving speed (mph).",
      "Enter average service time per stop (min).",
      "Enter revenue per stop ($).",
      "Enter crew cost per hour ($).",
      "Enter vehicle mpg.",
      "Enter fuel price per gallon ($).",
      "Read your stops per shift 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": {
        "shiftHours": 4.8,
        "avgMiles": 2.4,
        "avgSpeed": 15,
        "serviceMin": 15,
        "revenuePerStop": 33,
        "crewCostHour": 30,
        "mpg": 7,
        "fuelPrice": 2.16
      }
    },
    {
      "name": "Typical",
      "description": "Defaults — the most common real-world setup.",
      "values": {
        "shiftHours": 8,
        "avgMiles": 4,
        "avgSpeed": 25,
        "serviceMin": 25,
        "revenuePerStop": 55,
        "crewCostHour": 50,
        "mpg": 12,
        "fuelPrice": 3.6
      }
    },
    {
      "name": "Ambitious",
      "description": "Higher-end numbers — what if things really pop?",
      "values": {
        "shiftHours": 12.8,
        "avgMiles": 6.4,
        "avgSpeed": 40,
        "serviceMin": 40,
        "revenuePerStop": 88,
        "crewCostHour": 80,
        "mpg": 19,
        "fuelPrice": 5.760000000000001
      }
    }
  ],
  "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 does cutting drive distance actually matter?",
      "a": "Cutting average miles between stops from 8 to 4 at 25 mph frees roughly 10 minutes per stop. Across a 12-stop day that's two extra hours — often enough to add 4-5 more billable stops without adding a crew or a truck. Density beats raw territory size almost every time."
    },
    {
      "q": "Should I turn down far-away customers?",
      "a": "Not automatically, but price them differently. A customer 20 minutes outside your core zone should either pay a distance surcharge or get scheduled on a day when you're already routing that direction. Filling gaps in an existing route is nearly free; building a whole day around one outlier customer is not."
    },
    {
      "q": "What's a good target for stops per crew-day?",
      "a": "It depends heavily on service type, but as a rule of thumb, lawn crews aim for 8-14 residential stops, pest control routes run 10-16, and cleaning crews with longer service times often cap at 3-5. Track your actual number monthly and treat any decline as a routing problem to fix immediately."
    }
  ],
  "related": [
    "https://www.revenuelab.fyi/toolbox/lawn-route-stops-per-day",
    "https://www.revenuelab.fyi/toolbox/fuel-surcharge-local-route",
    "https://www.revenuelab.fyi/toolbox/crew-hour-job-pricing"
  ],
  "license": "CC-BY-4.0",
  "citation": "RevenueLab — Route Density Profit Calculator (https://www.revenuelab.fyi/toolbox/route-density-profit)"
}