{"id":4195,"date":"2026-06-18T19:16:11","date_gmt":"2026-06-18T09:16:11","guid":{"rendered":"https:\/\/www.hashmicro.com\/au\/blog\/?p=4195"},"modified":"2026-06-18T19:16:11","modified_gmt":"2026-06-18T09:16:11","slug":"what-is-ppv","status":"publish","type":"post","link":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/","title":{"rendered":"Purchase Price Variance (PPV): Meaning, Formula, and Causes"},"content":{"rendered":"<p data-start=\"0\" data-end=\"229\">Purchase costs can change quickly due to supplier pricing, market conditions, freight costs, and currency movements. These fluctuations often create differences between expected procurement budgets and actual purchasing expenses.<\/p>\n<p data-start=\"231\" data-end=\"486\">Purchase Price Variance (PPV) helps businesses measure the gap between standard costs and actual purchase prices during procurement activities. Finance and procurement teams use PPV to monitor cost control, supplier performance, and purchasing efficiency.<\/p>\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<p><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-ppv\">Understand how Purchase Price Variance (PPV)<\/a> measures the gap between standard procurement costs and actual purchase prices.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#how-to-calculate-ppv\">Master the PPV formula<\/a>, favourable and unfavourable variance classification, and practical procurement examples.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#main-causes-of-purchase-price-variance\">Discover how supplier pricing<\/a>, currency movements, commodity volatility, and purchasing behaviour affect procurement variance.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#how-ppv-affects-financial-reporting-and-procurement\">Learn how PPV affects procurement visibility<\/a>, standard costing, budgeting accuracy, and financial reporting workflows.<\/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>\r\n    <div class=\"adjustable-banner-wrap\">\r\n        <a href=\"https:\/\/www.hashmicro.com\/au\/erp-system?medium=moneysite-banner\" target=\"_blank\">\r\n            <img decoding=\"async\" loading=\"lazy\"\r\n                 src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/03\/erp_desktop_2.webp\"\r\n                 data-desktop-src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/03\/erp_desktop_2.webp\"\r\n                 data-mobile-src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/03\/erp_mobile_2.webp\"\r\n                 alt=\"ERP2\"\r\n                 class=\"responsive-image-banner\">\r\n\r\n            \r\n            <div class=\"adjustable-banner-overlay\" style=\"width: 45%\">\r\n                <p class=\"adjustable-banner-text\"><span class=\"adjustable-highlight\">Need an<\/span> expert to <span class=\"adjustable-highlight\">control procurement costs<\/span>?<\/p>\r\n                <div class=\"adjustable-banner-btn\">Consult Now<\/div>\r\n            <\/div>\r\n\r\n        <\/a>\r\n    <\/div>\r\n<script>\r\n    \/\/ check which image to use based on screensize\r\n    document.addEventListener(\"DOMContentLoaded\", function() {\r\n        function updateImageSource() {\r\n            var images = document.querySelectorAll('.responsive-image-banner');\r\n            var screenWidth = window.innerWidth;\r\n\r\n            images.forEach(function(img) {\r\n                var mobileSrc = img.getAttribute('data-mobile-src');\r\n                var desktopSrc = img.getAttribute('data-desktop-src');\r\n\r\n                if (screenWidth < 576 && mobileSrc) {\r\n                    img.setAttribute('src', mobileSrc);\r\n                } else {\r\n                    img.setAttribute('src', desktopSrc);\r\n                }\r\n            });\r\n        }\r\n\r\n        \/\/ Initial check\r\n        updateImageSource();\r\n\r\n        \/\/ Update on resize\r\n        window.addEventListener('resize', updateImageSource);\r\n    });\r\n<\/script><\/p>\n<h2 data-section-id=\"4kq9el\" data-start=\"493\" data-end=\"537\"><span role=\"text\"><strong data-start=\"495\" data-end=\"537\">What Is Purchase Price Variance (PPV)?<\/strong><\/span><\/h2>\n<p data-start=\"539\" data-end=\"720\">Purchase Price Variance (PPV) is a procurement and accounting metric used to measure the difference between the standard cost of an item and the actual price paid during purchasing.<\/p>\n<p data-start=\"155\" data-end=\"299\">Businesses use PPV to monitor procurement performance, supplier pricing changes, and purchasing cost fluctuations across operational categories.<\/p>\n<p data-start=\"301\" data-end=\"449\">A favourable PPV occurs when actual prices are lower than expected, while an unfavourable PPV happens when purchasing costs exceed standard pricing.<\/p>\n<h2 data-section-id=\"1e2emin\" data-start=\"1284\" data-end=\"1310\"><span role=\"text\"><strong data-start=\"1286\" data-end=\"1310\">How to Calculate PPV<\/strong><\/span><\/h2>\n<p data-start=\"1312\" data-end=\"1460\">PPV is calculated by comparing the standard purchase price against the actual price paid, then multiplying the difference by the purchased quantity.<\/p>\n<h3 data-section-id=\"1rh4j6p\" data-start=\"1462\" data-end=\"1491\">1. The PPV formula explained<\/h3>\n<p data-start=\"1493\" data-end=\"1602\">Purchase Price Variance uses a standard formula to measure the financial impact of procurement price changes.<\/p>\n<p data-start=\"1604\" data-end=\"1641\"><span class=\"inline-block align-middle\"><span class=\"katex\"><span class=\"katex-mathml\">PPV = (Standard Price \u2212 Actual Price) \u00d7 Actual QuantityPPV = (Standard \\ Price &#8211; Actual \\ Price) : times Actual : Quantity<\/span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"mord mathnormal\">PP<\/span><span class=\"mord mathnormal\">V <\/span><span class=\"mrel\">= <\/span><\/span><span class=\"base\"><span class=\"mopen\">(<\/span><span class=\"mord mathnormal\">St<\/span><span class=\"mord mathnormal\">an<\/span><span class=\"mord mathnormal\">d<\/span><span class=\"mord mathnormal\">a<\/span><span class=\"mord mathnormal\">r<\/span><span class=\"mord mathnormal\">d<\/span><span class=\"mspace\">\u00a0<\/span><span class=\"mord mathnormal\">P<\/span><span class=\"mord mathnormal\">r<\/span><span class=\"mord mathnormal\">i<\/span><span class=\"mord mathnormal\">ce \u2212<\/span><span class=\"mbin\">\u00a0<\/span><\/span><span class=\"base\"><span class=\"mord mathnormal\">A<\/span><span class=\"mord mathnormal\">c<\/span><span class=\"mord mathnormal\">t<\/span><span class=\"mord mathnormal\">u<\/span><span class=\"mord mathnormal\">a<\/span><span class=\"mord mathnormal\">l<\/span><span class=\"mspace\">\u00a0<\/span><span class=\"mord mathnormal\">P<\/span><span class=\"mord mathnormal\">r<\/span><span class=\"mord mathnormal\">i<\/span><span class=\"mord mathnormal\">ce<\/span><span class=\"mclose\">) <\/span><span class=\"mbin\">\u00d7 <\/span><\/span><span class=\"base\"><span class=\"mord mathnormal\">A<\/span><span class=\"mord mathnormal\">c<\/span><span class=\"mord mathnormal\">t<\/span><span class=\"mord mathnormal\">u<\/span><span class=\"mord mathnormal\">a<\/span><span class=\"mord mathnormal\">l<\/span><span class=\"mspace\">\u00a0<\/span><span class=\"mord mathnormal\">Q<\/span><span class=\"mord mathnormal\">u<\/span><span class=\"mord mathnormal\">an<\/span><span class=\"mord mathnormal\">t<\/span><span class=\"mord mathnormal\">i<\/span><span class=\"mord mathnormal\">t<\/span><span class=\"mord mathnormal\">y<\/span><\/span><\/span><\/span><\/span><\/p>\n<ul data-start=\"1643\" data-end=\"1920\">\n<li data-section-id=\"8jh63c\" data-start=\"1643\" data-end=\"1733\"><strong data-start=\"1645\" data-end=\"1669\">SP (Standard Price):<\/strong> The planned or budgeted unit cost set before purchasing begins.<\/li>\n<li data-section-id=\"qj9u28\" data-start=\"1734\" data-end=\"1819\"><strong data-start=\"1736\" data-end=\"1758\">AP (Actual Price):<\/strong> The real unit price paid to the supplier during procurement.<\/li>\n<li data-section-id=\"t1f1lr\" data-start=\"1820\" data-end=\"1920\"><strong data-start=\"1822\" data-end=\"1847\">AQ (Actual Quantity):<\/strong> The total quantity purchased during the transaction or reporting period.<\/li>\n<\/ul>\n<h3>2. Favourable vs unfavourable PPV<\/h3>\n<p>PPV results are generally classified as either favourable or unfavourable depending on whether the actual purchase price is lower or higher than the standard cost.<\/p>\n<div style=\"width: 100%; overflow-x: auto; margin: 20px 0;\">\n<table style=\"width: 100%; min-width: 700px; border-collapse: collapse;\">\n<tbody>\n<tr>\n<td style=\"background-color: #990000; color: #ffffff; padding: 10px;\"><strong>PPV type<\/strong><\/td>\n<td style=\"background-color: #990000; color: #ffffff; padding: 10px;\"><strong>Condition<\/strong><\/td>\n<td style=\"background-color: #990000; color: #ffffff; padding: 10px;\"><strong>Impact<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px;\"><strong>Favourable PPV<\/strong><\/td>\n<td style=\"padding: 10px;\">Actual price is lower than standard cost<\/td>\n<td style=\"padding: 10px;\">Reduces purchasing costs and improves margins<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px;\"><strong>Unfavourable PPV<\/strong><\/td>\n<td style=\"padding: 10px;\">Actual price is higher than standard cost<\/td>\n<td style=\"padding: 10px;\">Increases procurement costs and reduces margins<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3 data-section-id=\"160nivl\" data-start=\"3062\" data-end=\"3089\">3. PPV calculation example<\/h3>\n<ul>\n<li>A procurement team sets the standard cost of a component at AUD $15 per unit.<\/li>\n<li>The supplier later increases the actual purchase price to AUD $17 per unit.<\/li>\n<li>The business purchases 2,000 units during the reporting period.<\/li>\n<li>PPV = ($15 \u2212 $17) \u00d7 2,000 = -AUD $4,000, resulting in an unfavourable variance.<\/li>\n<\/ul>\n<h2 data-section-id=\"13y309h\" data-start=\"3410\" data-end=\"3454\"><span role=\"text\"><strong data-start=\"3412\" data-end=\"3454\">Main Causes of Purchase Price Variance<\/strong><\/span><\/h2>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-4572\" src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/Main-Causes-of-Purchase-Price-Variance-e1779161905801.webp\" alt=\"Main Causes of Purchase Price Variance\" width=\"980\" height=\"548\" srcset=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/Main-Causes-of-Purchase-Price-Variance-e1779161905801.webp 980w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/Main-Causes-of-Purchase-Price-Variance-e1779161905801-300x168.webp 300w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/Main-Causes-of-Purchase-Price-Variance-e1779161905801-768x429.webp 768w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/Main-Causes-of-Purchase-Price-Variance-e1779161905801-751x420.webp 751w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/Main-Causes-of-Purchase-Price-Variance-e1779161905801-150x84.webp 150w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/Main-Causes-of-Purchase-Price-Variance-e1779161905801-696x389.webp 696w\" sizes=\"(max-width: 980px) 100vw, 980px\" \/><\/p>\n<p data-start=\"3456\" data-end=\"3582\">Several internal and external factors can cause procurement prices to differ from standard costs during purchasing activities.<\/p>\n<h3 data-section-id=\"19a8lyd\" data-start=\"3584\" data-end=\"3635\">1. Supplier price changes and contract escalations<\/h3>\n<p data-start=\"3637\" data-end=\"3851\">Supplier pricing may increase due to inflation, freight costs, labour expenses, or raw material shortages. Contract escalation clauses can also adjust pricing automatically during volatile periods.<\/p>\n<h3 data-section-id=\"2qbkkq\" data-start=\"3858\" data-end=\"3892\">2. Supply and demand fluctuations<\/h3>\n<p data-start=\"3894\" data-end=\"4102\">Changes in global supply and demand can quickly affect procurement pricing across materials, commodities, and finished goods. Supply shortages commonly increase purchasing costs.<\/p>\n<h3 data-section-id=\"ky3yfc\" data-start=\"4109\" data-end=\"4145\">3. Currency exchange rate movements<\/h3>\n<p data-start=\"4147\" data-end=\"4349\">Businesses importing from overseas suppliers are highly exposed to currency volatility. A weaker Australian dollar can increase actual purchasing costs and create unfavourable PPV.<\/p>\n<div class=\"qMYqUG_convSearchResultHighlightRoot\">\n<div class=\"relative w-full overflow-visible\">\n<section class=\"text-token-text-primary w-full focus:outline-none has-data-writing-block:pointer-events-none [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto [content-visibility:auto] supports-[content-visibility:auto]:[contain-intrinsic-size:auto_100lvh] 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-69f8630b-18c4-8324-88ef-3bd8c221a018-6\" data-turn-id-container=\"request-69f8630b-18c4-8324-88ef-3bd8c221a018-6\" data-testid=\"conversation-turn-544\" 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=\"956069d7-8c5b-44b1-8d38-a5661c3c0f9a\" data-message-model-slug=\"gpt-5-5\" 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 wrap-break-word w-full dark markdown-new-styling\">\n<h3 data-section-id=\"1mawsyb\" data-start=\"4356\" data-end=\"4402\">4. Off-contract purchasing and maverick spend<\/h3>\n<p data-start=\"4404\" data-end=\"4593\">Purchasing outside approved supplier agreements often results in higher spot pricing than negotiated contract rates. This increases procurement costs and reduces purchasing control.<\/p>\n<h3 data-section-id=\"9obr2g\" data-start=\"4600\" data-end=\"4639\">5. Volume discounts and tiered pricing<\/h3>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"z-0 flex min-h-[46px] justify-start\">Suppliers often provide lower pricing for larger order volumes. Businesses purchasing below agreed thresholds may lose discounts and pay higher unit costs.<\/div>\n<div>\n<h2 data-start=\"2027\" data-end=\"2084\" data-section-id=\"m8fnrm\"><span role=\"text\"><strong data-start=\"2029\" data-end=\"2084\">How PPV Affects Financial Reporting and Procurement<\/strong><\/span><\/h2>\n<p data-start=\"2086\" data-end=\"2200\">PPV affects both procurement performance analysis and financial reporting visibility across purchasing operations.<\/p>\n<h3 data-start=\"2202\" data-end=\"2255\" data-section-id=\"shawsh\">1. PPV in standard costing and the general ledger<\/h3>\n<p data-start=\"2257\" data-end=\"2444\">Businesses using standard costing systems typically record PPV separately within the general ledger. This helps finance teams monitor procurement cost differences against planned budgets.<\/p>\n<h3 data-start=\"2451\" data-end=\"2505\" data-section-id=\"1ma2314\">2. How finance and procurement teams interpret PPV<\/h3>\n<p data-start=\"2507\" data-end=\"2679\">Procurement teams often view PPV as a supplier pricing and negotiation metric, while finance teams focus on margin impact, budgeting accuracy, and cost control performance.<\/p>\n<h3 data-start=\"2686\" data-end=\"2749\" data-section-id=\"1wuc2do\">3. Why favourable PPV does not always mean lower total cost<\/h3>\n<p data-start=\"2751\" data-end=\"2934\">Lower purchase prices do not always reduce total procurement costs. Cheaper suppliers may create higher freight costs, quality issues, delays, or operational inefficiencies elsewhere.<\/p>\n<h2 data-start=\"2941\" data-end=\"2971\" data-section-id=\"19a26b3\"><span role=\"text\"><strong data-start=\"2943\" data-end=\"2971\">PPV as a Procurement KPI<\/strong><\/span><\/h2>\n<p data-start=\"2973\" data-end=\"3080\">PPV is commonly used as a procurement KPI to measure purchasing performance and cost management efficiency.<\/p>\n<h3 data-start=\"3082\" data-end=\"3120\" data-section-id=\"pitmjn\">1. What PPV can and cannot measure<\/h3>\n<ul data-start=\"3122\" data-end=\"3280\">\n<li data-start=\"3122\" data-end=\"3183\" data-section-id=\"1qpmwss\">PPV measures purchase price changes against standard costs.<\/li>\n<li data-start=\"3184\" data-end=\"3280\" data-section-id=\"16mwhln\">PPV does not measure supplier quality, delivery reliability, or total operational cost impact.<\/li>\n<\/ul>\n<h3 data-start=\"3287\" data-end=\"3329\" data-section-id=\"ykze4r\">2. Complementary metrics alongside PPV<\/h3>\n<ul data-start=\"3331\" data-end=\"3539\">\n<li data-start=\"3331\" data-end=\"3388\" data-section-id=\"1w6skyo\">Supplier lead times help evaluate delivery consistency.<\/li>\n<li data-start=\"3389\" data-end=\"3466\" data-section-id=\"14rs26a\">Total cost of ownership (TCO) provides broader procurement cost visibility.<\/li>\n<li data-start=\"3467\" data-end=\"3539\" data-section-id=\"1p9lb2x\">Supplier defect rates help measure quality performance beyond pricing.<\/li>\n<\/ul>\n<h3 data-start=\"3546\" data-end=\"3585\" data-section-id=\"1460t91\">3. Common PPV reporting limitations<\/h3>\n<ul data-start=\"3587\" data-end=\"3789\">\n<li data-start=\"3587\" data-end=\"3648\" data-section-id=\"1lox9tl\">Standard costs may become outdated during volatile markets.<\/li>\n<li data-start=\"3649\" data-end=\"3718\" data-section-id=\"tfcnop\">Currency fluctuations can distort procurement performance analysis.<\/li>\n<li data-start=\"3719\" data-end=\"3789\" data-section-id=\"huc217\">Favourable PPV may hide quality or logistics-related cost increases.<\/li>\n<\/ul>\n<h2 data-start=\"3796\" data-end=\"3852\" data-section-id=\"1qq2rsf\"><span role=\"text\"><strong data-start=\"3798\" data-end=\"3852\">How Exchange Rates and Commodity Prices Affect PPV<\/strong><\/span><\/h2>\n<p data-start=\"3854\" data-end=\"3974\">External market conditions can significantly influence procurement pricing and purchasing variance across supply chains.<\/p>\n<div class=\"qMYqUG_convSearchResultHighlightRoot\">\n<div class=\"relative w-full overflow-visible\">\n<section class=\"text-token-text-primary w-full focus:outline-none has-data-writing-block:pointer-events-none [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto [content-visibility:auto] supports-[content-visibility:auto]:[contain-intrinsic-size:auto_100lvh] 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-69f8630b-18c4-8324-88ef-3bd8c221a018-7\" data-turn-id-container=\"request-69f8630b-18c4-8324-88ef-3bd8c221a018-7\" data-testid=\"conversation-turn-546\" 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=\"7bf3dbe4-c35b-4aac-adc8-57c4e0f363d6\" data-message-model-slug=\"gpt-5-5\" 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 wrap-break-word w-full dark markdown-new-styling\">\n<h3 data-start=\"3976\" data-end=\"4027\" data-section-id=\"9v8c5z\">1. Currency volatility for Australian importers<\/h3>\n<p>Australian importers are heavily exposed to AUD exchange rate movements when purchasing overseas goods. Tracking\u00a0<a href=\"https:\/\/www.hashmicro.com\/au\/blog\/landed-cost\/\">total import expenses<\/a>\u00a0helps businesses understand how exchange rates, freight, duties, and supplier pricing affect actual procurement costs.<\/p>\n<h3 data-start=\"4215\" data-end=\"4259\" data-section-id=\"tbmhvx\">2. Commodity-driven procurement variance<\/h3>\n<p>Procurement teams often view PPV as a supplier pricing and negotiation metric, while finance teams focus on margin impact, budgeting accuracy, cost control performance, and the accuracy of\u00a0<a href=\"https:\/\/www.hashmicro.com\/au\/blog\/vendor-invoice\/\">vendor payment documents<\/a>\u00a0used to verify purchase costs.<\/p>\n<h3 data-start=\"4430\" data-end=\"4468\" data-section-id=\"1982pbl\">3. Hedging and contract strategies<\/h3>\n<p data-start=\"4470\" data-end=\"4633\" data-is-last-node=\"\" data-is-only-node=\"\">Businesses often use hedging strategies, fixed-price agreements, or long-term supplier contracts to reduce exposure to pricing volatility and procurement variance.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"z-0 flex min-h-[46px] justify-start\">\n<h2 data-section-id=\"fidfrk\" data-start=\"0\" data-end=\"40\"><span role=\"text\"><strong data-start=\"2\" data-end=\"40\">PPV Across Industries in Australia<\/strong><\/span><\/h2>\n<p data-start=\"42\" data-end=\"155\">PPV affects industries differently depending on supplier exposure, commodity pricing, and procurement complexity.<\/p>\n<h3 data-section-id=\"t1lqhv\" data-start=\"157\" data-end=\"193\">1. Manufacturing and electronics<\/h3>\n<p data-start=\"195\" data-end=\"398\">Manufacturers and electronics businesses closely monitor PPV due to fluctuating raw material and component prices. Semiconductor shortages and freight costs can significantly affect procurement spending.<\/p>\n<p data-start=\"400\" data-end=\"538\">Many businesses also track PPV across suppliers, factories, and production categories to improve cost visibility and purchasing decisions.<\/p>\n<\/div>\n<div class=\"mt-3 w-full empty:hidden\">\n<div class=\"text-center\">\n<h3 data-section-id=\"3q8inf\" data-start=\"545\" data-end=\"583\">2. Construction and infrastructure<\/h3>\n<p data-start=\"585\" data-end=\"798\">Construction businesses face frequent PPV fluctuations from steel, concrete, fuel, timber, and subcontractor pricing changes. Large infrastructure projects are especially exposed to long-term commodity volatility.<\/p>\n<p data-start=\"800\" data-end=\"924\">Procurement teams often use supplier contracts and staged purchasing strategies to reduce exposure to sudden cost increases.<\/p>\n<h3 data-section-id=\"1shfukv\" data-start=\"931\" data-end=\"971\">3. Retail and wholesale distribution<\/h3>\n<p data-start=\"973\" data-end=\"1176\">Retailers and wholesalers experience PPV through inventory purchasing, import costs, supplier pricing changes, and seasonal demand fluctuations. Currency volatility also affects imported product margins.<\/p>\n<p data-start=\"1178\" data-end=\"1307\">Businesses commonly monitor PPV across product categories and supplier groups to improve pricing control and purchasing accuracy.<\/p>\n<h2 data-section-id=\"fws55\" data-start=\"1314\" data-end=\"1353\"><span role=\"text\"><strong data-start=\"1316\" data-end=\"1353\">Common Mistakes When Tracking PPV<\/strong><\/span><\/h2>\n<p data-start=\"1355\" data-end=\"1446\">Poor PPV analysis can create misleading procurement insights and inaccurate cost reporting.<\/p>\n<h3 data-section-id=\"9r0f36\" data-start=\"1448\" data-end=\"1495\">1. Updating standard costs too infrequently<\/h3>\n<p data-start=\"1497\" data-end=\"1676\">Outdated standard costs reduce PPV accuracy during volatile market conditions. Businesses should review pricing assumptions regularly to maintain realistic procurement benchmarks.<\/p>\n<h3 data-section-id=\"12y9iyn\" data-start=\"1683\" data-end=\"1742\">2. Treating all unfavourable PPV as procurement failure<\/h3>\n<p data-start=\"1744\" data-end=\"1913\">Unfavourable PPV is not always caused by poor supplier negotiations. Currency movements, commodity shortages, and freight disruptions can also increase purchasing costs.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<div class=\"contents\">\n<h3 data-section-id=\"1gazmdq\" data-start=\"1920\" data-end=\"1966\">3. Ignoring currency and market conditions<\/h3>\n<p data-start=\"1968\" data-end=\"2130\">External market conditions heavily influence procurement pricing across global supply chains. Ignoring these factors can distort procurement performance analysis.<\/p>\n<h3 data-section-id=\"zoajxf\" data-start=\"2137\" data-end=\"2197\">4. Focusing only on purchase price instead of total cost<\/h3>\n<p data-start=\"2199\" data-end=\"2397\">Lower supplier pricing may still create higher operational costs through delays, defects, freight expenses, or quality issues. Total cost visibility is equally important during procurement analysis.<\/p>\n<h2 data-section-id=\"1c145zm\" data-start=\"2404\" data-end=\"2461\"><span role=\"text\"><strong data-start=\"2406\" data-end=\"2461\">Best Practices for Managing Purchase Price Variance<\/strong><\/span><\/h2>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-4574\" src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/best-practices-managing-purchase-price-variance-e1779162096643.webp\" alt=\"best practices for managing purchase price variance\" width=\"1280\" height=\"565\" srcset=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/best-practices-managing-purchase-price-variance-e1779162096643.webp 1280w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/best-practices-managing-purchase-price-variance-e1779162096643-300x132.webp 300w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/best-practices-managing-purchase-price-variance-e1779162096643-1024x452.webp 1024w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/best-practices-managing-purchase-price-variance-e1779162096643-768x339.webp 768w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/best-practices-managing-purchase-price-variance-e1779162096643-952x420.webp 952w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/best-practices-managing-purchase-price-variance-e1779162096643-150x66.webp 150w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/best-practices-managing-purchase-price-variance-e1779162096643-696x307.webp 696w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/best-practices-managing-purchase-price-variance-e1779162096643-1068x471.webp 1068w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/p>\n<p data-start=\"2463\" data-end=\"2569\">Structured procurement controls help businesses manage PPV more consistently across purchasing operations.<\/p>\n<h3 data-section-id=\"1qskcxb\" data-start=\"2571\" data-end=\"2609\">1. Review standard costs regularly<\/h3>\n<p data-start=\"2611\" data-end=\"2787\">Businesses should update standard pricing regularly to reflect market conditions, supplier changes, and commodity trends. Accurate benchmarks improve PPV reporting reliability.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"pointer-events-none -mt-px h-px translate-y-[calc(var(--scroll-root-safe-area-inset-bottom)-14*var(--spacing))]\" aria-hidden=\"true\">\n<h3 data-section-id=\"cfqgbs\" data-start=\"2794\" data-end=\"2832\">2. Centralise purchasing workflows<\/h3>\n<p data-section-id=\"1gw5d1l\" data-start=\"3020\" data-end=\"3065\">Centralised purchasing reduces off-contract buying and improves supplier pricing consistency across departments. Stronger\u00a0<a href=\"https:\/\/www.hashmicro.com\/au\/blog\/procurement-management-system\/\">purchasing workflow visibility<\/a>\u00a0also helps teams monitor approvals, supplier selection, and spending control more effectively.3. Negotiate long-term supplier contracts<\/p>\n<p data-start=\"3067\" data-end=\"3250\">Long-term agreements can stabilise pricing and reduce exposure to sudden market fluctuations. Volume commitments may also improve discount opportunities and purchasing predictability.<\/p>\n<h3 data-section-id=\"13ny7xz\" data-start=\"3257\" data-end=\"3307\">4. Use ERP software for real-time PPV tracking<\/h3>\n<p data-start=\"3309\" data-end=\"3508\">ERP and procurement systems help businesses monitor supplier pricing, purchasing trends, and procurement variances in real time. Using\u00a0<a href=\"https:\/\/www.hashmicro.com\/au\/procurement-and-purchasing-management-system\">software for unifying procurement tracking<\/a>\u00a0also improves finance and procurement visibility across purchasing activities.<\/p>\n<p data-start=\"3309\" data-end=\"3508\"><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            Accurate PPV tracking helps businesses identify supplier pricing changes earlier, improve procurement visibility, and strengthen purchasing cost control.        <\/div>\r\n    <\/div>\r\n    <p class=\"quote-author-wrapper\">\r\n        <em>Luke Sheridan, Head of Finance Dept.<\/em>\r\n    <\/p>\r\n<\/div><\/p>\n<h2 data-section-id=\"4vksuf\" data-start=\"3515\" data-end=\"3556\"><span role=\"text\"><strong data-start=\"3517\" data-end=\"3556\">Modern Approaches to PPV Management<\/strong><\/span><\/h2>\n<p data-start=\"3558\" data-end=\"3683\">Many businesses now use digital procurement tools and predictive analysis to improve PPV visibility and purchasing decisions.<\/p>\n<h3 data-section-id=\"u5n6i8\" data-start=\"3685\" data-end=\"3731\">1. Predictive analytics and AI forecasting<\/h3>\n<p data-start=\"3733\" data-end=\"3911\">AI forecasting tools help businesses predict supplier pricing changes, commodity volatility, and procurement risks earlier. This improves purchasing planning and budget accuracy.<\/p>\n<h3 data-section-id=\"u0lwnq\" data-start=\"3918\" data-end=\"3946\">2. Should-cost modelling<\/h3>\n<p data-start=\"3948\" data-end=\"4135\">Should-cost models estimate the expected production cost of goods using material, labour, freight, and market data. Procurement teams use these models to strengthen supplier negotiations.<\/p>\n<h3 data-section-id=\"in3bqk\" data-start=\"4142\" data-end=\"4173\">3. Automated PPV dashboards<\/h3>\n<p data-start=\"4175\" data-end=\"4347\">Modern procurement platforms provide real-time PPV dashboards across suppliers, categories, and business units. With\u00a0<a href=\"https:\/\/www.hashmicro.com\/au\/blog\/procurement-software\/\">procurement cost automation<\/a>, businesses can reduce manual reconciliation work and identify cost variances faster.<\/p>\n<h3 data-section-id=\"1sebsyy\" data-start=\"4354\" data-end=\"4395\">4. Hedging and index-linked contracts<\/h3>\n<p data-start=\"4397\" data-end=\"4586\" data-is-last-node=\"\" data-is-only-node=\"\">Some businesses use hedging strategies or index-linked supplier agreements to reduce exposure to currency and commodity price volatility. This helps improve procurement cost predictability.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<\/div>\n<\/div>\n<h2><strong>Conclusion<\/strong><\/h2>\n<p data-start=\"567\" data-end=\"789\">Purchase Price Variance helps businesses measure how actual procurement costs differ from planned purchasing expectations. Strong PPV analysis also improves supplier visibility, budgeting accuracy, and procurement control.<\/p>\n<p data-start=\"791\" data-end=\"961\">As market volatility and supplier pricing pressures increase, many businesses use ERP and procurement systems to monitor PPV more accurately across purchasing operations.<\/p>\n<p data-start=\"963\" data-end=\"1124\">If you want to improve procurement visibility and purchasing cost control, you can request a <a href=\"https:\/\/www.hashmicro.com\/au\/free-product-tour\/\">free consultation<\/a> to explore suitable procurement and ERP solutions.<\/p>\n<a href=\"https:\/\/www.hashmicro.com\/au\/procurement-and-purchasing-management-system?medium=moneysite-banner\" target=\"_blank\"><img decoding=\"async\" loading=\"lazy\" width=\"712\" src=\"https:\/\/www.hashmicro.com\/blog\/wp-content\/uploads\/2025\/06\/Procurement.webp\" alt=\"Procurement\"><\/a>\n<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 is a good PPV percentage for procurement teams?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>There is no universal benchmark for a good PPV percentage because acceptable variance depends on industry conditions, commodity exposure, supplier contracts, and procurement strategy. Many businesses focus more on consistent variance control and trend monitoring over time.<\/p>\r\n        <\/div>\r\n    <\/div>\r\n    <div class=\"accordion-wrapper\">\r\n        <div class=\"header-faq\">\r\n            <button class=\"question\">Is a negative PPV always a good result?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>No. A negative or favourable PPV may reduce purchase prices, but it does not always lower total procurement cost. Lower-cost suppliers may still create quality issues, delays, freight increases, or operational inefficiencies.<\/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 often should standard costs be updated for PPV tracking?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>Businesses commonly review standard costs monthly or quarterly depending on procurement volatility, commodity exposure, and supplier pricing changes. Highly volatile industries may require more frequent 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\">How does AUD exchange rate movement affect PPV calculations?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>AUD exchange rate movements directly affect procurement costs for imported goods and overseas supplier contracts. A weaker Australian dollar generally increases purchasing costs and creates unfavourable PPV for importers.<\/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 PPV and cost avoidance?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>PPV measures the difference between standard and actual purchase prices, while cost avoidance refers to procurement actions that prevent future cost increases through negotiations, sourcing strategies, or operational improvements.<\/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> -->\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is a good PPV percentage for procurement teams?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"There is no universal benchmark for a good PPV percentage because acceptable variance depends on industry conditions, commodity exposure, supplier contracts, and procurement strategy. Many businesses focus more on consistent variance control and trend monitoring over time.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is a negative PPV always a good result?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"No. A negative or favourable PPV may reduce purchase prices, but it does not always lower total procurement cost. Lower-cost suppliers may still create quality issues, delays, freight increases, or operational inefficiencies.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How often should standard costs be updated for PPV tracking?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Businesses commonly review standard costs monthly or quarterly depending on procurement volatility, commodity exposure, and supplier pricing changes. Highly volatile industries may require more frequent updates.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How does AUD exchange rate movement affect PPV calculations?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"AUD exchange rate movements directly affect procurement costs for imported goods and overseas supplier contracts. A weaker Australian dollar generally increases purchasing costs and creates unfavourable PPV for importers.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the difference between PPV and cost avoidance?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"PPV measures the difference between standard and actual purchase prices, while cost avoidance refers to procurement actions that prevent future cost increases through negotiations, sourcing strategies, or operational improvements.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Purchase costs can change quickly due to supplier pricing, market conditions, freight costs, and currency movements. These fluctuations often create differences between expected procurement budgets and actual purchasing expenses. Purchase Price Variance (PPV) helps businesses measure the gap between standard costs and actual purchase prices during procurement activities. Finance and procurement teams use PPV to [&hellip;]<\/p>\n","protected":false},"author":58,"featured_media":4573,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"tdm_status":"","tdm_grid_status":"","footnotes":""},"categories":[65],"tags":[],"class_list":{"0":"post-4195","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-procurement"},"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>Purchase Price Variance (PPV): Meaning, Formula, and Causes<\/title>\n<meta name=\"description\" content=\"Learn how PPV works, what causes procurement variance, and how businesses manage purchasing costs more effectively.\" \/>\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\/what-is-ppv\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Purchase Price Variance (PPV): Meaning, Formula, and Causes\" \/>\n<meta property=\"og:description\" content=\"Learn how PPV works, what causes procurement variance, and how businesses manage purchasing costs more effectively.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/\" \/>\n<meta property=\"og:site_name\" content=\"HashMicro Australia\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-18T09:16:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/purchase-price-variance-hashmicro-e1779161926853.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"970\" \/>\n\t<meta property=\"og:image:height\" content=\"548\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Jasper Colefax\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jasper Colefax\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 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\\\/what-is-ppv\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/\"},\"author\":{\"name\":\"Jasper Colefax\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#\\\/schema\\\/person\\\/5e36c3e21c6cb33505689d9822fabb49\"},\"headline\":\"Purchase Price Variance (PPV): Meaning, Formula, and Causes\",\"datePublished\":\"2026-06-18T09:16:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/\"},\"wordCount\":1889,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/purchase-price-variance-hashmicro-e1779161926853.webp\",\"articleSection\":[\"Procurement\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/\",\"name\":\"Purchase Price Variance (PPV): Meaning, Formula, and Causes\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/purchase-price-variance-hashmicro-e1779161926853.webp\",\"datePublished\":\"2026-06-18T09:16:11+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#\\\/schema\\\/person\\\/5e36c3e21c6cb33505689d9822fabb49\"},\"description\":\"Learn how PPV works, what causes procurement variance, and how businesses manage purchasing costs more effectively.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/purchase-price-variance-hashmicro-e1779161926853.webp\",\"contentUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/purchase-price-variance-hashmicro-e1779161926853.webp\",\"width\":970,\"height\":548,\"caption\":\"purchase price variance\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/what-is-ppv\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Purchase Price Variance (PPV): Meaning, Formula, and Causes\"}]},{\"@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\\\/5e36c3e21c6cb33505689d9822fabb49\",\"name\":\"Jasper Colefax\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-Jasper-Colefax-96x96.webp\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-Jasper-Colefax-96x96.webp\",\"contentUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-Jasper-Colefax-96x96.webp\",\"caption\":\"Jasper Colefax\"},\"description\":\"I\u2019m a full-time business systems analyst and a part-time writer focused on procurement and supply chain management. In my day-to-day work, I help teams map purchasing workflows, clarify approval rules, and connect supplier and inventory data so decisions don\u2019t rely on guesswork.\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/author\\\/jasper-colefax\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Purchase Price Variance (PPV): Meaning, Formula, and Causes","description":"Learn how PPV works, what causes procurement variance, and how businesses manage purchasing costs more effectively.","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\/what-is-ppv\/","og_locale":"en_US","og_type":"article","og_title":"Purchase Price Variance (PPV): Meaning, Formula, and Causes","og_description":"Learn how PPV works, what causes procurement variance, and how businesses manage purchasing costs more effectively.","og_url":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/","og_site_name":"HashMicro Australia","article_published_time":"2026-06-18T09:16:11+00:00","og_image":[{"width":970,"height":548,"url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/purchase-price-variance-hashmicro-e1779161926853.webp","type":"image\/webp"}],"author":"Jasper Colefax","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jasper Colefax","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/#article","isPartOf":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/"},"author":{"name":"Jasper Colefax","@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/5e36c3e21c6cb33505689d9822fabb49"},"headline":"Purchase Price Variance (PPV): Meaning, Formula, and Causes","datePublished":"2026-06-18T09:16:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/"},"wordCount":1889,"commentCount":0,"image":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/purchase-price-variance-hashmicro-e1779161926853.webp","articleSection":["Procurement"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/","url":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/","name":"Purchase Price Variance (PPV): Meaning, Formula, and Causes","isPartOf":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/#primaryimage"},"image":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/purchase-price-variance-hashmicro-e1779161926853.webp","datePublished":"2026-06-18T09:16:11+00:00","author":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/5e36c3e21c6cb33505689d9822fabb49"},"description":"Learn how PPV works, what causes procurement variance, and how businesses manage purchasing costs more effectively.","breadcrumb":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/#primaryimage","url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/purchase-price-variance-hashmicro-e1779161926853.webp","contentUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/05\/purchase-price-variance-hashmicro-e1779161926853.webp","width":970,"height":548,"caption":"purchase price variance"},{"@type":"BreadcrumbList","@id":"https:\/\/www.hashmicro.com\/au\/blog\/what-is-ppv\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.hashmicro.com\/au\/blog\/"},{"@type":"ListItem","position":2,"name":"Purchase Price Variance (PPV): Meaning, Formula, and Causes"}]},{"@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\/5e36c3e21c6cb33505689d9822fabb49","name":"Jasper Colefax","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Jasper-Colefax-96x96.webp","url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Jasper-Colefax-96x96.webp","contentUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Jasper-Colefax-96x96.webp","caption":"Jasper Colefax"},"description":"I\u2019m a full-time business systems analyst and a part-time writer focused on procurement and supply chain management. In my day-to-day work, I help teams map purchasing workflows, clarify approval rules, and connect supplier and inventory data so decisions don\u2019t rely on guesswork.","url":"https:\/\/www.hashmicro.com\/au\/blog\/author\/jasper-colefax\/"}]}},"_links":{"self":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/4195","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\/58"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/comments?post=4195"}],"version-history":[{"count":4,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/4195\/revisions"}],"predecessor-version":[{"id":4910,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/4195\/revisions\/4910"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/media\/4573"}],"wp:attachment":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/media?parent=4195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/categories?post=4195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/tags?post=4195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}