body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
line-height: 1.6;
color: #333;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.ffr-container {
background: #fdfdfd;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 30px;
margin-bottom: 40px;
box-shadow: 0 4px 6px rgba(0,0,0,0.05);
}
.ffr-header {
text-align: center;
margin-bottom: 30px;
color: #2c3e50;
}
.ffr-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
@media (max-width: 768px) {
.ffr-grid {
grid-template-columns: 1fr;
}
}
.ffr-input-group {
margin-bottom: 15px;
}
.ffr-input-group label {
display: block;
font-weight: 600;
margin-bottom: 5px;
color: #555;
}
.ffr-input-group input {
width: 100%;
padding: 12px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 16px;
box-sizing: border-box;
}
.ffr-input-group input:focus {
border-color: #3498db;
outline: none;
}
.ffr-section-title {
grid-column: 1 / -1;
font-size: 1.1em;
font-weight: bold;
color: #2980b9;
margin-top: 10px;
margin-bottom: 5px;
border-bottom: 2px solid #eee;
padding-bottom: 5px;
}
.ffr-button {
grid-column: 1 / -1;
background-color: #e67e22;
color: white;
border: none;
padding: 15px;
font-size: 18px;
font-weight: bold;
border-radius: 4px;
cursor: pointer;
transition: background 0.3s;
text-transform: uppercase;
margin-top: 10px;
}
.ffr-button:hover {
background-color: #d35400;
}
.ffr-results {
grid-column: 1 / -1;
background-color: #2c3e50;
color: white;
padding: 20px;
border-radius: 4px;
margin-top: 20px;
display: none;
}
.ffr-result-row {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
.ffr-result-row.total {
font-size: 1.4em;
font-weight: bold;
border-bottom: none;
margin-top: 10px;
color: #f1c40f;
}
.article-content h2 {
color: #2c3e50;
border-bottom: 2px solid #e67e22;
padding-bottom: 10px;
margin-top: 40px;
}
.article-content ul {
background: #f9f9f9;
padding: 20px 40px;
border-left: 5px solid #e67e22;
}
.article-content li {
margin-bottom: 10px;
}
.tooltip {
font-size: 0.85em;
color: #7f8c8d;
margin-top: 2px;
}
Understanding Flatbed Shipping Costs
Calculating freight rates for flatbed equipment differs significantly from dry van or reefer shipping. Flatbed shipping involves open-deck trailers used for hauling oversized, heavy, or irregularly shaped cargo such as construction machinery, steel coils, lumber, and pre-cast concrete. Because the cargo is exposed and requires specialized securement, the rate structure includes variables specific to the physical demands of the load.
The Flatbed Calculation Formula
To determine a comprehensive flatbed rate, shippers and brokers typically break down the cost into three primary buckets:
- Line Haul: This is the base movement cost, calculated as Distance (Miles) × Base Rate Per Mile. It covers the driver's wages, truck maintenance, and carrier profit margin.
- Fuel Surcharge (FSC): This buffers carriers against fluctuating diesel prices. It is usually calculated as a separate per-mile fee based on the national average diesel price.
- Accessorials: Unlike a dry van where you simply close the door, flatbeds require labor-intensive securement. Common accessorials include tarping fees, dunnage costs, and extra stop charges.
Key Cost Drivers in Flatbed Logistics
1. Equipment Type and Availability
Standard flatbeds are common, but specialized equipment like Step Decks, Double Drops, or RGNs (Removable Gooseneck) command higher rates due to scarcity and the ability to haul taller freight. The calculator above assumes standard flatbed or legal-dimension step deck pricing.
2. Tarping Requirements
One of the most distinct costs in flatbed shipping is tarping.
Lumber Tarps: Cover the load completely (top and sides) and are heavy/difficult to apply. These typically cost $100-$150.
Steel Tarps: Smaller and cover only the top of low-profile loads, usually costing $50-$100.
If your load requires "Smoke Tarps" (covering just the front to prevent exhaust soot), the fee is lower.
3. Oversize and Overweight (OD/OW)
If your cargo exceeds standard legal dimensions (typically 8'6″ wide, 13'6″ high, or 80,000 lbs gross vehicle weight), you enter the realm of specialized hauling. This triggers permit fees for every state traveled through and may require civilian or police escorts (pilot cars), drastically increasing the "Permits/Escorts" field in your calculation.
Example Calculation
Let's look at a hypothetical shipment of Steel Beams from Pittsburgh, PA to Chicago, IL:
- Distance: 460 Miles
- Market Rate: $3.20 per mile (Base)
- Fuel Surcharge: $0.50 per mile
- Tarping: $100 (Steel Tarp)
Math:
(460 × $3.20) = $1,472.00 (Line Haul)
(460 × $0.50) = $230.00 (Fuel)
+ $100.00 (Accessorials)
Total Cost: $1,802.00
All-In RPM: $3.92/mile
function calculateFlatbedRate() {
// 1. Get Input Values
var distance = parseFloat(document.getElementById('ffr_distance').value);
var baseRate = parseFloat(document.getElementById('ffr_rpm').value);
var fsc = parseFloat(document.getElementById('ffr_fsc').value);
var tarpFee = parseFloat(document.getElementById('ffr_tarp').value);
var stopFee = parseFloat(document.getElementById('ffr_stops').value);
var permitFee = parseFloat(document.getElementById('ffr_permits').value);
// 2. Validate and Sanitize Inputs (Default to 0 if empty or invalid)
if (isNaN(distance) || distance <= 0) {
alert("Please enter a valid distance in miles.");
return;
}
if (isNaN(baseRate)) baseRate = 0;
if (isNaN(fsc)) fsc = 0;
if (isNaN(tarpFee)) tarpFee = 0;
if (isNaN(stopFee)) stopFee = 0;
if (isNaN(permitFee)) permitFee = 0;
// 3. Perform Calculations
var lineHaulTotal = distance * baseRate;
var fuelTotal = distance * fsc;
var accessorialTotal = tarpFee + stopFee + permitFee;
var totalCost = lineHaulTotal + fuelTotal + accessorialTotal;
var allInRpm = totalCost / distance;
// 4. Update the UI
document.getElementById('res_linehaul').innerText = "$" + lineHaulTotal.toFixed(2);
document.getElementById('res_fuel').innerText = "$" + fuelTotal.toFixed(2);
document.getElementById('res_accessorials').innerText = "$" + accessorialTotal.toFixed(2);
document.getElementById('res_total').innerText = "$" + totalCost.toFixed(2);
document.getElementById('res_allin_rpm').innerText = "$" + allInRpm.toFixed(2) + " / mile";
// 5. Show Results Section
document.getElementById('ffr_result_display').style.display = "block";
}