BOM (Bill of Materials) API
Define and manage bills of materials for assembly items. BOMs specify the components, quantities, and relationships required to manufacture or assemble finished products.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /record/v1/bom | Retrieve list of BOMs |
| GET | /record/v1/bom/{id} | Retrieve specific BOM |
| POST | /record/v1/bom | Create new BOM |
| PATCH | /record/v1/bom/{id} | Update existing BOM |
| DELETE | /record/v1/bom/{id} | Delete BOM |
Key Fields
Header Fields
| Field | Type | Description | Required |
|---|---|---|---|
| name | String | BOM name/identifier | Yes |
| subsidiary | Object | Subsidiary where BOM is defined | Yes |
| isInactive | Boolean | Whether BOM is inactive | No |
| memo | String | Notes or description | No |
| useComponentYield | Boolean | Use component yield percentages | No |
| restrictToAssemblies | String | Restrict to specific assemblies | No |
| restrictToLocations | String | Restrict to specific locations | No |
| includeChildren | Boolean | Include child items in BOM | No |
| customForm | Object | Custom form reference | No |
| createdDate | DateTime | Date BOM was created | Read-only |
| lastModifiedDate | DateTime | Date BOM was last modified | Read-only |
Sublist: Member (member)
| Field | Type | Description | Required |
|---|---|---|---|
| component | Object | Component item reference | Yes |
| quantity | Number | Quantity required per assembly | Yes |
| bomQuantity | Number | Quantity for BOM calculations | No |
| units | Object | Unit of measure | No |
| itemSource | String | Source of the item | No |
| effectiveDate | Date | Date when component becomes effective | No |
| obsoleteDate | Date | Date when component becomes obsolete | No |
| componentYield | Number | Expected yield percentage | No |
| description | String | Component description | No |
Example: Create BOM
Request
POST /record/v1/bom
Content-Type: application/json
{
"name": "Widget-BOM-v1",
"subsidiary": {
"id": "1"
},
"isInactive": false,
"memo": "Standard BOM for Widget Assembly A",
"useComponentYield": true,
"member": {
"items": [
{
"component": {
"id": "789"
},
"quantity": 2,
"bomQuantity": 2,
"componentYield": 98,
"description": "Main component - 2 per unit"
},
{
"component": {
"id": "790"
},
"quantity": 1,
"bomQuantity": 1,
"componentYield": 100,
"description": "Secondary component - 1 per unit"
},
{
"component": {
"id": "791"
},
"quantity": 4,
"bomQuantity": 4,
"componentYield": 95,
"description": "Fasteners - 4 per unit"
}
]
}
}
Response
{
"id": "100",
"name": "Widget-BOM-v1",
"subsidiary": {
"id": "1",
"refName": "Parent Company"
},
"isInactive": false,
"memo": "Standard BOM for Widget Assembly A",
"useComponentYield": true,
"includeChildren": false,
"createdDate": "2025-12-25T09:00:00Z",
"lastModifiedDate": "2025-12-25T09:00:00Z",
"member": {
"items": [
{
"component": {
"id": "789",
"refName": "Component Part A"
},
"quantity": 2,
"bomQuantity": 2,
"componentYield": 98,
"units": {
"id": "1",
"refName": "Each"
},
"description": "Main component - 2 per unit"
},
{
"component": {
"id": "790",
"refName": "Component Part B"
},
"quantity": 1,
"bomQuantity": 1,
"componentYield": 100,
"units": {
"id": "1",
"refName": "Each"
},
"description": "Secondary component - 1 per unit"
},
{
"component": {
"id": "791",
"refName": "Fastener Set"
},
"quantity": 4,
"bomQuantity": 4,
"componentYield": 95,
"units": {
"id": "1",
"refName": "Each"
},
"description": "Fasteners - 4 per unit"
}
]
},
"links": [
{
"rel": "self",
"href": "https://your-account.suitetalk.api.netsuite.com/services/rest/record/v1/bom/100"
}
]
}
Example: Create BOM with Date Effectivity
Request
POST /record/v1/bom
Content-Type: application/json
{
"name": "Widget-BOM-v2-Phased",
"subsidiary": {
"id": "1"
},
"memo": "BOM with component phase-in/phase-out",
"member": {
"items": [
{
"component": {
"id": "789"
},
"quantity": 2,
"effectiveDate": "2025-01-01"
},
{
"component": {
"id": "792"
},
"quantity": 2,
"effectiveDate": "2026-01-01",
"description": "New component replacing 789 in 2026"
},
{
"component": {
"id": "790"
},
"quantity": 1,
"effectiveDate": "2025-01-01",
"obsoleteDate": "2025-12-31",
"description": "Being phased out end of 2025"
}
]
}
}
Response
{
"id": "101",
"name": "Widget-BOM-v2-Phased",
"memo": "BOM with component phase-in/phase-out",
"member": {
"items": [
{
"component": {
"id": "789",
"refName": "Component Part A"
},
"quantity": 2,
"effectiveDate": "2025-01-01"
},
{
"component": {
"id": "792",
"refName": "Component Part A-2"
},
"quantity": 2,
"effectiveDate": "2026-01-01",
"description": "New component replacing 789 in 2026"
},
{
"component": {
"id": "790",
"refName": "Component Part B"
},
"quantity": 1,
"effectiveDate": "2025-01-01",
"obsoleteDate": "2025-12-31",
"description": "Being phased out end of 2025"
}
]
},
"links": [
{
"rel": "self",
"href": "https://your-account.suitetalk.api.netsuite.com/services/rest/record/v1/bom/101"
}
]
}
Example: Update BOM
Request
PATCH /record/v1/bom/100
Content-Type: application/json
{
"memo": "Standard BOM for Widget Assembly A - Updated component quantities",
"member": {
"items": [
{
"component": {
"id": "789"
},
"quantity": 2.5,
"bomQuantity": 2.5,
"componentYield": 98
},
{
"component": {
"id": "790"
},
"quantity": 1,
"bomQuantity": 1,
"componentYield": 100
},
{
"component": {
"id": "791"
},
"quantity": 4,
"bomQuantity": 4,
"componentYield": 95
}
]
}
}
Response
{
"id": "100",
"memo": "Standard BOM for Widget Assembly A - Updated component quantities",
"lastModifiedDate": "2025-12-25T11:30:00Z",
"member": {
"items": [
{
"component": {
"id": "789",
"refName": "Component Part A"
},
"quantity": 2.5,
"bomQuantity": 2.5,
"componentYield": 98
},
{
"component": {
"id": "790",
"refName": "Component Part B"
},
"quantity": 1,
"bomQuantity": 1,
"componentYield": 100
},
{
"component": {
"id": "791",
"refName": "Fastener Set"
},
"quantity": 4,
"bomQuantity": 4,
"componentYield": 95
}
]
},
"links": [
{
"rel": "self",
"href": "https://your-account.suitetalk.api.netsuite.com/services/rest/record/v1/bom/100"
}
]
}
Sublists and Components
Member Components (member)
The member sublist defines the components that make up the BOM.
Fields:
component: Reference to the component itemquantity: Quantity required per assembly unitbomQuantity: Quantity for BOM calculationsunits: Unit of measurecomponentYield: Expected yield percentage (accounts for scrap/waste)effectiveDate: Date when component becomes activeobsoleteDate: Date when component is no longer useddescription: Additional notes about the component
Example:
"member": {
"items": [
{
"component": {"id": "789"},
"quantity": 2,
"componentYield": 98,
"effectiveDate": "2025-01-01"
}
]
}
Query Filters
Filter by Name
GET /record/v1/bom?q=name LIKE 'Widget%'
Filter by Subsidiary
GET /record/v1/bom?q=subsidiary EQUAL 1
Filter Active BOMs
GET /record/v1/bom?q=isInactive EQUAL false
Filter by Component
GET /record/v1/bom?q=member.component EQUAL 789
Expand Related Records
GET /record/v1/bom/100?expandSubResources=true
BOM Concepts
What is a BOM?
A Bill of Materials (BOM) is a comprehensive list of:
- Raw materials
- Components
- Sub-assemblies
- Quantities required
- Assembly instructions
BOM Types
- Single-Level BOM: Lists only direct components
- Multi-Level BOM: Includes sub-assemblies and their components
- Configurable BOM: Varies based on product configuration
Important Notes
-
BOM Purpose:
- Defines component requirements for assemblies
- Used by work orders, assembly builds, and MRP
- Determines material costs and requirements
- Supports product configuration and variants
-
Subsidiary Specific:
- BOMs are defined per subsidiary
- Different subsidiaries can have different BOMs for the same item
- Useful for regional manufacturing variations
-
Component Items:
- Components can be inventory items, non-inventory, or sub-assemblies
- Components must exist before adding to BOM
- Same component can appear multiple times with different dates
-
Quantity Management:
quantity: Standard quantity per assembly unitbomQuantity: May differ for special calculations- Fractional quantities are supported
- Zero quantity components are typically not allowed
-
Component Yield:
- Accounts for expected waste or scrap
- 98% yield means 2% expected loss
- Affects material requirements planning
- Higher quantities ordered to account for yield loss
-
Date Effectivity:
effectiveDate: Component starts being usedobsoleteDate: Component stops being used- Allows phased component transitions
- System uses effective components based on transaction date
-
BOM Assignment:
- BOMs can be assigned to assembly items
- Multiple BOMs can exist for one assembly (use revisions)
- Work orders and builds use the assigned BOM
- Can override BOM selection at build time
-
Include Children:
- When enabled, shows all sub-assembly components
- Provides complete material requirements
- Useful for procurement and planning
-
Location Restrictions:
- BOMs can be restricted to specific locations
- Different locations may use different component sources
- Supports multi-site manufacturing
-
Assembly Restrictions:
- BOMs can be restricted to specific assembly items
- One BOM can support multiple similar assemblies
- Simplifies maintenance of common BOMs
-
Inactive BOMs:
- Inactive BOMs cannot be used for new builds
- Existing work orders using inactive BOM can continue
- Use for discontinued products or outdated processes
-
BOM Costing:
- Assembly cost calculated from component costs
- Yield factors affect expected component consumption
- Supports standard, average, FIFO, and LIFO costing
-
BOM Revisions:
- Use BOM Revision records for version control
- Track engineering changes over time
- Maintain historical BOM configurations
-
Multi-Level BOMs:
- Sub-assemblies can have their own BOMs
- System automatically explodes to raw materials
- MRP considers all levels for requirements
-
Custom Forms: Custom BOM forms may include additional fields for engineering data.
-
Permissions: Requires "BOM" permission with appropriate access level.
-
Integration:
- BOMs integrate with MRP, work orders, and assembly builds
- PLM systems may synchronize with NetSuite BOMs
- Engineering change management may trigger BOM updates
-
Best Practices:
- Use clear, consistent naming conventions
- Document component purposes in descriptions
- Regularly review and update yield percentages
- Use date effectivity for smooth transitions
- Maintain BOM revisions for change tracking
-
Reporting:
- Where-used reports show which assemblies use a component
- Single-level and multi-level BOM reports available
- Cost rollup reports aggregate component costs
-
Mass Updates:
- Use CSV import for bulk BOM updates
- SuiteScript can automate BOM maintenance
- Version control important for compliance