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_componentsto add new component SKUs to the assemblyassembly_update_componentsto change the quantity of existing componentsassembly_remove_componentsto remove specific components from the assemblyassembly_clear_componentsto 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 desktopFRAME-BLACK-DUAL— dual-motor standing desk frameCABLE-TRAY-LARGE— under-desk cable trayCABLE-CLIP-BLK— cable clipsFLOOR-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_componentswhen you are creating the first version of the assembly or adding newly introduced SKUs. - Use
assembly_update_componentswhen the component SKU stays the same but the required quantity changes. - Use
assembly_remove_componentswhen a single accessory or part should no longer ship with the bundle. - Use
assembly_clear_componentswhen you want to fully reset the bill of materials before rebuilding it.