> ## Documentation Index
> Fetch the complete documentation index at: https://developers.kardinal.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Bulky & heavy goods

> Capacity-gated customer returns, a subcontractor revenue floor, equipment-dependent service time, and two-person crews on one delivery-and-install fleet.

A bulky and heavy goods operation delivers and installs large items with a mix of in-house two-person crews and solo drivers, alongside subcontracted routes that need a guaranteed minimum payout to be worth running, and customer returns that can't be picked up while the truck is already loaded past a safe weight.

## What makes this vertical distinctive

* **Capacity-gated customer returns** — a customer return is only picked up once the truck's delivery load has dropped under a set weight, not on a fixed slot.
* **Subcontractor revenue floor** — every subcontracted drop guarantees a minimum payout per stop, on top of its per-unit rate.
* **Equipment-dependent service time** — a solo crew without a dolly takes measurably longer on a heavy item than a two-person crew.
* **Two-person crews** — heavy items are only assigned to crews certified for two-person handling.

## Combined example

```json theme={null}
{
  "resources": [
    {
      "id": "team-two-person",
      "vehicleProfile": { "type": "truck" },
      "capacities": { "weight": 1200 },
      "skills": ["team_of_two_required"],
      "cost": { "costsByCapacity": { "revenue": { "costFloor": 650, "costCoeff": 1 } } }
    },
    {
      "id": "team-solo",
      "vehicleProfile": { "type": "truck" },
      "capacities": { "weight": 1200 },
      "tags": ["equipment:solo-no-dolly"]
    }
  ],
  "orders": [
    {
      "id": "order-heavy-item",
      "stops": [
        {
          "type": "single",
          "id": "stop-heavy-item",
          "position": { "lon": 2.435, "lat": 48.805 },
          "kind": "delivery",
          "operationDuration": "PT40M",
          "capacities": { "weight": 90, "weight_delivery": 90, "weight_pickup": 0 },
          "tags": ["job:heavy-item"]
        }
      ],
      "requiredSkills": ["team_of_two_required"]
    },
    {
      "id": "order-customer-return",
      "stops": [
        {
          "type": "single",
          "id": "stop-customer-return",
          "position": { "lon": 2.39, "lat": 48.81 },
          "kind": "pickup",
          "operationDuration": "PT15M",
          "capacities": { "weight": 180, "weight_pickup": 180, "weight_delivery": 0 }
        }
      ]
    },
    {
      "id": "order-subcontracted-drop",
      "stops": [
        {
          "type": "single",
          "id": "stop-subcontracted-drop",
          "position": { "lon": 2.425, "lat": 48.817 },
          "kind": "delivery",
          "operationDuration": "PT15M",
          "capacities": { "revenue": 40, "weight": 50, "weight_delivery": 50, "weight_pickup": 0 }
        }
      ]
    }
  ],
  "additionalConstraints": [
    {
      "type": "atLeastOneConstraint",
      "constraints": [
        { "type": "atLeastOneValidCapacity", "capacities": { "weight_pickup": 0, "weight_delivery": 1200 } },
        { "type": "atLeastOneValidCapacity", "capacities": { "weight_pickup": 1200, "weight_delivery": 400 } }
      ],
      "name": "customer-return-once-under-400kg"
    }
  ],
  "additionalOperationDurations": [
    { "resourceTag": "equipment:solo-no-dolly", "stopTag": "job:heavy-item", "additionalOperationDuration": "PT20M" }
  ]
}
```

### Capacity-gated customer returns

Every delivery stop declares how much it adds to `weight_delivery` and `weight_pickup`; `order-customer-return`'s pickup adds to `weight_pickup` instead. The `atLeastOneConstraint` requires, at every stop, either no pickup has happened yet (`weight_pickup: 0`) or the remaining delivery load is under 400 kg (`weight_delivery: 400`) — so the return can only be placed once the truck has already dropped enough deliveries to be safely under that threshold. See [Multi-compartment vehicles](/guides/advanced-constraints#multi-compartment-vehicles) for the general `atLeastOneConstraint` mechanism, and [Sequencing pickups after deliveries](/guides/advanced-constraints#sequencing-pickups-after-deliveries) for the simpler single-capacity version of this same pattern.

### Subcontractor revenue floor

`team-two-person.cost.costsByCapacity.revenue` sets a `costFloor` of 650 with `costCoeff: 1` — the resource's cost is charged as if it had generated at least 650 units of `revenue`, regardless of the actual sum from its assigned stops (here, `order-subcontracted-drop.capacities.revenue: 40`). Comparing that guaranteed-minimum cost against the resource's real payout is what turns a per-unit rate into a revenue floor. See [Guaranteeing a minimum per-tour revenue via costsByCapacity](/guides/cost-modeling#guaranteeing-a-minimum-per-tour-revenue-via-costsbycapacity) — the exact worked example this follows.

### Equipment-dependent service time

`additionalOperationDurations` adds 20 minutes to every `job:heavy-item` stop when it's served by a resource tagged `equipment:solo-no-dolly` — the base `operationDuration` on the stop stays the crew-agnostic default, and the solo penalty is added only for the resources it actually applies to. See [Plan-level fields](/reference/data-model#plan-level-fields).

### Two-person crews

`order-heavy-item.requiredSkills: ["team_of_two_required"]` only matches resources carrying that same skill — `team-two-person` qualifies, `team-solo` doesn't. See [Driver skills and qualifications](/guides/advanced-constraints#driver-skills-and-qualifications).

## See also

* [Cost modeling](/guides/cost-modeling#guaranteeing-a-minimum-per-tour-revenue-via-costsbycapacity) — the `costsByCapacity` revenue-floor pattern.
* [Modeling advanced constraints](/guides/advanced-constraints#sequencing-pickups-after-deliveries) — capacity-based sequencing, and the `atLeastOneConstraint`/`atLeastOneValidCapacity` building blocks.
* [Data model](/reference/data-model#constraints-catalog) — the full `additionalConstraints` and `globalConstraints` catalog.
