{"id":2360,"date":"2026-04-15T19:47:05","date_gmt":"2026-04-15T09:47:05","guid":{"rendered":"https:\/\/www.hashmicro.com\/au\/blog\/?p=2360"},"modified":"2026-06-02T17:07:54","modified_gmt":"2026-06-02T07:07:54","slug":"bill-of-materials","status":"publish","type":"post","link":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/","title":{"rendered":"Bill of Materials (BOM): Types, Structure, and Components"},"content":{"rendered":"<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A bill of materials (BOM) is a hierarchical document that lists every raw material, component, and subassembly required to manufacture a finished product. It serves as the definitive reference for production, procurement, and engineering teams.<\/p>\n<div class=\"\" data-turn-id-container=\"request-WEB:8ae0e966-c44e-40b4-9222-f1b9d79c131a-13\" data-is-intersecting=\"true\">\n<section class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto R6Vx5W_threadScrollVars scroll-mb-[calc(var(--scroll-root-safe-area-inset-bottom,0px)+var(--thread-response-height))] scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" data-turn-id=\"request-WEB:8ae0e966-c44e-40b4-9222-f1b9d79c131a-13\" data-testid=\"conversation-turn-8\" data-scroll-anchor=\"false\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:var(--thread-content-margin-xs,calc(var(--spacing)*4))] @w-sm\/main:[--thread-content-margin:var(--thread-content-margin-sm,calc(var(--spacing)*6))] @w-lg\/main:[--thread-content-margin:var(--thread-content-margin-lg,calc(var(--spacing)*16))] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"flex max-w-full flex-col gap-4 grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal outline-none keyboard-focused:focus-ring [.text-message+&amp;]:mt-1\" dir=\"auto\" tabindex=\"0\" data-message-author-role=\"assistant\" data-message-id=\"cbeb31bd-b53b-4d9b-8730-38d40f761110\" data-message-model-slug=\"gpt-5-3\" data-turn-start-message=\"true\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"0\" data-end=\"228\" data-is-last-node=\"\" data-is-only-node=\"\">Without an accurate BOM, manufacturers cannot coordinate purchasing, schedule production, or calculate costs reliably. Errors lead to delays and extra costs, so many rely on <a href=\"https:\/\/www.hashmicro.com\/au\/hash-manufacturing-software\">software for managing BOM<\/a> to keep data consistent.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">This guide covers what a bill of materials contains, how it is structured, and how manufacturers can keep it accurate and integrated with procurement, production, and ERP systems from design through to delivery.<\/p>\n<style>\r\n\t.takeaways-container {\r\n\t\tmargin: 20px 0;\r\n\t\tfont-family: sans-serif;\r\n\t}\r\n\t.box-content {\r\n\t\tbackground-color: #fffacd;\r\n\t\tbox-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\r\n\t\tborder-radius: 25px;\r\n\t\tpadding: 25px;\r\n\t}\r\n\t.title {\r\n\t\tmargin-bottom: 20px;\r\n\t}\r\n\t.title p {\r\n\t\tdisplay: inline-block;\r\n\t\tbackground-color: #8A0E19;\r\n\t\tcolor: #ffffff;\r\n\t\tpadding: 8px 15px;\r\n\t\tborder-radius: 8px;\r\n\t\tfont-size: 22px;\r\n\t\tfont-weight: bold;\r\n\t\tmargin: 0;\r\n\t}\r\n\t.item {\r\n\t\tdisplay: flex;\r\n\t\talign-items: flex-start;\r\n\t\tmargin-bottom: 12px;\r\n\t}\r\n\t.item .circle {\r\n\t\twidth: 8px;\r\n\t\theight: 8px;\r\n\t\tbackground-color: #000000;\r\n\t\tborder-radius: 50%;\r\n\t\tmargin-right: 12px;\r\n\t\tflex-shrink: 0;\r\n\t\tmargin-top: 8px;\r\n\t}\r\n\t.item p {\r\n\t\tmargin: 0;\r\n\t\tfont-size: 16px;\r\n\t\tline-height: 1.6;\r\n\t}\r\n\t.item p a {\r\n\t\tcolor: #8A0E19;\r\n\t\tfont-weight: normal;\r\n\t\ttext-decoration: none;\r\n\t}\r\n\t.item p a:hover {\r\n\t\ttext-decoration: underline;\r\n\t}\r\n\t.button-wrapper {\r\n\t\tmargin-top: 25px;\r\n\t}\r\n\t.submit-button {\r\n\t\tbackground-color: #8a0e19;\r\n\t\tcolor: #fff !important;\r\n\t\ttransition: all .3s ease;\r\n\t\tpadding: 12px 28px;\r\n\t\tdisplay: inline-block;\r\n\t\tborder-radius: 12px;\r\n\t\tfont-size: 16px;\r\n\t\tfont-weight: bold;\r\n\t\ttext-decoration: none;\r\n\t}\r\n\t.submit-button:hover {\r\n\t\tbackground-color: #991b26;\r\n\t}\r\n\t@media (max-width: 767px) {\r\n\t\t.takeaways-container {\r\n\t\t\theight: auto;\r\n\t\t\tpadding: 0;\r\n\t\t}\r\n\t\t.box-content {\r\n\t\t\tpadding: 24px;\r\n\t\t}\r\n\t\t.content,\r\n\t\t.main-content,\r\n\t\t.list-item {\r\n\t\t\twidth: 100%;\r\n\t\t}\r\n\t}\r\n<\/style>\r\n\r\n<div class=\"takeaways-container\">\r\n\t<div class=\"box-content\">\r\n\t\t<div class=\"content\">\r\n\t\t\t<div class=\"title\">\r\n\t\t\t\t<p>Key Takeaways<\/p>\r\n\t\t\t<\/div>\r\n\t\t\t<div class=\"main-content\">\r\n\t\t\t\t<div class=\"list-item\">\r\n\t\t\t\t\t<div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#what-is-a-bill-of-materials\">A bill of materials is<\/a> a list of materials, parts, and subassemblies required to build a finished product.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#key-components-of-a-bill-of-materials\">Key components<\/a> include part details, quantities and unit of measure, and revision levels and lifecycle status.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#how-to-structure-and-manage-a-bill-of-materials\">Managing a bill of materials<\/a> involves processes from standardising names and descriptions of parts, to establishing approval workflows and version control.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#best-practices-for-bill-of-materials-management\">Best practices<\/a> includes centralizing records with a single system, establishing a formal change management process, conducting audits and data validations, and using an automating software.<\/p><\/div>\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t<\/div>\r\n<\/div>\n<!-- <div id=\"toc_group_article\" style=''>\r\n\t<p style='font-size:25px;font-weight:bold; margin-bottom:0px'>\r\n\t\tTable of Content:\r\n\t<\/p>\r\n\t<ul id=\"list_toc\" class='list_toc'><\/ul>\r\n<\/div> -->\r\n\r\n<!-- <div class=\"dropdown-fixed-top\" id=\"dropdown-fixed-top\">\r\n\t<div class=\"row\">\r\n\t\t<p id=\"pilihDaftarIsi\">Table of Content<\/p>\r\n\t\t<p><i class=\"td-icon-menu-down\"><\/i><\/p>\r\n\t<\/div>\r\n\t\r\n\t<div>\r\n\t\t<ul id=\"list_toc_top\" class='list_toc'><\/ul>\r\n\t<\/div>\r\n<\/div> -->\r\n\r\n<div id=\"placeholder-toc\"><\/div>\r\n<div id=\"toc\">\r\n    <div class=\"header\">\r\n\t<span class=\"toc-title\" id=\"toc-title\">Table of Content<\/span>\t\r\n\t <i class=\"toc-icon\">\r\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"30\" height=\"30\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#000\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"header-icon\">\r\n          <path d=\"m6 9 6 6 6-6\" \/>\r\n        <\/svg>\r\n      <\/i>\r\n\t<\/div>\r\n    <div class=\"list\">\r\n      <ul id=\"toc-list\"><\/ul>\r\n    <\/div>\r\n <\/div>\r\n\r\n<style>\r\n\t@media (max-width: 992px) {\r\n\t\t#toc_group_article {\r\n\t\t\tpadding-top: 24px;\r\n\t\t}\r\n\t}\r\n\t\r\n\t#list_toc_float {\r\n\t\tmax-height: calc(100vh - 250px);\r\n\t\toverflow-y: auto;\r\n\t}\r\n\t\r\n\t#list_toc_top {\r\n\t\tdisplay: none;\r\n\t\tbackground: #fff;\r\n\t\tmargin-bottom: 4px;\r\n\t}\r\n\t\r\n\t#list_toc_top li {\r\n\t\tdisplay: block;\r\n\t\tmargin-left: 0;\r\n\t\tlist-style: none;\r\n\t}\r\n\t\r\n\t#list_toc_top a {\r\n\t\tpadding: 5px;\r\n\t\tdisplay: block;\r\n\t}\r\n\t\r\n\t#list_toc_top.show {\r\n\t\tdisplay: block;\r\n\t}\r\n\r\n\t#list_toc_top a {\r\n\t\tcolor: #434343;\r\n\t\tborder-bottom: 1px solid #bbb;\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top {\r\n\t\tposition: fixed;\r\n\t\ttop: 59px;\r\n\t\twidth: 100%;\r\n\t\tz-index: 99;\r\n\t\tborder-bottom: 2px solid #9c171e;\r\n\t\tpadding: 12px;\r\n\t\tbackground: #fff;\r\n\t\twidth: 100%;\r\n\t\tcursor: pointer;\r\n\t\tdisplay: none;\r\n\t\tleft: 0;\r\n\t\tbox-shadow: 0 -2px 7px 6px rgba(0, 0, 0, 0.17);\r\n\t}\r\n\t\r\n\t#dropdown-fixed-top.show {\r\n\t\tanimation: showAnim 0.5s ease;\r\n\t\tdisplay: block;\r\n\t\topacity: 1;\r\n\t}\r\n\t\r\n\t@keyframes showAnim {\r\n\t\tfrom {\r\n\t\t\tdisplay: none;\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t\tto {\r\n\t\t\tdisplay: block;\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top #list_toc_top {\r\n\t\tmax-height: calc(50vh - 110px);\r\n\t\toverflow-y: scroll;\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top .row {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top .row p {\r\n\t\tmargin-bottom: 0;\r\n\t}\r\n\t\r\n\t#pilihDaftarIsi {\r\n\t\tmax-width: 100%;\r\n\t\toverflow: hidden;\r\n\t\twhite-space: nowrap;\r\n\t}\r\n\t\r\n\t@media (min-width: 1018px) {\r\n\t\t.dropdown-fixed-top {\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\t\r\n\t#list_toc li {margin-bottom: 0;margin-top: 5px;}\r\n\t#list_toc > li > ul {padding-left: 20px;margin-bottom: 0;}\r\n\t#list_toc{height:max-content;transition:ease-in-out}\r\n\t#list_toc li {margin-bottom: 0;margin-top: 5px;}\r\n\t#list_toc_float li.active > a {color:#b1252d;background: #ffe1e3;}\r\n\t#list_toc_top li.active > a {color:#b1252d;background: #ffe1e3;}\r\n\t#list_toc_float li a {padding:3px 7px}\r\n\t#list_toc_float li a {\r\n\t\tdisplay: block;\r\n\t\tcolor: #000;\r\n\t\tmargin-bottom: 6px;\r\n\t\tpadding-top: 2px;\r\n\t\tpadding-bottom: 2px;\r\n\t\ttransition: all 0.2s ease-in-out;\r\n\t\tfont-size: 15px;\r\n\t\tline-height: 18px;\r\n\t}\r\n\t#list_toc_float li{list-style:none;list-style-position:inside; margin-left:0;}\r\n\t#list_toc_float a:hover{color:#b1252d;}\r\n\t\r\n\t#toc_group_float{\r\n\t\tline-height: 24px;\r\n\t\tmax-height: calc(100vh - 100px);\r\n\t\toverflow: auto;\r\n\t\tz-index: 99;\r\n\t\tdisplay:none!important;\r\n\t\tbackground:#fff;\r\n\t\ttransition:all 0.5s linear\r\n\t}\r\n\t\r\n\t@media (min-width:1019px){\r\n\t\t#toc_group_float {\r\n\t\t\tdisplay:block!important;\r\n\t\t\t}\r\n\t\t\t\t#toc_group_article {\r\n\t\t\tdisplay:none;\r\n\t\t}\r\n\t}\r\n\r\n<\/style>\r\n\r\n<!-- ToC styling  -->\r\n<style>\r\n\t\/* Simple styling for the TOC *\/\r\n\t\r\n\t#toc ul li:last-child {\r\n    padding-bottom: 16px; \/* Adjust the value as needed *\/\r\n}\r\n\r\n.td-fix-index {\r\n\t transform: unset !important;\r\n     -webkit-transform: unset !important; \r\n}\r\n.footer-contact .td-fix-index {\r\n\t transform: translateZ(0) !important;\r\n     -webkit-transform: translateZ(0) !important; \r\n}\r\n\t.tdb_single_content .tdb-block-inner.td-fix-index{\r\n\t\tposition: static;\r\n\t}\r\n\t\r\n\r\n\t\r\n#toc {\r\n  background-color: #FFF;\r\n\tpadding: 17px 24px 0px 24px !important;\r\n  margin-bottom: 20px;\r\n\/*   border: 1px solid #9C171E; *\/\r\n  border-radius: 6px;\r\n\tdisplay: none;\r\n  max-width: 100%;\r\n  transition: .4s ease height;\r\n\tmargin-left: 0;\r\n\toverflow: hidden;\r\n}\r\n\r\n#toc .header{\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n\tbackground-color: transparent;\r\n}\r\n\t\r\n\t#toc.sticky .header{\r\n\t\tpadding: 4px 0;\r\n\t}\r\n\t\r\n.header p{\r\n  font-size: 18px !important;\r\n  font-weight: 600 !important;\r\n  color: #393939;\r\n   margin-bottom: 0;\r\n  \/* margin-top: 20px; *\/\r\n}\r\n\r\n.toc-icon{\r\n  float: right;\r\n\/*   visibility: hidden; *\/\r\n}\r\n\r\n\t.toc-title{\r\n\t\tmargin-right: auto;\r\n\/* \t\tpadding-left: 20px; *\/\r\n\t\tfont-weight: 600;\r\n\t\talign-self: center;\t}\t\r\n\r\n#toc ul {\r\n  list-style-type: none;\r\n  padding-left: 0;\r\n}\r\n\t\r\n#toc.sticky ul{\r\n\toverflow-y: auto;\r\n\tmax-height: 250px;\r\n\tmargin-top: 0px;\r\n\tpadding-top: 20px;\r\n\/* \tborder-top: 1px solid #d3d3d3; *\/\r\n}\r\n\t\r\n#toc ul li {\r\n\/*   margin-bottom: 10px; *\/\r\n  margin-bottom: 10px;\r\n\tmargin-left: 0;\r\n\ttransition: .2s ease;\r\n\tcursor: pointer;\r\n}\r\n\t\r\n\t#toc.sticky ul li {\r\n\t  margin-right: 10px;\r\n\t}\r\n\t\r\n.td-post-content #toc-list li a:hover, .td-post-content #toc-list a.active{\r\n\tbackground-color: #FFF;\r\n\/* \tpadding: 8px 16px 8px 16px; *\/\r\n\tpadding: 4px 16px 4px 16px;\r\n\tborder-radius: 6px;\r\n\tcolor: #9c171e !important;\r\n\tfont-weight: 600 !important;\r\n}\r\n\t\r\n\t.td-post-content #toc-list li:hover a, .td-post-content #toc-list a.active{\r\n\t\tcolor: #9C171E !important;\r\n\t\tfont-weight: 600 !important;\r\n\t}\r\n\t\r\n.td-post-content #toc-list a.active{\r\n\tfont-weight: bold !important;\r\n\tcolor: #9C171E !important;\r\n}\r\n\t\r\n#toc a, .td-post-content #toc-list a {\r\n  text-decoration: none;\r\n  color: #ea1717 !important;\r\n  transition: .2s ease;\r\n\tfont-weight: 400 !important;\r\n\tdisplay: block;\r\n\t\r\n\tpadding: 4px 16px 4px 0;\r\n}\r\n\r\n#toc.sticky {\r\n  position: fixed;\r\n\/*   top: 73px; *\/\r\n\tbottom: 0;\r\n  z-index: 100; \r\n  box-shadow: 0 2px 5px rgba(0,0,0,0.1); \r\n\twidth: 100%; \r\n\tbackground-color: #FFF;\r\n\/* \tbackground-color: #FFF1F1; *\/\r\n\tborder-bottom: 1px solid #ea1717;\r\n\/*   border: 1px solid #393939; *\/\r\n  box-shadow: 0px 0px 14px 0px #00000040;\r\n  cursor: pointer;\r\n\tanimation: fadein .3s ease;\r\n\tpadding: 12px 16px !important;\r\n}\r\n\t\r\n\t.fadein{\r\n\t\tanimation: fadein .3s ease;\r\n\t}\r\n\t\r\n\t.fadeout{\r\n\t\tanimation: fadeout .3s ease;\r\n\t}\r\n\t\r\n\t\r\n\t@keyframes fadein{\r\n\t\t0% {\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t\t100%{\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t}\r\n\t\r\n\t@keyframes fadeout{\r\n\t\t0% {\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t\t100%{\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n#toc.sticky .header p{\r\n\tmargin-bottom: 10px;\r\n\tmargin-top: 10px;\r\n}\r\n\r\n#toc.sticky .toc-icon{\r\n  visibility: visible;\r\n\/* \ttransition: 0.4s ease; *\/\r\n}\r\n\t\r\n\t.toc-icon{\r\n\t\talign-items: center;\r\n    \tdisplay: flex;\r\n\t}\r\n\t\r\n\tsvg.header-icon{\r\n\/* \t\tbackground-color: #9c171e; *\/\r\n\t\tbackground-color: #FFF;\r\n\t\tborder-radius: 30px;\r\n\t\tpadding: 5px;\r\n\t}\r\n\r\n#toc.sticky .list{\r\n\/*   max-height: 0; *\/\r\n  transition: height 0.4s ease;\r\n}\r\n\t\r\n\t#toc .list{\r\n\/*   max-height: 0; *\/\r\n  transition: height 0.4s ease;\r\n}\r\n\r\n#toc .header.active .toc-icon{\r\n\ttransform: rotate(0deg); \r\n\topacity: 1;\r\n}\r\n\r\n\t#toc .header.active + .list {\r\n\t  max-height: 200px; \/* Adjust this value as needed *\/\r\n\t  opacity: 1;\r\n\t}\r\n\t\r\n\t#placeholder-toc{\r\n\/* \t\tdisplay: none; *\/\r\n\t}\r\n\t\r\n\t@media (min-width: 768px) and (max-width: 991px){\r\n\t\t#toc.sticky{\r\n\/* \t\t\ttop: 104px; *\/\r\n\t\t\tbottom: 0px;\r\n\t\t}\r\n\t\t\r\n\t\t#toc{\r\n\t\t\twidth: unset !important;\r\n\t\t}\r\n\t}\r\n\t\r\n\t@media (max-width: 767px){\r\n\t\t#toc{\r\n\t\t\twidth: 100% !important;\r\n\t\t\tdisplay: inline-block;\r\n\t\t}\r\n\t\t\r\n\t\t#toc.sticky{\r\n\t\t\twidth: 90% !important;\r\n\/* \t\t\ttop: 81px; *\/\r\n\t\t\tbottom: 60px;\r\n\t\t\tmargin-left: auto;\r\n\t\t\tmargin-right: auto;\r\n\t\t\tpadding: 0 16px;\r\n\t\t\tright: 5%;\r\n\t\t}\r\n\t}\r\n\t\r\n\t<\/style>\r\n\r\n<!-- ToC List for mobile -->\r\n<script>\r\n \/\/ Generate TOC based on headings\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  \/\/ Get the element that will contain the TOC\r\n  const tocList = document.getElementById('toc-list');\r\n\r\n  \/\/ Get the element with the ID 'article-left'\r\n  const article = document.querySelector('.td-post-content');\r\n\r\n  \/\/ Find all h2 elements within 'myarticle'\r\n  const headers = article.getElementsByTagName('h2');\r\n\r\n  \/\/ Loop through the h2 elements and create a list item for each one\r\n  for (let i = 0; i < headers.length; i++) {\r\n    const header = headers[i];\r\n    const headerText = header.textContent;\r\n\/\/     const headerId = 'header-' + i;\r\n    const headerId = headerText\r\n    .toLowerCase()\r\n    .trim()\r\n    .replace(\/[^\\w\\s-]\/g, '')  \/\/ hapus tanda baca\r\n    .replace(\/\\s+\/g, '-'); \/\/ ganti spasi jadi \"-\"\r\n\r\n    \/\/ Set an ID for the header if it doesn't have one\r\n    header.setAttribute('id', headerId);\r\n\r\n    \/\/ Create a list item for the TOC\r\n    const listItem = document.createElement('li');\r\n\r\n    \/\/ Create a link for the list item\r\n    const link = document.createElement('a');\r\n    link.setAttribute('href', '#' + headerId);\r\n    link.textContent = headerText;\r\n\r\n    \/\/ Append the link to the list item\r\n    listItem.appendChild(link);\r\n\r\n    \/\/ Append the list item to the TOC list\r\n    tocList.appendChild(listItem);\r\n  }\r\n});\r\n\r\n\/\/ Keep height and placement of content using placeholder in place of TOC\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  const toc = document.querySelector('#toc');\r\n  const placeholderToc = document.querySelector('#placeholder-toc');\r\n\r\n  function setPlaceholderHeight() {\r\n    placeholderToc.style.height = `${toc.offsetHeight}px`;\r\n  }\r\n\r\n  \/\/ Set the initial height of the placeholder\r\n  setPlaceholderHeight();\r\n\r\n  \/\/ Update the height on window resize\r\n  window.addEventListener('resize', setPlaceholderHeight);\r\n});\r\n  const tocTitle = document.querySelector('#toc-title'); \/\/ Assuming header-faq is the element for TOC title\r\n\r\n\/\/ Sticky TOC and update heading\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  const toc = document.querySelector('#toc');\r\n  const footer = document.querySelector('.td-footer-template-wrap');\r\n  const tocParent = toc.parentElement;\r\n  const divTop = tocParent.getBoundingClientRect().top + window.pageYOffset;\r\n  const tocHeight = toc.offsetHeight;\r\n  const triggerPoint = divTop + tocHeight + 700;\r\n  const footerHeight = footer.offsetHeight;\r\n  const triggerFooterPoint = footer.getBoundingClientRect().top + window.pageYOffset - footerHeight - footerHeight - footerHeight;\r\n  const phtoc = document.querySelector('#placeholder-toc');\r\n  const headers = document.querySelectorAll('.td-post-content h2');\r\n  const navLinks = document.querySelectorAll('#toc-list a');\r\n\t\r\n\tconst panel2 = document.querySelector(\"#toc .list\");\r\n\tvar icon = document.querySelector(\".toc-icon\");\r\n\r\n  let activeLink = null; \/\/ Declare activeLink outside the loop\r\n\t\r\n  \/\/ Function to handle scroll and add\/remove .sticky class\r\n  function handleScroll() {\r\n    const windowTop = window.pageYOffset || document.documentElement.scrollTop;\r\n    let currentHeader = '';\r\n\r\n    \/\/ Highlight user progress as the heading comes\r\n    headers.forEach(header => {\r\n\t\tconst headerTop = header.offsetTop;\r\n\t\tconst headerHeight = header.clientHeight;\r\n\t\tif (window.scrollY >= (headerTop - headerHeight + 700)) {\r\n\t\t\tconst currentHeaderId = header.getAttribute('id');\r\n\t\t\tconst currentHeaderText = document.getElementById(currentHeaderId).textContent;\r\n\/\/ \t\t\tconsole.log(\"current header text:\", currentHeaderText);\r\n\t\t\ttocTitle.textContent = currentHeaderText;\r\n\t\t\tcurrentHeader = currentHeaderId;\r\n\t\t\t\r\n\t\t\tif(window.innerWidth < 767){\r\n\t\t\t\ttocTitle.textContent = 'Table of Content';\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n    navLinks.forEach(link => {\r\n      link.classList.remove('active');\r\n      if(currentHeader != '') {\r\n\t\t  if (link.getAttribute('href').includes(currentHeader)) {\r\n\t\t\t  link.classList.add('active');\r\n\t\t  }\r\n\t  }\r\n    });\r\n\/\/     if (windowTop < triggerFooterPoint) {\r\n\/\/         toc.style.display = 'block';\r\n\/\/ \t}else{\r\n\/\/         toc.style.display = 'none';\r\n\/\/ \t}\r\n    \/\/ Update TOC title if sticky\r\n    if (windowTop > triggerPoint) {\r\n      if (!toc.classList.contains('sticky')) {\r\n        phtoc.style.display = \"block\";\r\n        toc.classList.add('sticky');\r\n        toc.style.width = `${tocParent.offsetWidth}px`; \/\/ Set width to match the parent element\r\n        toc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n        toc.style.backgroundColor = \"#FFF\";\r\n\t\tpanel2.style.height = '0px';\r\n\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\t\t  if(window.innerWidth < 767){\r\n\/\/ \t\t\t  const tocs = document.querySelector('#toc.sticky');\r\n\t\t\t  tocTitle.textContent = 'Table of Content'; \/\/ Reset title\r\n       \t\t  toc.style.width = '150px'; \/\/ Set width to match the parent element\r\n\t\t  }\r\n      }\r\n      if (currentHeader) {\r\n\/\/         console.log(\"activeLink:\", activeLink);\r\n        if (activeLink) {\r\n\/\/           tocTitle.textContent = activeLink.textContent; \/\/ Update TOC title\r\n          tocTitle.textContent = activeLink ? activeLink.textContent : \"\"; \/\/ Update title only if activeLink exists\r\n        }\r\n      }\r\n    } else {\r\n      toc.classList.remove('sticky');\r\n      phtoc.style.display = \"none\";\r\n      toc.style.width = 'unset'; \/\/ Reset to original width\r\n      toc.style.backgroundColor = \"#FFF\";\r\n      tocTitle.textContent = 'Table of Content'; \/\/ Reset title\r\n\t\tpanel2.style.height = panel2.scrollHeight + \"px\";\r\n\t\ticon.style.transform = \"rotate(180deg)\";\r\n    }\r\n  }\r\n\r\n    \/\/ Attach the scroll event listener to the window\r\n    window.addEventListener('scroll', handleScroll);\r\n\r\n    \/\/ Initial call to handleScroll to set the correct state on load\r\n    handleScroll();\r\n});\r\n\t\r\n\t\/\/ Open toggle TOC\r\n\t  document.addEventListener(\"DOMContentLoaded\", function() {\r\n\t\tvar tocHeader = document.querySelector(\"#toc .header\");\r\n\t\tvar toc = document.querySelector(\"#toc\");\r\n\t\tvar icon = document.querySelector(\".toc-icon\");\r\n\t\tconst tocTitle = document.querySelector('#toc-title');\r\n\t\tconst tocs = document.querySelector('#toc.sticky');\r\n \t\tconst tocParent = toc.parentElement;\t\t  \r\n\r\n\t\t  tocHeader.addEventListener(\"click\", function() {\r\n\t\t\tvar panel = this.nextElementSibling;\r\n\t\t\tif (panel.style.height !== '0px') { \/\/ Check if height is not 0px\r\n\t\t\t  panel.style.height = '0px'; \/\/ Set height to 0 for full collapse\r\n\t\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\/\/ \t\t\t\ttoc.style.paddingBottom = '6px'; \r\n\t\t\t\tif(window.innerWidth > 768){\r\n\t\t\t\t\tif(!toc.classList.contains('sticky')){\r\n\t\t\t\t\t\ttoc.style.width = \"unset\";\r\n\/\/ \t\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (toc.classList.contains('sticky')){\r\n\t\t\t\t\t\ttoc.style.width = '${tocParent.offsetWidth}px';\r\n\t\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(window.innerWidth < 767){\r\n\t\t\t\t\ttoc.style.width = \"unset\"; \/\/ Reset width\r\n\t\t\t\t}\r\n\t\t\t\ttoc.style.backgroundColor = \"#FFF1F1\";\r\n\t\t\t} else {\r\n\t\t\t  panel.style.height = panel.scrollHeight + \"px\";\r\n\t\t\t  icon.style.transform = \"rotate(0deg)\";\r\n\t\t\t  toc.style.backgroundColor = \"#FFF\";\r\n\t\t\t  tocTitle.textContent = 'Table of Content'; \/\/ Reset title\r\n\t\t\t\ttoc.style.paddingBottom = '24px';\r\n\t\t\t \tif(window.innerWidth < 767){\r\n\t\t\t\t\ttoc.style.width = `${tocParent.offsetWidth}px`; \/\/ Set width to match the parent element\r\n\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t  });\r\n\r\n\t\t  \/\/ Close TOC when a link inside it is clicked\r\n\t\t  var tocLinks = document.querySelectorAll(\"#toc .list a\");\r\n\t\t  tocLinks.forEach(function(link) {\r\n\t\t\tlink.addEventListener(\"click\", function() {\r\n\t\t\t  var panel = document.querySelector(\"#toc .list\");\r\n\t\t\t  panel.style.height = '0px'; \/\/ Set height to 0 for full collapse\r\n\t\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\t\t\t  toc.style.backgroundColor = \"#FFF\";\r\n\t\t\t});\r\n\t\t  });\r\n\t\t});\r\n\r\n\r\n\r\n\t\r\n\/\/ \tmake the heading at the center of the viewport\r\n\/\/ \tdocument.addEventListener('DOMContentLoaded', function() {\r\n\/\/     \/\/ Add click event listener to all links in the TOC list\r\n\/\/     document.querySelectorAll('#toc-list a').forEach(anchor => {\r\n\/\/         anchor.addEventListener('click', function (e) {\r\n\/\/             e.preventDefault(); \/\/ Prevent the default behavior of jumping to the anchor\r\n\/\/ \/\/ \t\t\tconsole.log(\"prevent default\");\r\n\/\/             const targetId = this.getAttribute('href').substring(1); \/\/ Get the ID of the target element\r\n\/\/             const targetElement = document.getElementById(targetId); \/\/ Get the target element\r\n\r\n\/\/             if (targetElement) {\r\n\/\/                 const headerHeight = document.querySelector('#toc .header').offsetHeight; \/\/ Get the height of the fixed header\r\n\/\/                 const windowHeight = window.innerHeight; \/\/ Get the height of the viewport\r\n\/\/                 const targetOffset = targetElement.offsetTop; \/\/ Get the top offset of the target element\r\n\/\/                 const scrollTo = targetOffset + (windowHeight \/ 2) + (headerHeight); \/\/ Calculate the scroll position to center the target element\r\n\r\n\/\/                 \/\/ Scroll to the calculated position smoothly\r\n\/\/                 window.scrollTo({\r\n\/\/                     top: scrollTo,\r\n\/\/                     behavior: 'smooth'\r\n\/\/                 });\r\n\/\/             }\r\n\/\/         });\r\n\/\/     });\r\n\/\/ });\r\n<\/script>\r\n\r\n<!-- START script lama -->\r\n<!-- <script>\r\n\/\/ \tvar pilihDaftarIsi = document.getElementById('pilihDaftarIsi');\r\n\t\r\n\/\/ \tdocument.addEventListener('DOMContentLoaded', function() {\r\n\/\/ \t\tvar dropdownFixedTop = document.querySelector('.dropdown-fixed-top');\r\n\r\n\/\/ \t\tdropdownFixedTop.addEventListener('click', function() {\r\n\/\/ \t\t\tvar dropdownContent = this.querySelector('.list_toc');\r\n\/\/ \t\t\tdropdownContent.classList.toggle('show');\r\n\/\/ \t\t});\r\n\r\n\/\/ \t\twindow.addEventListener('click', function(event) {\r\n\/\/ \t\t\tvar listTocTop = document.getElementById('list_toc_top');\r\n\r\n\/\/ \t\t\tif (!dropdownFixedTop.contains(event.target)) {\r\n\/\/ \t\t\t\tlistTocTop.classList.remove('show');\r\n\/\/ \t\t\t}\r\n\/\/ \t\t});\r\n\/\/ \t});\r\n\t\r\n\/\/ \tvar daftarIsiContainer = document.getElementById('toc_group_article');\r\n\/\/ \tvar dropdownFixedTop = document.getElementById('dropdown-fixed-top');\r\n\/\/     var triggered = false; \/\/ Flag to keep track of whether the function has been triggered\r\n\r\n\/\/     window.addEventListener('scroll', function() {\r\n\/\/         if (!triggered && isCompletelyScrolledPast(daftarIsiContainer)) {\r\n\/\/             showSectionDropdownFixedTop(false);\r\n\/\/             triggered = true;\r\n\/\/         } else if (triggered && !isCompletelyScrolledPast(daftarIsiContainer)) {\r\n\/\/             showSectionDropdownFixedTop(true);\r\n\/\/             triggered = false;\r\n\/\/         }\r\n\/\/     });\r\n\r\n\/\/     function isCompletelyScrolledPast(element) {\r\n\/\/         var elementTop = element.getBoundingClientRect().top;\r\n\/\/         var elementBottom = element.getBoundingClientRect().bottom;\r\n\/\/         return elementTop < 0 && elementBottom < 0;\r\n\/\/     }\r\n\r\n\/\/     function showSectionDropdownFixedTop(show) {\r\n\/\/ \t\tif (show) {\r\n\/\/ \t\t\tdropdownFixedTop.classList.remove(\"show\");\r\n\/\/ \t\t} else {\r\n\/\/ \t\t\tdropdownFixedTop.classList.add(\"show\");\r\n\/\/ \t\t}\r\n\/\/     }\r\n<\/script> -->\r\n<!-- <script>\r\n    \/\/ Scrollspy function to highlight the active TOC item based on the scroll position\r\n  function scrollSpy(tocClass) {\r\n    const scrollPosition = window.scrollY;\r\n\r\n    \/\/ Find the active h2 and h3 headings based on their position in the corresponding TOC\r\n    let activeH2 = null;\r\n    let activeH3 = null;\r\n\r\n    const tocItems = document.querySelectorAll(`.${tocClass} li`);\r\n    tocItems.forEach(item => {\r\n      const a = item.querySelector('a');\r\n      if (!a) return;\r\n      const href = a.getAttribute('href');\r\n      const targetId = href.substring(1); \/\/ Remove the '#' from the href to get the target ID\r\n      const targetElement = document.getElementById(targetId);\r\n      if (!targetElement) return;\r\n\r\n      const targetTop = targetElement.getBoundingClientRect().top + scrollPosition;\r\n      const nextItem = item.nextElementSibling;\r\n      const nextTop = nextItem ? nextItem.getBoundingClientRect().top + scrollPosition : Infinity;\r\n\r\n      if (targetTop <= scrollPosition + 150) {\r\n        if (a.parentElement.parentElement === tocItems) {\r\n          \/\/ The h2 heading is at the root level of the TOC\r\n          activeH2 = { id: targetId, level: 'h2' };\r\n        } else {\r\n          \/\/ The h3 heading is nested under an h2 heading\r\n          const parentH2 = a.parentElement.parentElement.previousElementSibling;\r\n          if (parentH2) {\r\n            const h2Link = parentH2.querySelector('a');\r\n            if (h2Link) {\r\n              const h2Href = h2Link.getAttribute('href');\r\n              const h2Id = h2Href.substring(1);\r\n              activeH2 = { id: h2Id, level: 'h2' };\r\n            }\r\n          }\r\n          activeH3 = { id: targetId, level: 'h3' };\r\n        }\r\n      }\r\n\r\n      if (targetTop > scrollPosition + 150 && nextTop > scrollPosition + 150 && !activeH3) {\r\n        \/\/ Reset the activeH2 when there are no more active h3 headings\r\n        activeH2 = null;\r\n      }\r\n    });\r\n\r\n    \/\/ Update the active state for the TOC items\r\n    tocItems.forEach(item => {\r\n      item.classList.remove('active');\r\n      const a = item.querySelector('a');\r\n      if (a) {\r\n        const href = a.getAttribute('href');\r\n        const targetId = href.substring(1);\r\n        if ((activeH2 && activeH2.id === targetId) || (activeH3 && activeH3.id === targetId)) {\r\n          item.classList.add('active');\r\n\t\t  pilihDaftarIsi.innerHTML = a.textContent;\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Call scrollSpy for each TOC on window scroll\r\n  const tocClasses = ['list_toc', 'list_toc_float', 'list_toc_top']; \/\/ Add other TOC class names here if you have more than two instances\r\n  tocClasses.forEach(tocClass => {\r\n    window.addEventListener('scroll', () => scrollSpy(tocClass));\r\n  });\r\n<\/script> -->\r\n<!-- END script lama -->\r\n\t\r\n<script>\r\n    \/\/ Scrollspy function to highlight the active TOC item based on the scroll position\r\n  function scrollSpy(tocClass) {\r\n    const scrollPosition = window.scrollY;\r\n\r\n    \/\/ Find the active h2 and h3 headings based on their position in the corresponding TOC\r\n    let activeH2 = null;\r\n    let activeH3 = null;\r\n\r\n    const tocItems = document.querySelectorAll(`.${tocClass} li`);\r\n    tocItems.forEach(item => {\r\n      const a = item.querySelector('a');\r\n      if (!a) return;\r\n      const href = a.getAttribute('href');\r\n      const targetId = href.substring(1); \/\/ Remove the '#' from the href to get the target ID\r\n      const targetElement = document.getElementById(targetId);\r\n      if (!targetElement) return;\r\n\r\n      const targetTop = targetElement.getBoundingClientRect().top + scrollPosition;\r\n      const nextItem = item.nextElementSibling;\r\n      const nextTop = nextItem ? nextItem.getBoundingClientRect().top + scrollPosition : Infinity;\r\n\r\n      if (targetTop <= scrollPosition + 150) {\r\n        if (a.parentElement.parentElement === tocItems) {\r\n          \/\/ The h2 heading is at the root level of the TOC\r\n          activeH2 = { id: targetId, level: 'h2' };\r\n        } else {\r\n          \/\/ The h3 heading is nested under an h2 heading\r\n          const parentH2 = a.parentElement.parentElement.previousElementSibling;\r\n          if (parentH2) {\r\n            const h2Link = parentH2.querySelector('a');\r\n            if (h2Link) {\r\n              const h2Href = h2Link.getAttribute('href');\r\n              const h2Id = h2Href.substring(1);\r\n              activeH2 = { id: h2Id, level: 'h2' };\r\n            }\r\n          }\r\n          activeH3 = { id: targetId, level: 'h3' };\r\n        }\r\n      }\r\n\r\n      if (targetTop > scrollPosition + 150 && nextTop > scrollPosition + 150 && !activeH3) {\r\n        \/\/ Reset the activeH2 when there are no more active h3 headings\r\n        activeH2 = null;\r\n      }\r\n    });\r\n\r\n    \/\/ Update the active state for the TOC items\r\n    tocItems.forEach(item => {\r\n      item.classList.remove('active');\r\n      const a = item.querySelector('a');\r\n      if (a) {\r\n        const href = a.getAttribute('href');\r\n        const targetId = href.substring(1);\r\n        if ((activeH2 && activeH2.id === targetId) || (activeH3 && activeH3.id === targetId)) {\r\n          item.classList.add('active');\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Call scrollSpy for each TOC on window scroll\r\n  const tocClasses = ['list_toc', 'list_toc_float']; \/\/ Add other TOC class names here if you have more than two instances\r\n  tocClasses.forEach(tocClass => {\r\n    window.addEventListener('scroll', () => scrollSpy(tocClass));\r\n  });\r\n<\/script>\r\n\t\r\n\r\n<!-- ToC List for desktop side bar, diganti jadi inject by php, di code snippet \"Sidebar Accordion\" -->\r\n<!--  <script>\r\n\tdocument.addEventListener(\"DOMContentLoaded\", function() {\r\nToC List for desktop side bar, diganti jadi inject by php, di code snippet \"Sidebar Accordion\"\r\n        Fungsi untuk mengubah teks menjadi format id\r\n        function formatId(text) {\r\n            return text.trim().replace(\/[^\\w\\d]+\/g, '_');\r\n        }\r\n\r\n        \/\/ Fungsi untuk membuat nested list\r\n        function createNestedList(parentNode, children) {\r\n            if (children.length === 0) return;\r\n\r\n            const nestedUl = document.createElement('ul');\r\n            children.forEach(child => {\r\n                const nestedLi = document.createElement('li');\r\n                const nestedA = document.createElement('a');\r\n                nestedA.textContent = child.title;\r\n                nestedA.href = `#${child.id}`;\r\n                nestedLi.appendChild(nestedA);\r\n                nestedUl.appendChild(nestedLi);\r\n\r\n                if (child.children.length > 0) {\r\n                    createNestedList(nestedLi, child.children);\r\n                }\r\n            });\r\n\r\n            parentNode.appendChild(nestedUl);\r\n        }\r\n\r\n        \/\/ Membuat objek untuk menyimpan daftar h2 dan h3 beserta judulnya\r\n        const headings = [];\r\n\r\n           \/\/ Mengambil semua elemen h2 dan h3\r\n        const elements = document.querySelectorAll('.td-post-content h2');\r\n\t\t\t\/\/, .td-post-content h3\r\n\r\n        elements.forEach(element => {\r\n            if (element.tagName === 'H2') {\r\n                const id = formatId(element.textContent);\r\n                element.id = id;\r\n\t\t\t\tif (element.textContent.toLowerCase() === \"key takeaways\") {return;} \/\/ Kalau Key Takeaways, jangan dimasukin\r\n                headings.push({ level: 'h2', id: id, title: element.textContent, children: [] });\r\n            } else if (element.tagName === 'H3') {\r\n                const id = formatId(element.textContent);\r\n                element.id = id;\r\n                if (headings.length > 0) {\r\n                    headings[headings.length - 1].children.push({ level: 'h3', id: id, title: element.textContent, children: [] });\r\n                }\r\n            }\r\n        });\r\n\r\n        \/\/ Membuat list HTML dari objek headings\r\n        const ul = document.getElementById('list_toc');\r\n        let currentUl = ul;\r\n        headings.forEach(heading => {\r\n            const li = document.createElement('li');\r\n            const a = document.createElement('a');\r\n            a.textContent = heading.title;\r\n            a.href = `#${heading.id}`;\r\n            li.appendChild(a);\r\n\r\n            if (heading.level === 'h2') {\r\n                \/\/ Menyimpan ul saat ini untuk menambahkan nested ul\r\n                currentUl = li;\r\n                ul.appendChild(li);\r\n            } else if (heading.level === 'h3') {\r\n                if (!currentUl.lastElementChild || currentUl.lastElementChild.tagName !== 'UL') {\r\n                    \/\/ Jika belum ada nested ul, buat satu\r\n                    const nestedUl = document.createElement('ul');\r\n                    currentUl.appendChild(nestedUl);\r\n                    currentUl = nestedUl;\r\n                }\r\n                currentUl.appendChild(li);\r\n            }\r\n\r\n            createNestedList(li, heading.children);\r\n        });\r\n\t\tDapatkan elemen ul dengan id 'list_toc_float'\r\nconst ulFloat = document.getElementById('list_toc');\r\nconst ulJourney = document.getElementById('list_journey');\r\n\r\nDapatkan isi (child elements) dari ul dengan id 'list_toc_float'\r\n\tif (ulFloat !== null) {\r\n\t\tconst clonedChildren = ulFloat.cloneNode(true).children;\r\n\t\tconst ulToc = document.getElementById('list_toc_float');\r\n\t\tconst ulTocTop = document.getElementById('list_toc_top');\r\n\t\tif ((ulToc !== null || ulToc !== undefined) && window.innerWidth > 1018){\r\n\t\t\tulToc.append(...clonedChildren);\r\n\t\t} else {\r\n\t\t\tulTocTop.append(...clonedChildren);\r\n\t\t}\r\n\t} \r\n\r\n\tif (ulJourney !== null) {\r\n\t\tconst clonedChildrenJourney = ulJourney.cloneNode(true).children;\r\n\t\tconst ulTocJourney = document.getElementById('list_toc_journey');\r\n\t\tulTocJourney.append(...clonedChildrenJourney);\r\n\t} \r\n\t\r\n        Fungsi untuk mengambil tinggi navbar\r\n        function getNavbarHeight() {\r\n            const navbar = document.getElementById('tdi_34');\r\n            return navbar ? navbar.offsetHeight : 0;\r\n        }\r\n\r\n        \/\/ Fungsi untuk menambahkan offset posisi scroll\r\n        function scrollToElementWithOffset(elementId) {\r\n            const element = document.getElementById(elementId);\r\n            if (element) {\r\n                const offset = getNavbarHeight();\r\n                const elementPosition = element.getBoundingClientRect().top;\r\n                const offsetPosition = elementPosition - offset-40;\r\n\r\n                window.scrollBy({\r\n                    top: offsetPosition,\r\n                    behavior: 'smooth'\r\n                });\r\n            }\r\n        }\r\n\r\n        \/\/ Fungsi untuk menangani klik pada tautan judul\r\n        function handleTitleClick(event) {\r\n            event.preventDefault();\r\n            const href = event.target.getAttribute('href').substr(1);\r\n            scrollToElementWithOffset(href);\r\n        }\r\n\r\n        \/\/ Tambahkan event listener untuk semua tautan judul\r\n        const titleLinks = document.querySelectorAll('a[href^=\"#\"]');\r\n        titleLinks.forEach(link => {\r\n            link.addEventListener('click', handleTitleClick);\r\n        });\r\n\t});\r\n    <\/script> -->\r\n\n<a href=\"https:\/\/www.hashmicro.com\/au\/free-product-tour\/?medium=free-product-tour\" target=\"_blank\"><img decoding=\"async\" loading=\"lazy\" width=\"712\" src=\"https:\/\/www.hashmicro.com\/blog\/wp-content\/uploads\/2025\/11\/Free-Product-Tour-resized.webp\" alt=\"Free Demo\"><\/a>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\"><strong>What Is a Bill of Materials?<\/strong><\/h2>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-2531\" src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-61.webp\" alt=\"what-is-a-bill-of-materials?\" width=\"800\" height=\"400\" srcset=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-61.webp 800w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-61-300x150.webp 300w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-61-768x384.webp 768w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-61-150x75.webp 150w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-61-696x348.webp 696w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<style>\r\n.qa-box {\r\n    background-color: #f7eaea;\r\n    border-left: 5px solid #af2828;\r\n    border-radius: 8px;\r\n    padding: 24px;\r\n    margin-bottom: 30px;\r\n    box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\r\n}\r\n.qa-badge {\r\n    display: inline-block;\r\n    background-color: #af2828;\r\n    color: #ffffff;\r\n    padding: 6px 16px;\r\n    border-radius: 50px;\r\n    font-weight: 600;\r\n    font-size: 0.85rem;\r\n    margin-bottom: 16px;\r\n}\r\n.qa-title {\r\n    color: #1f2937;\r\n    font-size: 1.25rem;\r\n    font-weight: 700;\r\n    margin: 0 0 12px 0;\r\n    line-height: 1.4;\r\n}\r\n.qa-box p {\r\n    color: #4b5563;\r\n    font-size: 1rem;\r\n    line-height: 1.6;\r\n    margin-bottom: 24px;\r\n}\r\n.qa-box p:last-child {\r\n    margin-bottom: 0;\r\n}\r\n.qa-table-card {\r\n    background-color: #ffffff;\r\n    border-radius: 8px;\r\n    padding: 20px;\r\n    box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);\r\n    overflow-x: auto;\r\n    border: 1px solid #e5e7eb;\r\n}\r\n.qa-table {\r\n    width: 100%;\r\n    border-collapse: collapse;\r\n    min-width: 500px;\r\n    border: none;\r\n}\r\n.qa-table th {\r\n    text-align: left;\r\n    color: #4b5563;\r\n    font-weight: 700;\r\n    padding: 12px;\r\n    border: none;\r\n    border-bottom: 1px solid #e5e7eb;\r\n}\r\n.qa-table td {\r\n    padding: 16px 12px;\r\n    border: none;\r\n    border-bottom: 1px solid #f3f4f6;\r\n    color: #1f2937;\r\n    font-size: 0.95rem;\r\n    vertical-align: middle;\r\n}\r\n.qa-table tr:last-child td {\r\n    border-bottom: none;\r\n}\r\n.col-software { font-weight: 700; color: #111; }\r\n.text-green { color: #16a34a; font-weight: 600; }\r\n.check-icon {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 22px;\r\n    height: 22px;\r\n    background-color: #22c55e;\r\n    color: white;\r\n    border-radius: 4px;\r\n    font-size: 14px;\r\n    font-weight: bold;\r\n}\r\n<\/style>\r\n<div class=\"qa-box\">\r\n    <div class=\"qa-badge\">Quick Answer<\/div>\r\n        <div class=\"qa-title\">What is a Bill of Materials (BOM)?<\/div>\r\n            <p>A Bill of Materials (BOM) is a structured list of all the raw materials, components, assemblies, and sub-components required to manufacture a product. It details exactly what is needed, in what quantities, and how each part fits together to serve as the definitive reference for production planning.<\/p>\r\n        <\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A bill of materials is a comprehensive list of all materials, parts, and subassemblies required to produce a finished product. It records not just what is needed, but the exact quantity and form each item must take.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The document acts as the bridge between product design and physical production. Engineers use it to communicate their exact design intent, while the factory floor uses it as an actionable guide for assembling the product.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Each line item in a BOM carries a unique part number, a standardised description, the required quantity, and a unit of measure. These data fields eliminate ambiguity across purchasing, production, and quality control.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A BOM also captures the structural relationship between parts. A parent item, such as a wheel assembly, contains child components like a rim, tyre, hub, and spokes. This hierarchy guides assembly sequence and production routing.<\/p>\n<p data-start=\"2962\" data-end=\"3289\">Beyond the factory floor, this data informs cost calculations, supplier planning, and ERP systems. It is the single source of truth connecting design to procurement, production, and financial reporting. Many businesses also adopt <a href=\"https:\/\/www.hashmicro.com\/au\/blog\/manufacturing-software\/\">product component tracking tools<\/a> to improve visibility and control across complex assemblies.<\/p>\n<style>\r\n    #custom-quote {\r\n        background-color: #f0f0f0;\r\n        padding: 20px;\r\n        border-radius: 12px;\r\n        margin: 20px;\r\n        display: flex;\r\n        flex-direction: column;\r\n    }\r\n\r\n    #custom-quote .quote-body {\r\n        display: flex;\r\n        flex-direction: row;\r\n        align-items: flex-start;\r\n        gap: 15px;\r\n        font-size: 16px;\r\n        line-height: 1.5;\r\n        font-style: italic;\r\n    }\r\n\r\n    #custom-quote .quote-icon {\r\n        width: 40px;\r\n        height: 40px;\r\n        flex-shrink: 0;\r\n    }\r\n\r\n    #custom-quote .quote-author-wrapper {\r\n        margin-top: 15px;\r\n        align-self: flex-start;\r\n        margin-left: 55px; \r\n\t\tmargin-bottom: 0px;\r\n    }\r\n\r\n    #custom-quote em {\r\n        font-family: 'Roboto Serif', serif !important;\r\n        font-size: 12px;\r\n        font-weight: bold;\r\n        font-style: normal;\r\n    }\r\n\r\n    @media screen and (max-width: 768px) {\r\n        #custom-quote {\r\n            margin: 15px 0;\r\n            padding: 15px;\r\n        }\r\n        \r\n        #custom-quote .quote-body {\r\n            gap: 12px;\r\n        }\r\n\r\n        #custom-quote .quote-author-wrapper {\r\n            margin-left: 52px;\r\n        }\r\n    }\r\n\r\n    @media screen and (max-width: 480px) {\r\n        #custom-quote {\r\n            margin: 10px 0;\r\n            padding: 12px;\r\n        }\r\n\r\n        #custom-quote .quote-body {\r\n            font-size: 14px;\r\n            gap: 10px;\r\n        }\r\n\r\n        #custom-quote .quote-icon {\r\n            width: 32px;\r\n            height: 32px;\r\n        }\r\n\r\n        #custom-quote .quote-author-wrapper {\r\n            margin-top: 10px;\r\n            margin-left: 42px;\r\n        }\r\n    }\r\n<\/style>\r\n\r\n<div id=\"custom-quote\">\r\n    <div class=\"quote-body\">\r\n        <img decoding=\"async\" src=\"https:\/\/www.hashmicro.com\/blog\/wp-content\/uploads\/2025\/12\/quote.webp\" alt=\"Quote Icon\" class=\"quote-icon\">\r\n        <div>\r\n            A bill of materials is not simply a record of parts. It translates engineering intent into every purchasing decision, assembly instruction, and cost calculation that follows.        <\/div>\r\n    <\/div>\r\n    <p class=\"quote-author-wrapper\">\r\n        <em>Ricky Halim, B.Sc., Managing Director<\/em>\r\n    <\/p>\r\n<\/div>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\"><strong>Why a Bill of Materials Matters in Manufacturing<\/strong><\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A BOM does more than catalogue parts. It drives purchasing, production scheduling, and cost reporting across the business. When accurate, operations run smoothly. When it contains errors, the impact is immediate and wide-reaching.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">1. Preventing production delays and downtime<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Manufacturing lines depend on continuous flow. If a BOM omits a component or lists the wrong quantity, production stops the moment workers discover the shortage. This is known as a line-down situation.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">During a line-down, the business continues to pay for labour, utilities, and overhead while producing nothing sellable. Procurement then faces expensive expedite fees to rush missing parts to the floor.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">An accurate BOM prevents this by ensuring all required components are identified, ordered, and staged well before production begins. This keeps throughput consistent and eliminates avoidable delays.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">2. Controlling material costs and the cost of goods sold<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">When a BOM accurately reflects the physical product, accounting teams can calculate the exact Cost of Goods Sold (COGS). This supports accurate pricing and protects profit margins across all product lines.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">If a BOM lists five bolts but the actual assembly uses six, the business loses the cost of that sixth bolt on every unit produced. At scale, even a single omission can significantly erode profitability.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Inaccurate BOMs also cause over-purchasing. If the document overstates the required quantity of a costly component, procurement buys too much, tying up working capital in excess stock that may never be used.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">3. Improving quality control and reducing rework<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Quality control depends on the BOM specifying correct part revisions and tolerances. If the document references an outdated component, production builds to the wrong specification, causing failures at final inspection.<\/p>\n<div class=\"\" data-turn-id-container=\"request-WEB:8ae0e966-c44e-40b4-9222-f1b9d79c131a-14\" data-is-intersecting=\"true\">\n<section class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto R6Vx5W_threadScrollVars scroll-mb-[calc(var(--scroll-root-safe-area-inset-bottom,0px)+var(--thread-response-height))] scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" data-turn-id=\"request-WEB:8ae0e966-c44e-40b4-9222-f1b9d79c131a-14\" data-testid=\"conversation-turn-10\" data-scroll-anchor=\"false\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:var(--thread-content-margin-xs,calc(var(--spacing)*4))] @w-sm\/main:[--thread-content-margin:var(--thread-content-margin-sm,calc(var(--spacing)*6))] @w-lg\/main:[--thread-content-margin:var(--thread-content-margin-lg,calc(var(--spacing)*16))] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"flex max-w-full flex-col gap-4 grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal outline-none keyboard-focused:focus-ring [.text-message+&amp;]:mt-1\" dir=\"auto\" tabindex=\"0\" data-message-author-role=\"assistant\" data-message-id=\"647917d3-a083-4fee-aa65-31ede4252663\" data-message-model-slug=\"gpt-5-3\" data-turn-start-message=\"true\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"0\" data-end=\"237\" data-is-last-node=\"\" data-is-only-node=\"\">Fixing these failures requires rework, which increases labour costs and waste. Accurate BOMs and version control are critical, while <a href=\"https:\/\/www.hashmicro.com\/au\/blog\/manufacturing-systems\/\">software for production component visibility<\/a> helps teams catch issues early and avoid costly errors.<\/p>\n<h2 data-section-id=\"hq99q5\" data-start=\"102\" data-end=\"131\"><strong>Types of Bill of Materials<\/strong><\/h2>\n<p>A Bill of Materials (BOM) comes in several types, each designed for a specific stage of the product lifecycle. Choosing the right type ensures that engineering, production, and sales teams all work from accurate, relevant data.<\/p>\n<ul>\n<li><strong>Engineering Bill of Materials (EBOM)<\/strong><br \/>\nThe EBOM is used by engineering teams to represent the technical design of a product. It is typically built from CAD files and design specifications, focusing on how a product is structured rather than how it is manufactured.<\/li>\n<li><strong>Manufacturing Bill of Materials (MBOM)<\/strong><br \/>\nThe MBOM is used on the production floor to guide the manufacturing process. It lists every component needed to produce a finished, sellable product, including supporting materials that the EBOM may not capture.<\/li>\n<li><strong>Configurable Bill of Materials (CBOM)<\/strong><br \/>\nThe CBOM suits products with multiple variants or customer-defined options. It allows businesses to adjust the BOM based on specific configurations, so each customer order reflects the correct set of components.<\/li>\n<li><strong>Phantom Bill of Materials<\/strong><br \/>\nA phantom BOM covers sub-assemblies that are not stocked as separate inventory items. These components feed directly into the production process without passing through the warehouse, which keeps the BOM structure lean.<\/li>\n<li><strong>Planning Bill of Materials<\/strong><br \/>\nThe planning BOM supports demand planning and material forecasting. Businesses use it to estimate material requirements across different production scenarios before actual orders are confirmed.<\/li>\n<li><strong>Single-Level BOM<\/strong><br \/>\nA single-level BOM lists only the immediate components required to assemble a finished product, without breaking those components down further. It works well for simple products with no nested sub-assemblies, making it easy to read and quick to maintain.<\/li>\n<li><strong>Multi-Level BOM<\/strong><br \/>\nA multi-level BOM maps the full hierarchy of a product, from the top-level assembly down through every sub-assembly and individual part. This structure gives manufacturers complete visibility into how components relate to each other, which is essential for planning and costing complex products.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p data-start=\"133\" data-end=\"338\"><strong style=\"color: #111111; font-family: Roboto, sans-serif; font-size: 27px;\">Key Components of a Bill of Materials<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A well-structured BOM contains more than a parts list. Each line item must carry specific, standardised data fields that leave no room for ambiguity in purchasing, production, or quality control.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">1. Part numbers, names, and descriptions<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Every component in a BOM requires a unique part number. This identifier is used consistently across all systems, from CAD and PLM to ERP, ensuring no two items are confused during ordering or assembly.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Each item also needs a clear, standardised description. For example, &#8220;Hex Bolt, M8x1.25, Stainless Steel&#8221; tells a worker exactly which fastener to pick. Without this clarity, assembly errors are unavoidable.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">2. Quantities and units of measure<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The quantity field specifies how many units of each component are needed per parent assembly. If a table requires four legs, the quantity for the leg component is precisely four, with no room for interpretation.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The unit of measure (UOM) is equally critical. Discrete parts are counted in pieces, while raw materials may be measured in grams, metres, or millilitres. A mismatch in UOM causes purchasing errors and line stoppages.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">3. Revision levels and lifecycle status<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Products evolve through engineering change orders, which update the BOM whenever a design is corrected or a part is replaced. Each update advances the revision level, so teams always build to the current version.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Lifecycle status flags whether a part is active, experimental, or nearing obsolescence. This prevents procurement from ordering discontinued components and helps engineering plan design transitions in advance.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">BOM notes add a further layer of detail. These fields capture handling instructions, torque specifications, or approved substitute parts that can be used when the primary component is unavailable.<\/p>\n<h3>4. Procurement type<\/h3>\n<p>The procurement type field defines how each component enters the production process. Common types include make, buy, and phantom, and each one drives different actions across purchasing and production planning.<\/p>\n<p>A &#8220;buy&#8221; component triggers a purchase order when demand is raised. A &#8220;make&#8221; component generates a work order for internal production instead. Phantom components pass their usage directly to child items without creating a separate order, which simplifies structures for modular assemblies.<\/p>\n<p>Getting this field right from the start prevents misrouted orders and ensures demand signals reach the correct team, whether that is the purchasing desk or the production floor.<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\"><strong>How to Structure and Manage a Bill of Materials<\/strong><\/h2>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-2519\" src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-scaled.webp\" alt=\"how-to-structure-and-manage-a-bill-of-materials\" width=\"2560\" height=\"1429\" srcset=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-scaled.webp 2560w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-300x167.webp 300w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-1024x572.webp 1024w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-768x429.webp 768w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-1536x857.webp 1536w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-2048x1143.webp 2048w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-753x420.webp 753w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-150x84.webp 150w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-696x388.webp 696w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-1068x596.webp 1068w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-13-1920x1072.webp 1920w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Building an effective BOM requires more than listing parts. Manufacturers must define the hierarchy, establish version control, and integrate the document with the systems that drive purchasing and production.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">1. Standardise naming conventions and part numbering<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The priority is strict data governance. Every component needs a unique part number and a standardised description to prevent duplicate entries and ensure procurement orders the correct item every time.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Consistent naming also supports searchability across PLM and ERP systems. When teams use different naming conventions for the same part, duplicates appear, and the BOM becomes an unreliable source of data.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">2. Define the hierarchy and choose the right BOM type<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Manufacturers must choose between a single-level and a multi-level BOM. A single-level format suits simple products and lists all items flat. A multi-level BOM uses indentation to show how parts roll up into subassemblies.<\/p>\n<p data-start=\"8636\" data-end=\"8950\">For highly configurable products, a Configurable BOM allows manufacturers to manage all variants in one document. The system then generates a unique BOM for each customer configuration at the point of order. This approach also supports more accurate <a href=\"https:\/\/www.hashmicro.com\/au\/blog\/material-requirements-planning\/\">material usage planning<\/a> across different product variations.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">3. Establish approval workflows and version control<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Every BOM change must follow a formal approval process. Engineers, procurement officers, and production leads should all review and sign off on updates before any purchasing or manufacturing activity begins.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">This workflow prevents unapproved changes from reaching the floor. It also creates an audit trail so teams can trace which revision was active during a production run. This matters for warranty and compliance.<\/p>\n<h2 data-section-id=\"u4hlby\" data-start=\"0\" data-end=\"43\"><strong>The Bill of Materials Management Process<\/strong><\/h2>\n<p data-start=\"45\" data-end=\"391\">Managing a Bill of Materials (BOM) requires a structured process to ensure every component, quantity, and production requirement is accurate before manufacturing begins.<\/p>\n<h3 data-section-id=\"7uy9s3\" data-start=\"45\" data-end=\"88\">1. Gather Product Design Specifications<\/h3>\n<p data-start=\"89\" data-end=\"273\">Begin by collecting product drawings, CAD files, engineering documents, and manufacturing requirements. This ensures the BOM is based on accurate and up-to-date product specifications.<\/p>\n<h3 data-section-id=\"1t0zdht\" data-start=\"275\" data-end=\"306\">2. Define the BOM Hierarchy<\/h3>\n<p data-start=\"307\" data-end=\"463\">Organise the BOM into parent items, sub-assemblies, components, and raw materials. A clear hierarchy improves visibility and simplifies production planning.<\/p>\n<h3 data-section-id=\"ts784d\" data-start=\"465\" data-end=\"506\">3. Assign Part Numbers and Item Codes<\/h3>\n<p data-start=\"507\" data-end=\"667\">Give each component a unique part number or SKU to avoid duplication and confusion. Standardised codes also improve inventory tracking and procurement accuracy.<\/p>\n<h3 data-section-id=\"o4a3d4\" data-start=\"669\" data-end=\"721\">4. Set Quantities and Units of Measurement (UOM)<\/h3>\n<p data-start=\"722\" data-end=\"876\">Specify the exact quantity and unit of measurement required for each item in the BOM. Accurate data helps prevent material shortages and excess inventory.<\/p>\n<h3 data-section-id=\"1it2v1f\" data-start=\"878\" data-end=\"920\">5. Validate Against Physical Inventory<\/h3>\n<p data-start=\"921\" data-end=\"1104\">Compare BOM requirements with current warehouse and inventory records before production begins. This step helps identify missing materials, obsolete stock, or inventory discrepancies.<\/p>\n<h3 data-section-id=\"ogqgxf\" data-start=\"1106\" data-end=\"1168\">6. Release Changes Through Engineering Change Orders (ECO)<\/h3>\n<p data-start=\"1169\" data-end=\"1336\">Any BOM updates should go through a formal Engineering Change Order (ECO) approval process. Controlled revisions help maintain version accuracy across all departments.<\/p>\n<h3 data-section-id=\"fzivfp\" data-start=\"1338\" data-end=\"1396\">7. Integrate the BOM Into ERP or Manufacturing Systems<\/h3>\n<p data-start=\"1397\" data-end=\"1586\" data-is-last-node=\"\" data-is-only-node=\"\">Import the finalised BOM into the ERP or manufacturing management system for operational use. Integration supports purchasing, inventory management, production scheduling, and cost control.<\/p>\n<p data-start=\"1397\" data-end=\"1586\" data-is-last-node=\"\" data-is-only-node=\"\">Once integrated, the ERP uses the BOM to automatically generate material requirements plans (MRP), trigger purchase orders when stock falls below reorder points, and update cost of goods calculations whenever a component price changes.<\/p>\n<h2><strong>Bill of Materials in Asset Management<\/strong><\/h2>\n<p>Bill of Materials (BOM) plays an important role in asset management, especially when supported by <a href=\"https:\/\/www.hashmicro.com\/au\/blog\/best-asset-management-software\/\">asset management software<\/a> that centralises maintenance and tracking.<\/p>\n<p>It is widely used for spare parts tracking, allowing each component to be documented and easily identified when replacements are needed. BOM also supports predictive maintenance scheduling, helping teams anticipate failures and perform maintenance.<\/p>\n<p>In addition, BOM supports equipment lifecycle management by covering the full lifecycle of an asset from acquisition to disposal.<\/p>\n<h2><strong>Bill of Materials Across Industries<\/strong><\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">While the core structure of a BOM remains consistent, its application varies across sectors. Each industry adapts the framework to suit its own production complexity, regulatory requirements, and supply chain demands.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">1. Electronics and technology manufacturing<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">In electronics, the Engineering BOM is closely tied to printed circuit board (PCB) layouts. Each item details microscopic components such as resistors, capacitors, and microchips, along with precise placement specifications.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Reference designators are critical in this context. They specify exactly where each component sits on the PCB, for example, &#8220;R12&#8221; for a resistor or &#8220;C4&#8221; for a capacitor, eliminating guesswork during assembly.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Product cycles in this sector move fast. Version control is particularly vital, as component obsolescence is common and alternative parts must be validated and documented quickly to prevent production interruptions.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">2. Automotive and aerospace<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">These industries rely on complex, multi-level BOMs managing tens of thousands of parts per vehicle or aircraft. A single model may include everything from engine block castings to the specific grade of interior leather.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Regulatory compliance demands rigorous version control. Manufacturers must identify which BOM revision was used to produce any unit, often years after the build date, to support recalls and warranty claims.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">3. Software and cybersecurity<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The BOM framework has expanded into software through the Software Bill of Materials (SBOM). An SBOM catalogs the open-source libraries, third-party dependencies, and proprietary code within an application.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">This is now a critical cybersecurity compliance requirement. When a vulnerability is discovered in a widely used library, an SBOM lets developers identify which applications are affected and prioritise patching quickly.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">4. Bill of materials in Australian manufacturing<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><a href=\"https:\/\/business.gov.au\/planning\/industry-information\/manufacturing-industry\">Australian manufacturing<\/a> businesses face unique supply chain challenges, including reliance on imported components and long lead times from international suppliers. A well-maintained BOM helps manage this complexity.<\/p>\n<p data-start=\"11581\" data-end=\"11882\">Industries such as food and beverage, defence manufacturing, and industrial production must also comply with strict regulatory frameworks. Many also rely on <a href=\"https:\/\/www.hashmicro.com\/au\/blog\/production-planning\/\">production materials mapping<\/a> to align supply availability with production schedules.<\/p>\n<p data-start=\"11581\" data-end=\"11882\">For example, defence manufacturers often need to align with Defence Aviation Safety Authority (DASA) standards and Australian Defence Force (ADF) supplier requirements, ensuring full traceability and compliance across all materials used.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The <a href=\"https:\/\/www.abs.gov.au\/statistics\/industry\/industry-overview\/australian-industry\/latest-release\">Australian Bureau of Statistics<\/a> publishes manufacturing output and supply chain data that businesses can use to benchmark procurement lead times and material planning against industry performance.<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\"><strong>Common BOM Mistakes to Avoid<\/strong><\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Even with the right systems in place, procedural lapses can compromise BOM integrity. The most damaging mistakes tend to be habitual and often go undetected until they cause a visible production or financial failure.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">1. Neglecting version control after design changes<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Engineering change orders are routine in product development. When an approved change is not reflected in the BOM and distributed to all affected teams, multiple versions of the document begin to circulate.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The result is procurement ordering parts for an outdated design while production expects updated components. This discrepancy typically surfaces only after incorrect parts have already been received and staged.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">2. Inconsistent or missing units of measure<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Specifying a quantity of &#8220;10&#8221; without a unit of measure is a frequent and costly oversight. That figure could mean 10 pieces, 10 metres, or 10 grams. Without a clear UOM, procurement cannot order accurately.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A UOM mismatch can halt an assembly line or cause significant budget overruns. Enforcing a standardised unit of measure for every line item, regardless of how obvious it seems, is a non-negotiable discipline.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">3. Working in departmental silos<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">When engineering and manufacturing maintain separate BOMs without synchronisation, critical discrepancies are inevitable. The EBOM and MBOM can diverge until neither document is fully reliable.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">When procurement substitutes a part without notifying engineering, the official BOM no longer reflects the physical product. These undocumented substitutions accumulate and make quality issues difficult to trace.<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\"><strong>Best Practices for Bill of Materials Management<\/strong><\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Maintaining BOM integrity at scale requires more than accurate data entry. The following practices help manufacturers keep their BOMs reliable, integrated, and aligned with the pace of product and supply chain change.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">1. Centralise the BOM in a single system of record<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Spreadsheets are a common starting point, but they break down quickly as product complexity grows. Moving the BOM into a centralised PLM or ERP platform ensures all teams have access to the same live document at all times.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A centralised system eliminates conflicting versions circulating across departments. It also enables real-time updates, so any approved change is immediately visible to engineering, procurement, and production simultaneously.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">2. Establish a formal change management process<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Every BOM update should move through a structured engineering change order process. This means documenting the reason for the change, identifying affected assemblies, and obtaining cross-team sign-off before release.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A formal process ensures downstream impacts are considered before approval. A minor component swap can affect procurement lead times, assembly routing, and cost calculations across the entire product line.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">3. Conduct regular BOM audits and data validation<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Periodic audits compare the BOM against physical inventory and production records to identify discrepancies before they cause stoppages. Even well-managed documents drift from physical reality without routine verification.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Advanced manufacturers use automated validation tools to cross-reference BOMs against supply chain databases. These systems flag components with impending shortages, extended lead times, or approaching obsolescence.<\/p>\n<h3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">4. Use software to automate BOM management<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Integrating the BOM with a <a href=\"https:\/\/www.hashmicro.com\/au\/hash-manufacturing-software?medium=moneysite-banner\">manufacturing management system<\/a> automates material requirements planning, purchasing, and inventory management. When the BOM changes, the system recalculates demand and adjusts procurement schedules accordingly.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">ERP platforms enable seamless data flow between engineering, procurement, and finance. A design change made in the PLM can automatically update cost estimates and purchasing forecasts, removing manual reconciliation entirely.<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\"><strong>Conclusion<\/strong><\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A bill of materials is the core operational document in any manufacturing business. When structured and maintained correctly, it ensures every team, from design to dispatch, works from the same accurate, up-to-date information.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The most common BOM failures, including version drift, UOM errors, and siloed data, are all preventable. For Australian manufacturers, investing in BOM accuracy and ERP integration is a fundamental requirement for reliable, cost-controlled production.<\/p>\n<p>A well-maintained BOM is the foundation of reliable production and accurate costing. If your team is still managing BOMs in spreadsheets, a <a href=\"https:\/\/www.hashmicro.com\/au\/free-product-tour\/?medium=free-product-tour\">free consultation<\/a>\u00a0with our manufacturing ERP specialists can help you map the migration path.<\/p>\n<a href=\"https:\/\/www.hashmicro.com\/au\/hash-manufacturing-software?medium=moneysite-banner\" target=\"_blank\"><img decoding=\"async\" loading=\"lazy\" width=\"712\" src=\"https:\/\/www.hashmicro.com\/blog\/wp-content\/uploads\/2025\/06\/Manufacturing.webp\" alt=\"Hash Manufacturing Automation\"><\/a>\n<p><h2 class=\"faqTitle\">Frequently Asked Question<\/h2>\r\n<style>\r\n\t#main-article p.faqTitle{\r\n\t\ttext-align: center;\r\n\t\tmargin-bottom: 0;\r\n\t\tmargin-top: 50px;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\t\r\n\t.accordion-wrapper{\r\n\t\tbackground-color: white;\r\n\t\tborder: 1px solid #9c171e;\r\n\t\tborder-radius: 6px;\r\n\t\ttransition: 0.4s ease;\r\n\t\tmargin-bottom: 20px;\r\n\t\toverflow: hidden;\r\n\t}\r\n\t\r\n\t.header-faq{\r\n\t\tdisplay: flex;\r\n\t\tborder: none;\r\n\t\tborder-radius: 6px 6px 6px 6px;\r\n\t\tbackground: #FFF;\r\n\t\talign-items: center;\r\n\t\tpadding: 18px;\r\n\t\ttransition: 0.4s;\r\n\t\tcursor: pointer;\r\n\t\tjustify-content: space-between;\r\n\t}\r\n\t\r\n\t.header-faq p{\r\n\t\tmargin-bottom: 0;\r\n\t}\r\n\t\r\n\t.question {\r\n\t\tcolor: #3C3C3C;\r\n\t\twidth: 100%;\r\n\t\ttext-align: left;\r\n\t\tfont-size: 16px;\r\n\t\tline-height: 20px;\r\n\t \ttransition: 0.4s;\r\n\t\tborder: none;\r\n\t\tborder-radius: 6px 6px 6px 6px;\r\n\t\tbackground: #FFF;\r\n\t\tpadding: 0;\r\n\t\ttext-transform: uppercase;\r\n\t\tfont-weight: 700;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.header-faq.active {\r\n\t  background-color: #FFF;\r\n\t}\r\n\t\r\n\tbutton.question{\r\n\t\tcolor: unset;\r\n\t\tbackground-color: unset;\r\n\t}\r\n\t\r\n\tbutton.question::after{\r\n\t\tcontent: \"<\";\r\n\t\twidth: 2.2rem;\r\n\t\theight: 2.2rem;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tborder-radius: 50%;\r\n\t\tcolor: #FFF;\r\n\t\tflex-shrink: 0;\r\n\t\tfloat: right;\r\n\t\ttransition: 0.4s;\r\n\t\topacity: 0.4;\r\n\t\tposition: relative;\r\n\t\ttransform: rotate(-90deg);\r\n\t\tbackground-color: #9c171e;\r\n\t\tfont-family: monospace;\r\n\t}\r\n\r\n\t.answer {\r\n\t  padding: 0 18px;\r\n\t  max-height: 0;\r\n\t  overflow: hidden;\r\n\t  background-color: white;\r\n\t  border-radius: 0 0 6px 6px;\r\n\t  transition: max-height 0.4s ease, opacity 0.4s ease;\r\n\t  opacity: 0;\r\n\t}\r\n\r\n\t.answer p{\r\n\t\tfont-size: 16px;\r\n\t\tfont-weight: 400;\r\n\t\tline-height: 28px;\r\n\t\ttext-align: left;\r\n\t\ttext-transform: none;\r\n\t\tcolor: #494949;\r\n\t}\r\n\t\r\n\t.accordion-wrapper.active{\r\n\t\tbox-shadow: 0px 0px 20px 0px #4034AB38;\r\n\t}\r\n\t\r\n\t.header-faq.active .accordion-icon .vLine{\r\n\t\ttransform: translateX(-50%) rotate(0deg);\r\n\t}\r\n\r\n\t.header-faq.active + .answer {\r\n\t  opacity: 1;\r\n\t}\r\n\t\r\n\t.header-faq.active button.question::after{\r\n\t\ttransform: rotate(90deg);\r\n\t\topacity: 1;\r\n\t}\r\n\t\r\n\t.header-faq:hover button.question::after{\r\n\t\topacity: 1;\r\n\t}\r\n\t\r\n\t.faq-h3-addition {\r\n\t\tmargin: 0 !important;\r\n\t\tpadding-right: 15px;\r\n\t\tmin-width: 0;\r\n\t}\r\n<\/style>\r\n\r\n    <div class=\"accordion-wrapper\">\r\n        <div class=\"header-faq\">\r\n            <button class=\"question\">What software is used to manage a bill of materials?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>Bill of materials is typically managed using ERP systems, Product Lifecycle Management (PLM) software, or manufacturing systems with integrated BOM modules. Common tools include SAP, Oracle NetSuite, and other cloud-based ERP platforms that support version control, inventory integration, and production planning.<\/p>\r\n        <\/div>\r\n    <\/div>\r\n    <div class=\"accordion-wrapper\">\r\n        <div class=\"header-faq\">\r\n            <button class=\"question\">What is the difference between a bill of materials and a parts list?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>A parts list is a flat inventory of components associated with a product. A BOM goes further by capturing the hierarchical relationship between parts, quantities, units of measure, revision levels, and structural assemblies.<\/p>\r\n        <\/div>\r\n    <\/div>\r\n    <div class=\"accordion-wrapper\">\r\n        <div class=\"header-faq\">\r\n            <button class=\"question\">Who is responsible for creating and maintaining a bill of materials?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>Engineering typically creates the initial BOM from design specifications. Maintenance is a shared responsibility across procurement, production, and quality teams, with a formal change order process governing all updates.<\/p>\r\n        <\/div>\r\n    <\/div>\r\n    <div class=\"accordion-wrapper\">\r\n        <div class=\"header-faq\">\r\n            <button class=\"question\">What is the difference between an EBOM and an MBOM?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>An Engineering BOM reflects the product as designed, capturing components and specifications from the CAD or PLM system. A Manufacturing BOM translates that design into production instructions, accounting for assembly sequence, tooling, and process-specific requirements.<\/p>\r\n        <\/div>\r\n    <\/div>\r\n    <div class=\"accordion-wrapper\">\r\n        <div class=\"header-faq\">\r\n            <button class=\"question\">What is a phantom BOM and when is it used?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>A phantom BOM represents a subassembly that exists in the structure for planning purposes but is never stocked or built as a standalone unit. It groups components logically within a complex assembly without triggering a separate work order.<\/p>\r\n        <\/div>\r\n    <\/div>\r\n    <div class=\"accordion-wrapper\">\r\n        <div class=\"header-faq\">\r\n            <button class=\"question\">How do Australian manufacturers typically manage bill of materials changes?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>Australian manufacturers typically manage BOM changes through a formal Engineering Change Order (ECO) process to ensure controlled updates and full traceability. These changes must comply with local documentation and audit requirements, especially in regulated industries such as defence and food manufacturing. ERP systems streamline this process by enabling version control, approval workflows, and real-time updates across procurement, production, and inventory systems.<\/p>\r\n        <\/div>\r\n    <\/div>\r\n\r\n<script>\r\n    function toggleAccordion() {\r\n        var acc = document.getElementsByClassName(\"header-faq\");\r\n        for (var i = 0; i < acc.length; i++) {\r\n            acc[i].addEventListener(\"click\", function() {\r\n                for (var j = 0; j < acc.length; j++) {\r\n                    if (acc[j] !== this && acc[j].classList.contains(\"active\")) {\r\n                        acc[j].classList.remove(\"active\");\r\n                        acc[j].closest('.accordion-wrapper').classList.remove('active');\r\n                        var panel = acc[j].nextElementSibling;\r\n                        panel.style.maxHeight = null;\r\n                    }\r\n                }\r\n\r\n                this.classList.toggle(\"active\");\r\n                var accordionWrapper = this.closest('.accordion-wrapper');\r\n                var panel = this.nextElementSibling;\r\n                if (this.classList.contains(\"active\")) {\r\n                    panel.style.maxHeight = panel.scrollHeight + \"px\";\r\n                    accordionWrapper.classList.add('active');\r\n                } else {\r\n                    panel.style.maxHeight = null;\r\n                    accordionWrapper.classList.remove('active');\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    document.addEventListener('DOMContentLoaded', toggleAccordion);\r\n<\/script>\r\n\r\n<!-- <script>\r\n    document.addEventListener('DOMContentLoaded', function() {\r\n        document.querySelectorAll('.header-faq .question').forEach(btn => {\r\n            const text = btn.textContent.trim();\r\n            const h3 = document.createElement('h3');\r\n            h3.textContent = text;\r\n            h3.className = \"faq-h3-addition\";\r\n            btn.textContent = '';\r\n            btn.appendChild(h3);\r\n        });\r\n    });\r\n<\/script> --><br \/>\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What software is used to manage a bill of materials?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Bill of materials is typically managed using ERP systems, Product Lifecycle Management (PLM) software, or manufacturing systems with integrated BOM modules. Common tools include SAP, Oracle NetSuite, and other cloud-based ERP platforms that support version control, inventory integration, and production planning.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the difference between a bill of materials and a parts list?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"A parts list is a flat inventory of components associated with a product. A BOM goes further by capturing the hierarchical relationship between parts, quantities, units of measure, revision levels, and structural assemblies.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Who is responsible for creating and maintaining a bill of materials?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Engineering typically creates the initial BOM from design specifications. Maintenance is a shared responsibility across procurement, production, and quality teams, with a formal change order process governing all updates.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the difference between an EBOM and an MBOM?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"An Engineering BOM reflects the product as designed, capturing components and specifications from the CAD or PLM system. A Manufacturing BOM translates that design into production instructions, accounting for assembly sequence, tooling, and process-specific requirements.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is a phantom BOM and when is it used?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"A phantom BOM represents a subassembly that exists in the structure for planning purposes but is never stocked or built as a standalone unit. It groups components logically within a complex assembly without triggering a separate work order.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do Australian manufacturers typically manage bill of materials changes?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Australian manufacturers typically manage BOM changes through a formal Engineering Change Order (ECO) process to ensure controlled updates and full traceability. These changes must comply with local documentation and audit requirements, especially in regulated industries such as defence and food manufacturing. ERP systems streamline this process by enabling version control, approval workflows, and real-time updates across procurement, production, and inventory systems.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A bill of materials (BOM) is a hierarchical document that lists every raw material, component, and subassembly required to manufacture a finished product. It serves as the definitive reference for production, procurement, and engineering teams. Without an accurate BOM, manufacturers cannot coordinate purchasing, schedule production, or calculate costs reliably. Errors lead to delays and extra [&hellip;]<\/p>\n","protected":false},"author":57,"featured_media":2530,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"tdm_status":"","tdm_grid_status":"","footnotes":""},"categories":[54],"tags":[245],"class_list":{"0":"post-2360","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-hrm","8":"tag-bill-of-materials"},"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.6 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Bill of Materials (BOM): Types, Structure, and Components<\/title>\n<meta name=\"description\" content=\"Explore what a bill of materials includes, from EBOM and MBOM to configurable BOMs, with structure and management steps for Australian manufacturers teams.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bill of Materials (BOM): Types, Structure, and Components\" \/>\n<meta property=\"og:description\" content=\"Explore what a bill of materials includes, from EBOM and MBOM to configurable BOMs, with structure and management steps for Australian manufacturers teams.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/\" \/>\n<meta property=\"og:site_name\" content=\"HashMicro Australia\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-15T09:47:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-02T07:07:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-62.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Alistair Keene\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alistair Keene\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/\"},\"author\":{\"name\":\"Alistair Keene\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#\\\/schema\\\/person\\\/65c81b4734e14e0e414d8abfeb71ef01\"},\"headline\":\"Bill of Materials (BOM): Types, Structure, and Components\",\"datePublished\":\"2026-04-15T09:47:05+00:00\",\"dateModified\":\"2026-06-02T07:07:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/\"},\"wordCount\":3458,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Untitled-design-62.webp\",\"keywords\":[\"bill of materials\"],\"articleSection\":[\"HRM\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/\",\"name\":\"Bill of Materials (BOM): Types, Structure, and Components\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Untitled-design-62.webp\",\"datePublished\":\"2026-04-15T09:47:05+00:00\",\"dateModified\":\"2026-06-02T07:07:54+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#\\\/schema\\\/person\\\/65c81b4734e14e0e414d8abfeb71ef01\"},\"description\":\"Explore what a bill of materials includes, from EBOM and MBOM to configurable BOMs, with structure and management steps for Australian manufacturers teams.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Untitled-design-62.webp\",\"contentUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Untitled-design-62.webp\",\"width\":800,\"height\":400,\"caption\":\"bill-of-materials-hashmicro\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/bill-of-materials\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bill of Materials (BOM): Types, Structure, and Components\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/\",\"name\":\"HashMicro Australia\",\"description\":\"Business Management Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#\\\/schema\\\/person\\\/65c81b4734e14e0e414d8abfeb71ef01\",\"name\":\"Alistair Keene\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-Alistair-Keene-96x96.webp\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-Alistair-Keene-96x96.webp\",\"contentUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-Alistair-Keene-96x96.webp\",\"caption\":\"Alistair Keene\"},\"description\":\"I build manufacturing content around realities, so teams can recognise where efficiency is lost and what systems need to control. The aim is practical: steadier schedules, fewer surprises on the floor, and production data leaders can actually trust.\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/author\\\/alistair-keene\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bill of Materials (BOM): Types, Structure, and Components","description":"Explore what a bill of materials includes, from EBOM and MBOM to configurable BOMs, with structure and management steps for Australian manufacturers teams.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/","og_locale":"en_US","og_type":"article","og_title":"Bill of Materials (BOM): Types, Structure, and Components","og_description":"Explore what a bill of materials includes, from EBOM and MBOM to configurable BOMs, with structure and management steps for Australian manufacturers teams.","og_url":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/","og_site_name":"HashMicro Australia","article_published_time":"2026-04-15T09:47:05+00:00","article_modified_time":"2026-06-02T07:07:54+00:00","og_image":[{"width":800,"height":400,"url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-62.webp","type":"image\/webp"}],"author":"Alistair Keene","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Alistair Keene","Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/#article","isPartOf":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/"},"author":{"name":"Alistair Keene","@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/65c81b4734e14e0e414d8abfeb71ef01"},"headline":"Bill of Materials (BOM): Types, Structure, and Components","datePublished":"2026-04-15T09:47:05+00:00","dateModified":"2026-06-02T07:07:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/"},"wordCount":3458,"commentCount":0,"image":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-62.webp","keywords":["bill of materials"],"articleSection":["HRM"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/","url":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/","name":"Bill of Materials (BOM): Types, Structure, and Components","isPartOf":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/#primaryimage"},"image":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-62.webp","datePublished":"2026-04-15T09:47:05+00:00","dateModified":"2026-06-02T07:07:54+00:00","author":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/65c81b4734e14e0e414d8abfeb71ef01"},"description":"Explore what a bill of materials includes, from EBOM and MBOM to configurable BOMs, with structure and management steps for Australian manufacturers teams.","breadcrumb":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/#primaryimage","url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-62.webp","contentUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/Untitled-design-62.webp","width":800,"height":400,"caption":"bill-of-materials-hashmicro"},{"@type":"BreadcrumbList","@id":"https:\/\/www.hashmicro.com\/au\/blog\/bill-of-materials\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.hashmicro.com\/au\/blog\/"},{"@type":"ListItem","position":2,"name":"Bill of Materials (BOM): Types, Structure, and Components"}]},{"@type":"WebSite","@id":"https:\/\/www.hashmicro.com\/au\/blog\/#website","url":"https:\/\/www.hashmicro.com\/au\/blog\/","name":"HashMicro Australia","description":"Business Management Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.hashmicro.com\/au\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/65c81b4734e14e0e414d8abfeb71ef01","name":"Alistair Keene","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Alistair-Keene-96x96.webp","url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Alistair-Keene-96x96.webp","contentUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Alistair-Keene-96x96.webp","caption":"Alistair Keene"},"description":"I build manufacturing content around realities, so teams can recognise where efficiency is lost and what systems need to control. The aim is practical: steadier schedules, fewer surprises on the floor, and production data leaders can actually trust.","url":"https:\/\/www.hashmicro.com\/au\/blog\/author\/alistair-keene\/"}]}},"_links":{"self":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/2360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/users\/57"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/comments?post=2360"}],"version-history":[{"count":7,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/2360\/revisions"}],"predecessor-version":[{"id":5008,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/2360\/revisions\/5008"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/media\/2530"}],"wp:attachment":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/media?parent=2360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/categories?post=2360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/tags?post=2360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}