Skip to content
Assembly Products

Assembly Products

Assembly products let you sell one SKU that is made up of other SKUs. In ShipHero, you can manage that bill of materials with four mutations:

  • assembly_add_components to add new component SKUs to the assembly
  • assembly_update_components to change the quantity of existing components
  • assembly_remove_components to remove specific components from the assembly
  • assembly_clear_components to remove the full component list and start over

In this guide we will use a real-world example: a standing desk bundle sold as WORKSTATION-BUNDLE-PRO.

This assembly product is made up of these component SKUs:

  • DESKTOP-OAK-60 — oak desktop
  • FRAME-BLACK-DUAL — dual-motor standing desk frame
  • CABLE-TRAY-LARGE — under-desk cable tray
  • CABLE-CLIP-BLK — cable clips
  • FLOOR-MAT-BLK — anti-fatigue floor mat

Note

The product must already exist, but it does not need to already be marked as an assembly product. When you use assembly_add_components, ShipHero will turn on the assembly flag for that product. If you are a 3PL managing products for a customer account, pass customer_account_id in the mutation payloads.

Important

A product used as an assembly component cannot be a kit. Also, if there is an active work order for the assembly product, you cannot modify its component list until that work order is completed.

1. Inspect the Current Assembly Definition

Before changing anything, query the product and inspect its current assembly_components.

query GetAssemblyProduct($sku: String!, $customer_account_id: String) {
  product(sku: $sku, customer_account_id: $customer_account_id) {
    request_id
    complexity
    data {
      id
      name
      sku
      is_assembly
      assembly_components {
        sku
        quantity
      }
    }
  }
}
{
  "sku": "WORKSTATION-BUNDLE-PRO"
}

If this is a brand new assembly product, assembly_components will usually be empty.

2. Add the Initial Components

Use assembly_add_components when you want to add components that are not yet part of the assembly.

In this example, we are setting up the initial bundle definition:

  • 1 desktop
  • 1 frame
  • 1 cable tray
  • 4 cable clips
  • 1 floor mat
mutation AddAssemblyComponents($data: AddAssemblyComponentsInput!) {
  assembly_add_components(data: $data) {
    request_id
    complexity
    product {
      id
      name
      sku
      is_assembly
      assembly_components {
        sku
        quantity
      }
    }
  }
}
{
  "data": {
    "assembly_sku": "WORKSTATION-BUNDLE-PRO",
    "components": [
      {
        "sku": "DESKTOP-OAK-60",
        "quantity": 1
      },
      {
        "sku": "FRAME-BLACK-DUAL",
        "quantity": 1
      },
      {
        "sku": "CABLE-TRAY-LARGE",
        "quantity": 1
      },
      {
        "sku": "CABLE-CLIP-BLK",
        "quantity": 4
      },
      {
        "sku": "FLOOR-MAT-BLK",
        "quantity": 1
      }
    ]
  }
}

After the mutation succeeds, the returned product.assembly_components will show the current assembly definition.

3. Update Quantities for Existing Components

Use assembly_update_components when a component is already part of the assembly and you only need to adjust its quantity.

For example, if the bundle now needs 6 cable clips instead of 4, update only that component:

mutation UpdateAssemblyComponents($data: UpdateAssemblyComponentsInput!) {
  assembly_update_components(data: $data) {
    request_id
    complexity
    product {
      sku
      assembly_components {
        sku
        quantity
      }
    }
  }
}
{
  "data": {
    "assembly_sku": "WORKSTATION-BUNDLE-PRO",
    "components": [
      {
        "sku": "CABLE-CLIP-BLK",
        "quantity": 6
      }
    ]
  }
}

This is useful when your ERP or product catalog changes the quantity of a component but the component SKU itself stays the same.

4. Remove a Component You No Longer Want to Include

Use assembly_remove_components when a component should no longer be part of the assembly.

For example, if the floor mat is no longer included in the standing desk bundle:

mutation RemoveAssemblyComponents($data: RemoveAssemblyComponentsInput!) {
  assembly_remove_components(data: $data) {
    request_id
    complexity
    product {
      sku
      assembly_components {
        sku
        quantity
      }
    }
  }
}
{
  "data": {
    "assembly_sku": "WORKSTATION-BUNDLE-PRO",
    "components": [
      {
        "sku": "FLOOR-MAT-BLK"
      }
    ]
  }
}

This mutation only needs the component SKU values that should be removed.

5. Clear the Full Component List

Use assembly_clear_components when you want to discard the entire assembly definition and rebuild it from scratch.

This is helpful when the source of truth lives in another system and you prefer to wipe the existing component list before sending a fresh one.

mutation ClearAssemblyComponents($data: ClearAssemblyComponentsInput!) {
  assembly_clear_components(data: $data) {
    request_id
    complexity
    product {
      sku
      assembly_components {
        sku
        quantity
      }
    }
  }
}
{
  "data": {
    "assembly_sku": "WORKSTATION-BUNDLE-PRO"
  }
}

After clearing the component list, you can call assembly_add_components again with the new complete set of components.

Recommended Management Pattern

In practice, these mutations usually map to different operational needs:

  • Use assembly_add_components when you are creating the first version of the assembly or adding newly introduced SKUs.
  • Use assembly_update_components when the component SKU stays the same but the required quantity changes.
  • Use assembly_remove_components when a single accessory or part should no longer ship with the bundle.
  • Use assembly_clear_components when you want to fully reset the bill of materials before rebuilding it.

Reference Links