{
  "slug": "3pl-pricing-quote",
  "title": "3PL Pricing Quote Builder",
  "heading": "3PL Fulfillment Pricing Quote Calculator",
  "category": "financial",
  "url": "https://www.revenuelab.fyi/toolbox/3pl-pricing-quote",
  "summary": "Build a defensible storage + pick/pack + shipping markup quote.",
  "description": "A 3PL quote needs to cover storage, inbound receiving, pick-and-pack labor, packaging materials, and a margin on shipping, without any single line item hiding a loss that another line makes up for. This calculator builds a monthly quote from component pieces — storage fee per pallet, receiving fee per pallet or carton, pick-and-pack fee per order, and a shipping markup percentage — so both the 3PL and the client can see exactly what drives the total bill. Pricing everything into one blended per-order rate feels simple but breaks down the moment order profile changes (more lines per order, heavier average weight, seasonal storage spikes), so component-based pricing that scales with actual activity protects margin better than a flat rate, especially for accounts with volatile volume.",
  "formula": "Monthly total = Storage (pallets × rate) + Receiving (units × rate) + Pick/pack (orders × rate) + Shipping markup.",
  "dateModified": "2026-09-30",
  "run_url": "https://www.revenuelab.fyi/api/public/calc?tool=3pl-pricing-quote",
  "inputs": [
    {
      "id": "pallets",
      "label": "Avg pallets stored",
      "kind": "number",
      "hint": null,
      "default": 220,
      "unit": null,
      "min": 0,
      "max": null
    },
    {
      "id": "storageRate",
      "label": "Storage rate per pallet/month",
      "kind": "number",
      "hint": null,
      "default": 22,
      "unit": "$",
      "min": 0,
      "max": null
    },
    {
      "id": "receivingUnits",
      "label": "Units received per month",
      "kind": "number",
      "hint": null,
      "default": 15000,
      "unit": null,
      "min": 0,
      "max": null
    },
    {
      "id": "receivingRate",
      "label": "Receiving fee per unit",
      "kind": "number",
      "hint": null,
      "default": 0.35,
      "unit": "$",
      "min": 0,
      "max": null
    },
    {
      "id": "orders",
      "label": "Orders shipped per month",
      "kind": "number",
      "hint": null,
      "default": 8000,
      "unit": null,
      "min": 0,
      "max": null
    },
    {
      "id": "pickPackRate",
      "label": "Pick & pack fee per order",
      "kind": "number",
      "hint": null,
      "default": 3.25,
      "unit": "$",
      "min": 0,
      "max": null
    },
    {
      "id": "shippingCost",
      "label": "Underlying shipping cost per month",
      "kind": "number",
      "hint": null,
      "default": 42000,
      "unit": "$",
      "min": 0,
      "max": null
    }
  ],
  "outputs": [
    {
      "id": "totalQuote",
      "label": "Total monthly quote",
      "format": "currency",
      "hint": null,
      "primary": true
    },
    {
      "id": "revenuePerOrder",
      "label": "Blended revenue per order",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "storage",
      "label": "Storage revenue",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "pickPack",
      "label": "Pick & pack revenue",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "shippingRevenue",
      "label": "Shipping revenue (incl. 8% markup)",
      "format": "currency",
      "hint": null,
      "primary": false
    }
  ],
  "worked_example": {
    "inputs": [
      "Avg pallets stored: 220",
      "Storage rate per pallet/month: 22 $",
      "Units received per month: 15000",
      "Receiving fee per unit: 0.35 $",
      "Orders shipped per month: 8000",
      "Pick & pack fee per order: 3.25 $",
      "Underlying shipping cost per month: 42000 $"
    ],
    "outputs": [
      "Total monthly quote: $81,450",
      "Blended revenue per order: $10.18",
      "Storage revenue: $4,840",
      "Pick & pack revenue: $26,000",
      "Shipping revenue (incl. 8% markup): $45,360"
    ]
  },
  "how_to": {
    "title": "How to use this",
    "steps": [
      "Enter avg pallets stored.",
      "Enter storage rate per pallet/month ($).",
      "Enter units received per month.",
      "Enter receiving fee per unit ($).",
      "Enter orders shipped per month.",
      "Enter pick & pack fee per order ($).",
      "Enter underlying shipping cost per month ($).",
      "Read your total monthly quote 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": {
        "pallets": 130,
        "storageRate": 13,
        "receivingUnits": 9000,
        "receivingRate": 0.21,
        "orders": 4800,
        "pickPackRate": 1.95,
        "shippingCost": 25000
      }
    },
    {
      "name": "Typical",
      "description": "Defaults — the most common real-world setup.",
      "values": {
        "pallets": 220,
        "storageRate": 22,
        "receivingUnits": 15000,
        "receivingRate": 0.35,
        "orders": 8000,
        "pickPackRate": 3.25,
        "shippingCost": 42000
      }
    },
    {
      "name": "Ambitious",
      "description": "Higher-end numbers — what if things really pop?",
      "values": {
        "pallets": 350,
        "storageRate": 35,
        "receivingUnits": 24000,
        "receivingRate": 0.5599999999999999,
        "orders": 12800,
        "pickPackRate": 5.2,
        "shippingCost": 67000
      }
    }
  ],
  "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": "Why price components separately instead of one blended rate?",
      "a": "A blended per-order rate assumes a stable order profile — if lines per order, average weight, or storage duration shift, a flat rate either overcharges the client or erodes your margin without anyone noticing until the quarterly review. Component pricing tied to actual activity (pallets stored, units received, orders picked) stays accurate as the account's profile changes month to month."
    },
    {
      "q": "What's a typical shipping markup for a 3PL?",
      "a": "5-12% over actual carrier cost is common, sometimes presented as a per-shipment handling fee instead of a percentage markup to avoid the client feeling like they're paying a hidden tax on freight. Some 3PLs pass shipping through at cost and make their margin entirely on storage and labor instead — either model works as long as it's transparent in the contract."
    },
    {
      "q": "How do I price receiving if inbound comes by the pallet, not the unit?",
      "a": "Swap the receiving input to a per-pallet or per-container rate instead of per-unit — a common structure is a flat fee per pallet received plus a smaller per-carton fee for de-palletizing and putaway into each pick location if the receipt gets broken down below pallet level."
    },
    {
      "q": "What margin should the total quote target?",
      "a": "3PL fulfillment operations typically target 15-25% gross margin on the fully loaded quote after direct labor, materials, and facility allocation, with tighter margins on high-volume accounts that reduce marginal cost per unit and better margins on smaller or more complex accounts that consume disproportionate account management time."
    }
  ],
  "related": [
    "https://www.revenuelab.fyi/toolbox/pick-rate-labor-cost",
    "https://www.revenuelab.fyi/toolbox/pallet-position-cost",
    "https://www.revenuelab.fyi/toolbox/dunnage-packaging-cost"
  ],
  "license": "CC-BY-4.0",
  "citation": "RevenueLab — 3PL Pricing Quote Builder (https://www.revenuelab.fyi/toolbox/3pl-pricing-quote)"
}