{
  "slug": "detention-pay-recovery",
  "title": "Detention Pay Recovery Calculator",
  "heading": "Detention Pay Calculator",
  "category": "financial",
  "url": "https://www.revenuelab.fyi/toolbox/detention-pay-recovery",
  "summary": "What you're owed for wait time beyond free loading/unloading hours.",
  "description": "Most rate confirmations grant 1-2 hours of free time at pickup and delivery before detention pay kicks in, typically billed hourly after that. Drivers routinely under-claim detention because they don't track exact in/out times or don't know their contract's free-time threshold. This calculator takes your total time at a facility, subtracts the free hours, and multiplies the remainder by your detention rate, rounding to the billing increment most brokers use (often 15 or 30 minutes). Run this for every stop that ran long and you'll often find hundreds of dollars a month in unclaimed detention pay sitting on the table.",
  "formula": "Billable hours = max(0, total time − free hours), rounded to billing increment; pay = billable hours × rate.",
  "dateModified": "2026-09-30",
  "run_url": "https://www.revenuelab.fyi/api/public/calc?tool=detention-pay-recovery",
  "inputs": [
    {
      "id": "totalMinutes",
      "label": "Total time at facility",
      "kind": "number",
      "hint": null,
      "default": 240,
      "unit": "min",
      "min": 0,
      "max": null
    },
    {
      "id": "freeHours",
      "label": "Free time allowed",
      "kind": "number",
      "hint": null,
      "default": 2,
      "unit": "hr",
      "min": 0,
      "max": null
    },
    {
      "id": "rate",
      "label": "Detention rate",
      "kind": "number",
      "hint": null,
      "default": 45,
      "unit": "$/hr",
      "min": 0,
      "max": null
    },
    {
      "id": "increment",
      "label": "Billing increment",
      "kind": "select",
      "hint": null,
      "default": "30",
      "options": [
        {
          "value": "15",
          "label": "15 minutes"
        },
        {
          "value": "30",
          "label": "30 minutes"
        },
        {
          "value": "60",
          "label": "Full hour only"
        }
      ]
    }
  ],
  "outputs": [
    {
      "id": "pay",
      "label": "Detention pay owed",
      "format": "currency",
      "hint": null,
      "primary": true
    },
    {
      "id": "billableHours",
      "label": "Billable hours (rounded)",
      "format": "decimal",
      "hint": null,
      "primary": false
    },
    {
      "id": "waitedMinutes",
      "label": "Raw minutes over free time",
      "format": "number",
      "hint": null,
      "primary": false
    }
  ],
  "worked_example": {
    "inputs": [
      "Total time at facility: 240 min",
      "Free time allowed: 2 hr",
      "Detention rate: 45 $/hr",
      "Billing increment: 30 minutes"
    ],
    "outputs": [
      "Detention pay owed: $90.00",
      "Billable hours (rounded): 2",
      "Raw minutes over free time: 120"
    ]
  },
  "how_to": {
    "title": "How to use this",
    "steps": [
      "Enter total time at facility (min).",
      "Enter free time allowed (hr).",
      "Enter detention rate ($/hr).",
      "Enter billing increment.",
      "Read your detention pay owed 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": {
        "totalMinutes": 145,
        "freeHours": 1.2,
        "rate": 45,
        "increment": "30"
      }
    },
    {
      "name": "Typical",
      "description": "Defaults — the most common real-world setup.",
      "values": {
        "totalMinutes": 240,
        "freeHours": 2,
        "rate": 45,
        "increment": "30"
      }
    },
    {
      "name": "Ambitious",
      "description": "Higher-end numbers — what if things really pop?",
      "values": {
        "totalMinutes": 385,
        "freeHours": 3.2,
        "rate": 45,
        "increment": "30"
      }
    }
  ],
  "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": "Who pays detention — the broker or the shipper?",
      "a": "Contractually the broker or carrier you're under owes it to you, but they typically bill it upstream to the shipper who caused the delay. Your claim goes to whoever you have a rate agreement with, documented with in/out timestamps."
    },
    {
      "q": "How do I prove detention time?",
      "a": "Use your ELD or dispatch app's automatic geofence timestamps for arrival and departure, plus a signed BOL time stamp if the facility provides one. Photos of a clock or your phone's time-stamped check-in message add backup if a dispute arises."
    },
    {
      "q": "Do all loads get free time before detention starts?",
      "a": "Almost all rate confirmations specify it, commonly 1-2 hours combined for loading/unloading. Some brokers apply free time per stop, others per load — read the rate con language, since it changes the math meaningfully on multi-stop loads."
    },
    {
      "q": "Is detention pay negotiable?",
      "a": "Yes, especially with brokers you run repeat freight for. Chronically slow shippers are a known cost center, and brokers will sometimes raise your detention rate or shorten free time to keep good carriers on a problem lane."
    }
  ],
  "related": [
    "https://www.revenuelab.fyi/toolbox/driver-pay-per-mile-vs-hourly",
    "https://www.revenuelab.fyi/toolbox/load-board-rate-vs-breakeven",
    "https://www.revenuelab.fyi/toolbox/route-density-stops-per-hour"
  ],
  "license": "CC-BY-4.0",
  "citation": "RevenueLab — Detention Pay Recovery Calculator (https://www.revenuelab.fyi/toolbox/detention-pay-recovery)"
}