{"id":2967,"date":"2026-04-21T17:02:40","date_gmt":"2026-04-21T07:02:40","guid":{"rendered":"https:\/\/www.hashmicro.com\/au\/blog\/?p=2967"},"modified":"2026-04-21T17:02:40","modified_gmt":"2026-04-21T07:02:40","slug":"single-touch-payroll","status":"publish","type":"post","link":"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/","title":{"rendered":"Single Touch Payroll Australia: How Companies Stay Compliant"},"content":{"rendered":"<p>Single Touch Payroll (STP) is the mandatory reporting framework that requires Australian employers to transmit wages, PAYG withholding, and superannuation data to the ATO through Standard Business Reporting-enabled payroll software.<\/p>\n<p>STP works by embedding statutory reporting inside the payroll process. Therefore, each pay run automatically generates a pay event file containing year-to-date figures, which the software submits to the ATO via the SBR gateway.<\/p>\n<p>This guide covers the definition of payroll, why Australian businesses need it, the best practices, and everything you need to know for your business to fully comply.<\/p>\n<style>\r\n\t.takeaways-container {\r\n\t\tmargin: 20px 0;\r\n\t\tfont-family: sans-serif;\r\n\t}\r\n\t.box-content {\r\n\t\tbackground-color: #fffacd;\r\n\t\tbox-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\r\n\t\tborder-radius: 25px;\r\n\t\tpadding: 25px;\r\n\t}\r\n\t.title {\r\n\t\tmargin-bottom: 20px;\r\n\t}\r\n\t.title p {\r\n\t\tdisplay: inline-block;\r\n\t\tbackground-color: #8A0E19;\r\n\t\tcolor: #ffffff;\r\n\t\tpadding: 8px 15px;\r\n\t\tborder-radius: 8px;\r\n\t\tfont-size: 22px;\r\n\t\tfont-weight: bold;\r\n\t\tmargin: 0;\r\n\t}\r\n\t.item {\r\n\t\tdisplay: flex;\r\n\t\talign-items: flex-start;\r\n\t\tmargin-bottom: 12px;\r\n\t}\r\n\t.item .circle {\r\n\t\twidth: 8px;\r\n\t\theight: 8px;\r\n\t\tbackground-color: #000000;\r\n\t\tborder-radius: 50%;\r\n\t\tmargin-right: 12px;\r\n\t\tflex-shrink: 0;\r\n\t\tmargin-top: 8px;\r\n\t}\r\n\t.item p {\r\n\t\tmargin: 0;\r\n\t\tfont-size: 16px;\r\n\t\tline-height: 1.6;\r\n\t}\r\n\t.item p a {\r\n\t\tcolor: #8A0E19;\r\n\t\tfont-weight: normal;\r\n\t\ttext-decoration: none;\r\n\t}\r\n\t.item p a:hover {\r\n\t\ttext-decoration: underline;\r\n\t}\r\n\t.button-wrapper {\r\n\t\tmargin-top: 25px;\r\n\t}\r\n\t.submit-button {\r\n\t\tbackground-color: #8a0e19;\r\n\t\tcolor: #fff !important;\r\n\t\ttransition: all .3s ease;\r\n\t\tpadding: 12px 28px;\r\n\t\tdisplay: inline-block;\r\n\t\tborder-radius: 12px;\r\n\t\tfont-size: 16px;\r\n\t\tfont-weight: bold;\r\n\t\ttext-decoration: none;\r\n\t}\r\n\t.submit-button:hover {\r\n\t\tbackground-color: #991b26;\r\n\t}\r\n\t@media (max-width: 767px) {\r\n\t\t.takeaways-container {\r\n\t\t\theight: auto;\r\n\t\t\tpadding: 0;\r\n\t\t}\r\n\t\t.box-content {\r\n\t\t\tpadding: 24px;\r\n\t\t}\r\n\t\t.content,\r\n\t\t.main-content,\r\n\t\t.list-item {\r\n\t\t\twidth: 100%;\r\n\t\t}\r\n\t}\r\n<\/style>\r\n\r\n<div class=\"takeaways-container\">\r\n\t<div class=\"box-content\">\r\n\t\t<div class=\"content\">\r\n\t\t\t<div class=\"title\">\r\n\t\t\t\t<p>Key Takeaways<\/p>\r\n\t\t\t<\/div>\r\n\t\t\t<div class=\"main-content\">\r\n\t\t\t\t<div class=\"list-item\">\r\n\t\t\t\t\t<div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#what-is-single-touch-payroll-stp\">STP is<\/a> A real-time ATO reporting framework that sends wages, PAYG withholding, and superannuation data from payroll software to the ATO.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#how-to-set-up-and-register-for-stp\">Implementing STP involves:<\/a> Choose ATO-certified payroll software, link it through Access Manager, configure employee master data, then run a test pay event.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#stp-compliance-checklist-for-2026\">2026 Compliance Checklist<\/a>: Verify software version, audit employee records, confirm pay item mapping, resolve ATO warnings, and diarise the 14 July finalisation deadline.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p><a href=\"#best-practices-for-managing-stp-in-your-business\">Best Practices<\/a> includes keeping records accurate, lodge on or before each pay day, automate submissions through payroll or ERP software, and review EOFY finalisation early.<\/p><\/div>\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t<\/div>\r\n<\/div>\n<!-- <div id=\"toc_group_article\" style=''>\r\n\t<p style='font-size:25px;font-weight:bold; margin-bottom:0px'>\r\n\t\tTable of Content:\r\n\t<\/p>\r\n\t<ul id=\"list_toc\" class='list_toc'><\/ul>\r\n<\/div> -->\r\n\r\n<!-- <div class=\"dropdown-fixed-top\" id=\"dropdown-fixed-top\">\r\n\t<div class=\"row\">\r\n\t\t<p id=\"pilihDaftarIsi\">Table of Content<\/p>\r\n\t\t<p><i class=\"td-icon-menu-down\"><\/i><\/p>\r\n\t<\/div>\r\n\t\r\n\t<div>\r\n\t\t<ul id=\"list_toc_top\" class='list_toc'><\/ul>\r\n\t<\/div>\r\n<\/div> -->\r\n\r\n<div id=\"placeholder-toc\"><\/div>\r\n<div id=\"toc\">\r\n    <div class=\"header\">\r\n\t<span class=\"toc-title\" id=\"toc-title\">Table of Content<\/span>\t\r\n\t <i class=\"toc-icon\">\r\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"30\" height=\"30\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#000\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"header-icon\">\r\n          <path d=\"m6 9 6 6 6-6\" \/>\r\n        <\/svg>\r\n      <\/i>\r\n\t<\/div>\r\n    <div class=\"list\">\r\n      <ul id=\"toc-list\"><\/ul>\r\n    <\/div>\r\n <\/div>\r\n\r\n<style>\r\n\t@media (max-width: 992px) {\r\n\t\t#toc_group_article {\r\n\t\t\tpadding-top: 24px;\r\n\t\t}\r\n\t}\r\n\t\r\n\t#list_toc_float {\r\n\t\tmax-height: calc(100vh - 250px);\r\n\t\toverflow-y: auto;\r\n\t}\r\n\t\r\n\t#list_toc_top {\r\n\t\tdisplay: none;\r\n\t\tbackground: #fff;\r\n\t\tmargin-bottom: 4px;\r\n\t}\r\n\t\r\n\t#list_toc_top li {\r\n\t\tdisplay: block;\r\n\t\tmargin-left: 0;\r\n\t\tlist-style: none;\r\n\t}\r\n\t\r\n\t#list_toc_top a {\r\n\t\tpadding: 5px;\r\n\t\tdisplay: block;\r\n\t}\r\n\t\r\n\t#list_toc_top.show {\r\n\t\tdisplay: block;\r\n\t}\r\n\r\n\t#list_toc_top a {\r\n\t\tcolor: #434343;\r\n\t\tborder-bottom: 1px solid #bbb;\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top {\r\n\t\tposition: fixed;\r\n\t\ttop: 59px;\r\n\t\twidth: 100%;\r\n\t\tz-index: 99;\r\n\t\tborder-bottom: 2px solid #9c171e;\r\n\t\tpadding: 12px;\r\n\t\tbackground: #fff;\r\n\t\twidth: 100%;\r\n\t\tcursor: pointer;\r\n\t\tdisplay: none;\r\n\t\tleft: 0;\r\n\t\tbox-shadow: 0 -2px 7px 6px rgba(0, 0, 0, 0.17);\r\n\t}\r\n\t\r\n\t#dropdown-fixed-top.show {\r\n\t\tanimation: showAnim 0.5s ease;\r\n\t\tdisplay: block;\r\n\t\topacity: 1;\r\n\t}\r\n\t\r\n\t@keyframes showAnim {\r\n\t\tfrom {\r\n\t\t\tdisplay: none;\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t\tto {\r\n\t\t\tdisplay: block;\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top #list_toc_top {\r\n\t\tmax-height: calc(50vh - 110px);\r\n\t\toverflow-y: scroll;\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top .row {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top .row p {\r\n\t\tmargin-bottom: 0;\r\n\t}\r\n\t\r\n\t#pilihDaftarIsi {\r\n\t\tmax-width: 100%;\r\n\t\toverflow: hidden;\r\n\t\twhite-space: nowrap;\r\n\t}\r\n\t\r\n\t@media (min-width: 1018px) {\r\n\t\t.dropdown-fixed-top {\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\t\r\n\t#list_toc li {margin-bottom: 0;margin-top: 5px;}\r\n\t#list_toc > li > ul {padding-left: 20px;margin-bottom: 0;}\r\n\t#list_toc{height:max-content;transition:ease-in-out}\r\n\t#list_toc li {margin-bottom: 0;margin-top: 5px;}\r\n\t#list_toc_float li.active > a {color:#b1252d;background: #ffe1e3;}\r\n\t#list_toc_top li.active > a {color:#b1252d;background: #ffe1e3;}\r\n\t#list_toc_float li a {padding:3px 7px}\r\n\t#list_toc_float li a {\r\n\t\tdisplay: block;\r\n\t\tcolor: #000;\r\n\t\tmargin-bottom: 6px;\r\n\t\tpadding-top: 2px;\r\n\t\tpadding-bottom: 2px;\r\n\t\ttransition: all 0.2s ease-in-out;\r\n\t\tfont-size: 15px;\r\n\t\tline-height: 18px;\r\n\t}\r\n\t#list_toc_float li{list-style:none;list-style-position:inside; margin-left:0;}\r\n\t#list_toc_float a:hover{color:#b1252d;}\r\n\t\r\n\t#toc_group_float{\r\n\t\tline-height: 24px;\r\n\t\tmax-height: calc(100vh - 100px);\r\n\t\toverflow: auto;\r\n\t\tz-index: 99;\r\n\t\tdisplay:none!important;\r\n\t\tbackground:#fff;\r\n\t\ttransition:all 0.5s linear\r\n\t}\r\n\t\r\n\t@media (min-width:1019px){\r\n\t\t#toc_group_float {\r\n\t\t\tdisplay:block!important;\r\n\t\t\t}\r\n\t\t\t\t#toc_group_article {\r\n\t\t\tdisplay:none;\r\n\t\t}\r\n\t}\r\n\r\n<\/style>\r\n\r\n<!-- ToC styling  -->\r\n<style>\r\n\t\/* Simple styling for the TOC *\/\r\n\t\r\n\t#toc ul li:last-child {\r\n    padding-bottom: 16px; \/* Adjust the value as needed *\/\r\n}\r\n\r\n.td-fix-index {\r\n\t transform: unset !important;\r\n     -webkit-transform: unset !important; \r\n}\r\n.footer-contact .td-fix-index {\r\n\t transform: translateZ(0) !important;\r\n     -webkit-transform: translateZ(0) !important; \r\n}\r\n\t.tdb_single_content .tdb-block-inner.td-fix-index{\r\n\t\tposition: static;\r\n\t}\r\n\t\r\n\r\n\t\r\n#toc {\r\n  background-color: #FFF;\r\n\tpadding: 17px 24px 0px 24px !important;\r\n  margin-bottom: 20px;\r\n\/*   border: 1px solid #9C171E; *\/\r\n  border-radius: 6px;\r\n\tdisplay: none;\r\n  max-width: 100%;\r\n  transition: .4s ease height;\r\n\tmargin-left: 0;\r\n\toverflow: hidden;\r\n}\r\n\r\n#toc .header{\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n\tbackground-color: transparent;\r\n}\r\n\t\r\n\t#toc.sticky .header{\r\n\t\tpadding: 4px 0;\r\n\t}\r\n\t\r\n.header p{\r\n  font-size: 18px !important;\r\n  font-weight: 600 !important;\r\n  color: #393939;\r\n   margin-bottom: 0;\r\n  \/* margin-top: 20px; *\/\r\n}\r\n\r\n.toc-icon{\r\n  float: right;\r\n\/*   visibility: hidden; *\/\r\n}\r\n\r\n\t.toc-title{\r\n\t\tmargin-right: auto;\r\n\/* \t\tpadding-left: 20px; *\/\r\n\t\tfont-weight: 600;\r\n\t\talign-self: center;\t}\t\r\n\r\n#toc ul {\r\n  list-style-type: none;\r\n  padding-left: 0;\r\n}\r\n\t\r\n#toc.sticky ul{\r\n\toverflow-y: auto;\r\n\tmax-height: 250px;\r\n\tmargin-top: 0px;\r\n\tpadding-top: 20px;\r\n\/* \tborder-top: 1px solid #d3d3d3; *\/\r\n}\r\n\t\r\n#toc ul li {\r\n\/*   margin-bottom: 10px; *\/\r\n  margin-bottom: 10px;\r\n\tmargin-left: 0;\r\n\ttransition: .2s ease;\r\n\tcursor: pointer;\r\n}\r\n\t\r\n\t#toc.sticky ul li {\r\n\t  margin-right: 10px;\r\n\t}\r\n\t\r\n.td-post-content #toc-list li a:hover, .td-post-content #toc-list a.active{\r\n\tbackground-color: #FFF;\r\n\/* \tpadding: 8px 16px 8px 16px; *\/\r\n\tpadding: 4px 16px 4px 16px;\r\n\tborder-radius: 6px;\r\n\tcolor: #9c171e !important;\r\n\tfont-weight: 600 !important;\r\n}\r\n\t\r\n\t.td-post-content #toc-list li:hover a, .td-post-content #toc-list a.active{\r\n\t\tcolor: #9C171E !important;\r\n\t\tfont-weight: 600 !important;\r\n\t}\r\n\t\r\n.td-post-content #toc-list a.active{\r\n\tfont-weight: bold !important;\r\n\tcolor: #9C171E !important;\r\n}\r\n\t\r\n#toc a, .td-post-content #toc-list a {\r\n  text-decoration: none;\r\n  color: #ea1717 !important;\r\n  transition: .2s ease;\r\n\tfont-weight: 400 !important;\r\n\tdisplay: block;\r\n\t\r\n\tpadding: 4px 16px 4px 0;\r\n}\r\n\r\n#toc.sticky {\r\n  position: fixed;\r\n\/*   top: 73px; *\/\r\n\tbottom: 0;\r\n  z-index: 100; \r\n  box-shadow: 0 2px 5px rgba(0,0,0,0.1); \r\n\twidth: 100%; \r\n\tbackground-color: #FFF;\r\n\/* \tbackground-color: #FFF1F1; *\/\r\n\tborder-bottom: 1px solid #ea1717;\r\n\/*   border: 1px solid #393939; *\/\r\n  box-shadow: 0px 0px 14px 0px #00000040;\r\n  cursor: pointer;\r\n\tanimation: fadein .3s ease;\r\n\tpadding: 12px 16px !important;\r\n}\r\n\t\r\n\t.fadein{\r\n\t\tanimation: fadein .3s ease;\r\n\t}\r\n\t\r\n\t.fadeout{\r\n\t\tanimation: fadeout .3s ease;\r\n\t}\r\n\t\r\n\t\r\n\t@keyframes fadein{\r\n\t\t0% {\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t\t100%{\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t}\r\n\t\r\n\t@keyframes fadeout{\r\n\t\t0% {\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t\t100%{\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n#toc.sticky .header p{\r\n\tmargin-bottom: 10px;\r\n\tmargin-top: 10px;\r\n}\r\n\r\n#toc.sticky .toc-icon{\r\n  visibility: visible;\r\n\/* \ttransition: 0.4s ease; *\/\r\n}\r\n\t\r\n\t.toc-icon{\r\n\t\talign-items: center;\r\n    \tdisplay: flex;\r\n\t}\r\n\t\r\n\tsvg.header-icon{\r\n\/* \t\tbackground-color: #9c171e; *\/\r\n\t\tbackground-color: #FFF;\r\n\t\tborder-radius: 30px;\r\n\t\tpadding: 5px;\r\n\t}\r\n\r\n#toc.sticky .list{\r\n\/*   max-height: 0; *\/\r\n  transition: height 0.4s ease;\r\n}\r\n\t\r\n\t#toc .list{\r\n\/*   max-height: 0; *\/\r\n  transition: height 0.4s ease;\r\n}\r\n\r\n#toc .header.active .toc-icon{\r\n\ttransform: rotate(0deg); \r\n\topacity: 1;\r\n}\r\n\r\n\t#toc .header.active + .list {\r\n\t  max-height: 200px; \/* Adjust this value as needed *\/\r\n\t  opacity: 1;\r\n\t}\r\n\t\r\n\t#placeholder-toc{\r\n\/* \t\tdisplay: none; *\/\r\n\t}\r\n\t\r\n\t@media (min-width: 768px) and (max-width: 991px){\r\n\t\t#toc.sticky{\r\n\/* \t\t\ttop: 104px; *\/\r\n\t\t\tbottom: 0px;\r\n\t\t}\r\n\t\t\r\n\t\t#toc{\r\n\t\t\twidth: unset !important;\r\n\t\t}\r\n\t}\r\n\t\r\n\t@media (max-width: 767px){\r\n\t\t#toc{\r\n\t\t\twidth: 100% !important;\r\n\t\t\tdisplay: inline-block;\r\n\t\t}\r\n\t\t\r\n\t\t#toc.sticky{\r\n\t\t\twidth: 90% !important;\r\n\/* \t\t\ttop: 81px; *\/\r\n\t\t\tbottom: 60px;\r\n\t\t\tmargin-left: auto;\r\n\t\t\tmargin-right: auto;\r\n\t\t\tpadding: 0 16px;\r\n\t\t\tright: 5%;\r\n\t\t}\r\n\t}\r\n\t\r\n\t<\/style>\r\n\r\n<!-- ToC List for mobile -->\r\n<script>\r\n \/\/ Generate TOC based on headings\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  \/\/ Get the element that will contain the TOC\r\n  const tocList = document.getElementById('toc-list');\r\n\r\n  \/\/ Get the element with the ID 'article-left'\r\n  const article = document.querySelector('.td-post-content');\r\n\r\n  \/\/ Find all h2 elements within 'myarticle'\r\n  const headers = article.getElementsByTagName('h2');\r\n\r\n  \/\/ Loop through the h2 elements and create a list item for each one\r\n  for (let i = 0; i < headers.length; i++) {\r\n    const header = headers[i];\r\n    const headerText = header.textContent;\r\n\/\/     const headerId = 'header-' + i;\r\n    const headerId = headerText\r\n    .toLowerCase()\r\n    .trim()\r\n    .replace(\/[^\\w\\s-]\/g, '')  \/\/ hapus tanda baca\r\n    .replace(\/\\s+\/g, '-'); \/\/ ganti spasi jadi \"-\"\r\n\r\n    \/\/ Set an ID for the header if it doesn't have one\r\n    header.setAttribute('id', headerId);\r\n\r\n    \/\/ Create a list item for the TOC\r\n    const listItem = document.createElement('li');\r\n\r\n    \/\/ Create a link for the list item\r\n    const link = document.createElement('a');\r\n    link.setAttribute('href', '#' + headerId);\r\n    link.textContent = headerText;\r\n\r\n    \/\/ Append the link to the list item\r\n    listItem.appendChild(link);\r\n\r\n    \/\/ Append the list item to the TOC list\r\n    tocList.appendChild(listItem);\r\n  }\r\n});\r\n\r\n\/\/ Keep height and placement of content using placeholder in place of TOC\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  const toc = document.querySelector('#toc');\r\n  const placeholderToc = document.querySelector('#placeholder-toc');\r\n\r\n  function setPlaceholderHeight() {\r\n    placeholderToc.style.height = `${toc.offsetHeight}px`;\r\n  }\r\n\r\n  \/\/ Set the initial height of the placeholder\r\n  setPlaceholderHeight();\r\n\r\n  \/\/ Update the height on window resize\r\n  window.addEventListener('resize', setPlaceholderHeight);\r\n});\r\n  const tocTitle = document.querySelector('#toc-title'); \/\/ Assuming header-faq is the element for TOC title\r\n\r\n\/\/ Sticky TOC and update heading\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  const toc = document.querySelector('#toc');\r\n  const footer = document.querySelector('.td-footer-template-wrap');\r\n  const tocParent = toc.parentElement;\r\n  const divTop = tocParent.getBoundingClientRect().top + window.pageYOffset;\r\n  const tocHeight = toc.offsetHeight;\r\n  const triggerPoint = divTop + tocHeight + 700;\r\n  const footerHeight = footer.offsetHeight;\r\n  const triggerFooterPoint = footer.getBoundingClientRect().top + window.pageYOffset - footerHeight - footerHeight - footerHeight;\r\n  const phtoc = document.querySelector('#placeholder-toc');\r\n  const headers = document.querySelectorAll('.td-post-content h2');\r\n  const navLinks = document.querySelectorAll('#toc-list a');\r\n\t\r\n\tconst panel2 = document.querySelector(\"#toc .list\");\r\n\tvar icon = document.querySelector(\".toc-icon\");\r\n\r\n  let activeLink = null; \/\/ Declare activeLink outside the loop\r\n\t\r\n  \/\/ Function to handle scroll and add\/remove .sticky class\r\n  function handleScroll() {\r\n    const windowTop = window.pageYOffset || document.documentElement.scrollTop;\r\n    let currentHeader = '';\r\n\r\n    \/\/ Highlight user progress as the heading comes\r\n    headers.forEach(header => {\r\n\t\tconst headerTop = header.offsetTop;\r\n\t\tconst headerHeight = header.clientHeight;\r\n\t\tif (window.scrollY >= (headerTop - headerHeight + 700)) {\r\n\t\t\tconst currentHeaderId = header.getAttribute('id');\r\n\t\t\tconst currentHeaderText = document.getElementById(currentHeaderId).textContent;\r\n\/\/ \t\t\tconsole.log(\"current header text:\", currentHeaderText);\r\n\t\t\ttocTitle.textContent = currentHeaderText;\r\n\t\t\tcurrentHeader = currentHeaderId;\r\n\t\t\t\r\n\t\t\tif(window.innerWidth < 767){\r\n\t\t\t\ttocTitle.textContent = 'Table of Content';\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n    navLinks.forEach(link => {\r\n      link.classList.remove('active');\r\n      if(currentHeader != '') {\r\n\t\t  if (link.getAttribute('href').includes(currentHeader)) {\r\n\t\t\t  link.classList.add('active');\r\n\t\t  }\r\n\t  }\r\n    });\r\n\/\/     if (windowTop < triggerFooterPoint) {\r\n\/\/         toc.style.display = 'block';\r\n\/\/ \t}else{\r\n\/\/         toc.style.display = 'none';\r\n\/\/ \t}\r\n    \/\/ Update TOC title if sticky\r\n    if (windowTop > triggerPoint) {\r\n      if (!toc.classList.contains('sticky')) {\r\n        phtoc.style.display = \"block\";\r\n        toc.classList.add('sticky');\r\n        toc.style.width = `${tocParent.offsetWidth}px`; \/\/ Set width to match the parent element\r\n        toc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n        toc.style.backgroundColor = \"#FFF\";\r\n\t\tpanel2.style.height = '0px';\r\n\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\t\t  if(window.innerWidth < 767){\r\n\/\/ \t\t\t  const tocs = document.querySelector('#toc.sticky');\r\n\t\t\t  tocTitle.textContent = 'Table of Content'; \/\/ Reset title\r\n       \t\t  toc.style.width = '150px'; \/\/ Set width to match the parent element\r\n\t\t  }\r\n      }\r\n      if (currentHeader) {\r\n\/\/         console.log(\"activeLink:\", activeLink);\r\n        if (activeLink) {\r\n\/\/           tocTitle.textContent = activeLink.textContent; \/\/ Update TOC title\r\n          tocTitle.textContent = activeLink ? activeLink.textContent : \"\"; \/\/ Update title only if activeLink exists\r\n        }\r\n      }\r\n    } else {\r\n      toc.classList.remove('sticky');\r\n      phtoc.style.display = \"none\";\r\n      toc.style.width = 'unset'; \/\/ Reset to original width\r\n      toc.style.backgroundColor = \"#FFF\";\r\n      tocTitle.textContent = 'Table of Content'; \/\/ Reset title\r\n\t\tpanel2.style.height = panel2.scrollHeight + \"px\";\r\n\t\ticon.style.transform = \"rotate(180deg)\";\r\n    }\r\n  }\r\n\r\n    \/\/ Attach the scroll event listener to the window\r\n    window.addEventListener('scroll', handleScroll);\r\n\r\n    \/\/ Initial call to handleScroll to set the correct state on load\r\n    handleScroll();\r\n});\r\n\t\r\n\t\/\/ Open toggle TOC\r\n\t  document.addEventListener(\"DOMContentLoaded\", function() {\r\n\t\tvar tocHeader = document.querySelector(\"#toc .header\");\r\n\t\tvar toc = document.querySelector(\"#toc\");\r\n\t\tvar icon = document.querySelector(\".toc-icon\");\r\n\t\tconst tocTitle = document.querySelector('#toc-title');\r\n\t\tconst tocs = document.querySelector('#toc.sticky');\r\n \t\tconst tocParent = toc.parentElement;\t\t  \r\n\r\n\t\t  tocHeader.addEventListener(\"click\", function() {\r\n\t\t\tvar panel = this.nextElementSibling;\r\n\t\t\tif (panel.style.height !== '0px') { \/\/ Check if height is not 0px\r\n\t\t\t  panel.style.height = '0px'; \/\/ Set height to 0 for full collapse\r\n\t\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\/\/ \t\t\t\ttoc.style.paddingBottom = '6px'; \r\n\t\t\t\tif(window.innerWidth > 768){\r\n\t\t\t\t\tif(!toc.classList.contains('sticky')){\r\n\t\t\t\t\t\ttoc.style.width = \"unset\";\r\n\/\/ \t\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (toc.classList.contains('sticky')){\r\n\t\t\t\t\t\ttoc.style.width = '${tocParent.offsetWidth}px';\r\n\t\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(window.innerWidth < 767){\r\n\t\t\t\t\ttoc.style.width = \"unset\"; \/\/ Reset width\r\n\t\t\t\t}\r\n\t\t\t\ttoc.style.backgroundColor = \"#FFF1F1\";\r\n\t\t\t} else {\r\n\t\t\t  panel.style.height = panel.scrollHeight + \"px\";\r\n\t\t\t  icon.style.transform = \"rotate(0deg)\";\r\n\t\t\t  toc.style.backgroundColor = \"#FFF\";\r\n\t\t\t  tocTitle.textContent = 'Table of Content'; \/\/ Reset title\r\n\t\t\t\ttoc.style.paddingBottom = '24px';\r\n\t\t\t \tif(window.innerWidth < 767){\r\n\t\t\t\t\ttoc.style.width = `${tocParent.offsetWidth}px`; \/\/ Set width to match the parent element\r\n\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t  });\r\n\r\n\t\t  \/\/ Close TOC when a link inside it is clicked\r\n\t\t  var tocLinks = document.querySelectorAll(\"#toc .list a\");\r\n\t\t  tocLinks.forEach(function(link) {\r\n\t\t\tlink.addEventListener(\"click\", function() {\r\n\t\t\t  var panel = document.querySelector(\"#toc .list\");\r\n\t\t\t  panel.style.height = '0px'; \/\/ Set height to 0 for full collapse\r\n\t\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\t\t\t  toc.style.backgroundColor = \"#FFF\";\r\n\t\t\t});\r\n\t\t  });\r\n\t\t});\r\n\r\n\r\n\r\n\t\r\n\/\/ \tmake the heading at the center of the viewport\r\n\/\/ \tdocument.addEventListener('DOMContentLoaded', function() {\r\n\/\/     \/\/ Add click event listener to all links in the TOC list\r\n\/\/     document.querySelectorAll('#toc-list a').forEach(anchor => {\r\n\/\/         anchor.addEventListener('click', function (e) {\r\n\/\/             e.preventDefault(); \/\/ Prevent the default behavior of jumping to the anchor\r\n\/\/ \/\/ \t\t\tconsole.log(\"prevent default\");\r\n\/\/             const targetId = this.getAttribute('href').substring(1); \/\/ Get the ID of the target element\r\n\/\/             const targetElement = document.getElementById(targetId); \/\/ Get the target element\r\n\r\n\/\/             if (targetElement) {\r\n\/\/                 const headerHeight = document.querySelector('#toc .header').offsetHeight; \/\/ Get the height of the fixed header\r\n\/\/                 const windowHeight = window.innerHeight; \/\/ Get the height of the viewport\r\n\/\/                 const targetOffset = targetElement.offsetTop; \/\/ Get the top offset of the target element\r\n\/\/                 const scrollTo = targetOffset + (windowHeight \/ 2) + (headerHeight); \/\/ Calculate the scroll position to center the target element\r\n\r\n\/\/                 \/\/ Scroll to the calculated position smoothly\r\n\/\/                 window.scrollTo({\r\n\/\/                     top: scrollTo,\r\n\/\/                     behavior: 'smooth'\r\n\/\/                 });\r\n\/\/             }\r\n\/\/         });\r\n\/\/     });\r\n\/\/ });\r\n<\/script>\r\n\r\n<!-- START script lama -->\r\n<!-- <script>\r\n\/\/ \tvar pilihDaftarIsi = document.getElementById('pilihDaftarIsi');\r\n\t\r\n\/\/ \tdocument.addEventListener('DOMContentLoaded', function() {\r\n\/\/ \t\tvar dropdownFixedTop = document.querySelector('.dropdown-fixed-top');\r\n\r\n\/\/ \t\tdropdownFixedTop.addEventListener('click', function() {\r\n\/\/ \t\t\tvar dropdownContent = this.querySelector('.list_toc');\r\n\/\/ \t\t\tdropdownContent.classList.toggle('show');\r\n\/\/ \t\t});\r\n\r\n\/\/ \t\twindow.addEventListener('click', function(event) {\r\n\/\/ \t\t\tvar listTocTop = document.getElementById('list_toc_top');\r\n\r\n\/\/ \t\t\tif (!dropdownFixedTop.contains(event.target)) {\r\n\/\/ \t\t\t\tlistTocTop.classList.remove('show');\r\n\/\/ \t\t\t}\r\n\/\/ \t\t});\r\n\/\/ \t});\r\n\t\r\n\/\/ \tvar daftarIsiContainer = document.getElementById('toc_group_article');\r\n\/\/ \tvar dropdownFixedTop = document.getElementById('dropdown-fixed-top');\r\n\/\/     var triggered = false; \/\/ Flag to keep track of whether the function has been triggered\r\n\r\n\/\/     window.addEventListener('scroll', function() {\r\n\/\/         if (!triggered && isCompletelyScrolledPast(daftarIsiContainer)) {\r\n\/\/             showSectionDropdownFixedTop(false);\r\n\/\/             triggered = true;\r\n\/\/         } else if (triggered && !isCompletelyScrolledPast(daftarIsiContainer)) {\r\n\/\/             showSectionDropdownFixedTop(true);\r\n\/\/             triggered = false;\r\n\/\/         }\r\n\/\/     });\r\n\r\n\/\/     function isCompletelyScrolledPast(element) {\r\n\/\/         var elementTop = element.getBoundingClientRect().top;\r\n\/\/         var elementBottom = element.getBoundingClientRect().bottom;\r\n\/\/         return elementTop < 0 && elementBottom < 0;\r\n\/\/     }\r\n\r\n\/\/     function showSectionDropdownFixedTop(show) {\r\n\/\/ \t\tif (show) {\r\n\/\/ \t\t\tdropdownFixedTop.classList.remove(\"show\");\r\n\/\/ \t\t} else {\r\n\/\/ \t\t\tdropdownFixedTop.classList.add(\"show\");\r\n\/\/ \t\t}\r\n\/\/     }\r\n<\/script> -->\r\n<!-- <script>\r\n    \/\/ Scrollspy function to highlight the active TOC item based on the scroll position\r\n  function scrollSpy(tocClass) {\r\n    const scrollPosition = window.scrollY;\r\n\r\n    \/\/ Find the active h2 and h3 headings based on their position in the corresponding TOC\r\n    let activeH2 = null;\r\n    let activeH3 = null;\r\n\r\n    const tocItems = document.querySelectorAll(`.${tocClass} li`);\r\n    tocItems.forEach(item => {\r\n      const a = item.querySelector('a');\r\n      if (!a) return;\r\n      const href = a.getAttribute('href');\r\n      const targetId = href.substring(1); \/\/ Remove the '#' from the href to get the target ID\r\n      const targetElement = document.getElementById(targetId);\r\n      if (!targetElement) return;\r\n\r\n      const targetTop = targetElement.getBoundingClientRect().top + scrollPosition;\r\n      const nextItem = item.nextElementSibling;\r\n      const nextTop = nextItem ? nextItem.getBoundingClientRect().top + scrollPosition : Infinity;\r\n\r\n      if (targetTop <= scrollPosition + 150) {\r\n        if (a.parentElement.parentElement === tocItems) {\r\n          \/\/ The h2 heading is at the root level of the TOC\r\n          activeH2 = { id: targetId, level: 'h2' };\r\n        } else {\r\n          \/\/ The h3 heading is nested under an h2 heading\r\n          const parentH2 = a.parentElement.parentElement.previousElementSibling;\r\n          if (parentH2) {\r\n            const h2Link = parentH2.querySelector('a');\r\n            if (h2Link) {\r\n              const h2Href = h2Link.getAttribute('href');\r\n              const h2Id = h2Href.substring(1);\r\n              activeH2 = { id: h2Id, level: 'h2' };\r\n            }\r\n          }\r\n          activeH3 = { id: targetId, level: 'h3' };\r\n        }\r\n      }\r\n\r\n      if (targetTop > scrollPosition + 150 && nextTop > scrollPosition + 150 && !activeH3) {\r\n        \/\/ Reset the activeH2 when there are no more active h3 headings\r\n        activeH2 = null;\r\n      }\r\n    });\r\n\r\n    \/\/ Update the active state for the TOC items\r\n    tocItems.forEach(item => {\r\n      item.classList.remove('active');\r\n      const a = item.querySelector('a');\r\n      if (a) {\r\n        const href = a.getAttribute('href');\r\n        const targetId = href.substring(1);\r\n        if ((activeH2 && activeH2.id === targetId) || (activeH3 && activeH3.id === targetId)) {\r\n          item.classList.add('active');\r\n\t\t  pilihDaftarIsi.innerHTML = a.textContent;\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Call scrollSpy for each TOC on window scroll\r\n  const tocClasses = ['list_toc', 'list_toc_float', 'list_toc_top']; \/\/ Add other TOC class names here if you have more than two instances\r\n  tocClasses.forEach(tocClass => {\r\n    window.addEventListener('scroll', () => scrollSpy(tocClass));\r\n  });\r\n<\/script> -->\r\n<!-- END script lama -->\r\n\t\r\n<script>\r\n    \/\/ Scrollspy function to highlight the active TOC item based on the scroll position\r\n  function scrollSpy(tocClass) {\r\n    const scrollPosition = window.scrollY;\r\n\r\n    \/\/ Find the active h2 and h3 headings based on their position in the corresponding TOC\r\n    let activeH2 = null;\r\n    let activeH3 = null;\r\n\r\n    const tocItems = document.querySelectorAll(`.${tocClass} li`);\r\n    tocItems.forEach(item => {\r\n      const a = item.querySelector('a');\r\n      if (!a) return;\r\n      const href = a.getAttribute('href');\r\n      const targetId = href.substring(1); \/\/ Remove the '#' from the href to get the target ID\r\n      const targetElement = document.getElementById(targetId);\r\n      if (!targetElement) return;\r\n\r\n      const targetTop = targetElement.getBoundingClientRect().top + scrollPosition;\r\n      const nextItem = item.nextElementSibling;\r\n      const nextTop = nextItem ? nextItem.getBoundingClientRect().top + scrollPosition : Infinity;\r\n\r\n      if (targetTop <= scrollPosition + 150) {\r\n        if (a.parentElement.parentElement === tocItems) {\r\n          \/\/ The h2 heading is at the root level of the TOC\r\n          activeH2 = { id: targetId, level: 'h2' };\r\n        } else {\r\n          \/\/ The h3 heading is nested under an h2 heading\r\n          const parentH2 = a.parentElement.parentElement.previousElementSibling;\r\n          if (parentH2) {\r\n            const h2Link = parentH2.querySelector('a');\r\n            if (h2Link) {\r\n              const h2Href = h2Link.getAttribute('href');\r\n              const h2Id = h2Href.substring(1);\r\n              activeH2 = { id: h2Id, level: 'h2' };\r\n            }\r\n          }\r\n          activeH3 = { id: targetId, level: 'h3' };\r\n        }\r\n      }\r\n\r\n      if (targetTop > scrollPosition + 150 && nextTop > scrollPosition + 150 && !activeH3) {\r\n        \/\/ Reset the activeH2 when there are no more active h3 headings\r\n        activeH2 = null;\r\n      }\r\n    });\r\n\r\n    \/\/ Update the active state for the TOC items\r\n    tocItems.forEach(item => {\r\n      item.classList.remove('active');\r\n      const a = item.querySelector('a');\r\n      if (a) {\r\n        const href = a.getAttribute('href');\r\n        const targetId = href.substring(1);\r\n        if ((activeH2 && activeH2.id === targetId) || (activeH3 && activeH3.id === targetId)) {\r\n          item.classList.add('active');\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Call scrollSpy for each TOC on window scroll\r\n  const tocClasses = ['list_toc', 'list_toc_float']; \/\/ Add other TOC class names here if you have more than two instances\r\n  tocClasses.forEach(tocClass => {\r\n    window.addEventListener('scroll', () => scrollSpy(tocClass));\r\n  });\r\n<\/script>\r\n\t\r\n\r\n<!-- ToC List for desktop side bar, diganti jadi inject by php, di code snippet \"Sidebar Accordion\" -->\r\n<!--  <script>\r\n\tdocument.addEventListener(\"DOMContentLoaded\", function() {\r\nToC List for desktop side bar, diganti jadi inject by php, di code snippet \"Sidebar Accordion\"\r\n        Fungsi untuk mengubah teks menjadi format id\r\n        function formatId(text) {\r\n            return text.trim().replace(\/[^\\w\\d]+\/g, '_');\r\n        }\r\n\r\n        \/\/ Fungsi untuk membuat nested list\r\n        function createNestedList(parentNode, children) {\r\n            if (children.length === 0) return;\r\n\r\n            const nestedUl = document.createElement('ul');\r\n            children.forEach(child => {\r\n                const nestedLi = document.createElement('li');\r\n                const nestedA = document.createElement('a');\r\n                nestedA.textContent = child.title;\r\n                nestedA.href = `#${child.id}`;\r\n                nestedLi.appendChild(nestedA);\r\n                nestedUl.appendChild(nestedLi);\r\n\r\n                if (child.children.length > 0) {\r\n                    createNestedList(nestedLi, child.children);\r\n                }\r\n            });\r\n\r\n            parentNode.appendChild(nestedUl);\r\n        }\r\n\r\n        \/\/ Membuat objek untuk menyimpan daftar h2 dan h3 beserta judulnya\r\n        const headings = [];\r\n\r\n           \/\/ Mengambil semua elemen h2 dan h3\r\n        const elements = document.querySelectorAll('.td-post-content h2');\r\n\t\t\t\/\/, .td-post-content h3\r\n\r\n        elements.forEach(element => {\r\n            if (element.tagName === 'H2') {\r\n                const id = formatId(element.textContent);\r\n                element.id = id;\r\n\t\t\t\tif (element.textContent.toLowerCase() === \"key takeaways\") {return;} \/\/ Kalau Key Takeaways, jangan dimasukin\r\n                headings.push({ level: 'h2', id: id, title: element.textContent, children: [] });\r\n            } else if (element.tagName === 'H3') {\r\n                const id = formatId(element.textContent);\r\n                element.id = id;\r\n                if (headings.length > 0) {\r\n                    headings[headings.length - 1].children.push({ level: 'h3', id: id, title: element.textContent, children: [] });\r\n                }\r\n            }\r\n        });\r\n\r\n        \/\/ Membuat list HTML dari objek headings\r\n        const ul = document.getElementById('list_toc');\r\n        let currentUl = ul;\r\n        headings.forEach(heading => {\r\n            const li = document.createElement('li');\r\n            const a = document.createElement('a');\r\n            a.textContent = heading.title;\r\n            a.href = `#${heading.id}`;\r\n            li.appendChild(a);\r\n\r\n            if (heading.level === 'h2') {\r\n                \/\/ Menyimpan ul saat ini untuk menambahkan nested ul\r\n                currentUl = li;\r\n                ul.appendChild(li);\r\n            } else if (heading.level === 'h3') {\r\n                if (!currentUl.lastElementChild || currentUl.lastElementChild.tagName !== 'UL') {\r\n                    \/\/ Jika belum ada nested ul, buat satu\r\n                    const nestedUl = document.createElement('ul');\r\n                    currentUl.appendChild(nestedUl);\r\n                    currentUl = nestedUl;\r\n                }\r\n                currentUl.appendChild(li);\r\n            }\r\n\r\n            createNestedList(li, heading.children);\r\n        });\r\n\t\tDapatkan elemen ul dengan id 'list_toc_float'\r\nconst ulFloat = document.getElementById('list_toc');\r\nconst ulJourney = document.getElementById('list_journey');\r\n\r\nDapatkan isi (child elements) dari ul dengan id 'list_toc_float'\r\n\tif (ulFloat !== null) {\r\n\t\tconst clonedChildren = ulFloat.cloneNode(true).children;\r\n\t\tconst ulToc = document.getElementById('list_toc_float');\r\n\t\tconst ulTocTop = document.getElementById('list_toc_top');\r\n\t\tif ((ulToc !== null || ulToc !== undefined) && window.innerWidth > 1018){\r\n\t\t\tulToc.append(...clonedChildren);\r\n\t\t} else {\r\n\t\t\tulTocTop.append(...clonedChildren);\r\n\t\t}\r\n\t} \r\n\r\n\tif (ulJourney !== null) {\r\n\t\tconst clonedChildrenJourney = ulJourney.cloneNode(true).children;\r\n\t\tconst ulTocJourney = document.getElementById('list_toc_journey');\r\n\t\tulTocJourney.append(...clonedChildrenJourney);\r\n\t} \r\n\t\r\n        Fungsi untuk mengambil tinggi navbar\r\n        function getNavbarHeight() {\r\n            const navbar = document.getElementById('tdi_34');\r\n            return navbar ? navbar.offsetHeight : 0;\r\n        }\r\n\r\n        \/\/ Fungsi untuk menambahkan offset posisi scroll\r\n        function scrollToElementWithOffset(elementId) {\r\n            const element = document.getElementById(elementId);\r\n            if (element) {\r\n                const offset = getNavbarHeight();\r\n                const elementPosition = element.getBoundingClientRect().top;\r\n                const offsetPosition = elementPosition - offset-40;\r\n\r\n                window.scrollBy({\r\n                    top: offsetPosition,\r\n                    behavior: 'smooth'\r\n                });\r\n            }\r\n        }\r\n\r\n        \/\/ Fungsi untuk menangani klik pada tautan judul\r\n        function handleTitleClick(event) {\r\n            event.preventDefault();\r\n            const href = event.target.getAttribute('href').substr(1);\r\n            scrollToElementWithOffset(href);\r\n        }\r\n\r\n        \/\/ Tambahkan event listener untuk semua tautan judul\r\n        const titleLinks = document.querySelectorAll('a[href^=\"#\"]');\r\n        titleLinks.forEach(link => {\r\n            link.addEventListener('click', handleTitleClick);\r\n        });\r\n\t});\r\n    <\/script> -->\r\n\n\r\n    <div class=\"adjustable-banner-wrap\">\r\n        <a href=\"https:\/\/www.hashmicro.com\/au\/human-resource-management?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\/hr_desktop_1-scaled.webp\"\r\n                 data-desktop-src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/03\/hr_desktop_1-scaled.webp\"\r\n                 data-mobile-src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/03\/hr_mobile_1.webp\"\r\n                 alt=\"HRGeneral1\"\r\n                 class=\"responsive-image-banner\">\r\n\r\n            \r\n            <div class=\"adjustable-banner-overlay\" style=\"width: 55%\">\r\n                <p class=\"adjustable-banner-text\">Need an expert to find the &lt;span class='adjustable-highlight'&gt;right HR system&lt;\/span&gt; for your team?<\/p>\r\n                <div class=\"adjustable-banner-btn\">Schedule a Consultation<\/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>\n<h2><strong>What Is Single Touch Payroll (STP)?<\/strong><\/h2>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-2995\" src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney.webp\" alt=\"what-is-single-touch-payroll-(STP)?\" width=\"800\" height=\"400\" srcset=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney.webp 800w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-300x150.webp 300w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-768x384.webp 768w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-150x75.webp 150w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-696x348.webp 696w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>Single Touch Payroll is a digital reporting mandate introduced by the ATO on 1 July 2018 for large employers, extended to all employers by 1 July 2019, and expanded again through Phase 2 from 1 January 2022.<\/p>\n<p>Before STP, employers lodged PAYG withholding monthly or quarterly and issued Payment Summaries (formerly group certificates) at year-end, alongside a Payment Summary Annual Report (PSAR) to the ATO.<\/p>\n<p>The current framework replaces that batch process with real-time lodgement. Every pay run now triggers an automatic transmission to the ATO on or before the payment date, giving live visibility of tax and super.<\/p>\n<p>The system serves three objectives. First, it integrates statutory reporting into normal business processes. Second, it gives employees live visibility of earnings through their myGov account.<\/p>\n<p>Third, it feeds real-time data to Services Australia and the Child Support Agency, so welfare entitlements and child support deductions are calculated against current income rather than historical estimates.<\/p>\n<p>STP relies on Application Programming Interfaces (APIs) embedded in compliant payroll software. When a pay run is finalised, the software compiles an XML or JSON payload and transmits it via the SBR network.<\/p>\n<p>The ATO validates the payload against the employer&#8217;s ABN and each Tax File Number, then updates employee records. Successful lodgements usually appear in myGov within minutes as a year-to-date Income Statement.<\/p>\n<style>\r\n    #custom-quote {\r\n        background-color: #f0f0f0;\r\n        padding: 20px;\r\n        border-radius: 12px;\r\n        margin: 20px;\r\n        display: flex;\r\n        flex-direction: column;\r\n    }\r\n\r\n    #custom-quote .quote-body {\r\n        display: flex;\r\n        flex-direction: row;\r\n        align-items: flex-start;\r\n        gap: 15px;\r\n        font-size: 16px;\r\n        line-height: 1.5;\r\n        font-style: italic;\r\n    }\r\n\r\n    #custom-quote .quote-icon {\r\n        width: 40px;\r\n        height: 40px;\r\n        flex-shrink: 0;\r\n    }\r\n\r\n    #custom-quote .quote-author-wrapper {\r\n        margin-top: 15px;\r\n        align-self: flex-start;\r\n        margin-left: 55px; \r\n\t\tmargin-bottom: 0px;\r\n    }\r\n\r\n    #custom-quote em {\r\n        font-family: 'Roboto Serif', serif !important;\r\n        font-size: 12px;\r\n        font-weight: bold;\r\n        font-style: normal;\r\n    }\r\n\r\n    @media screen and (max-width: 768px) {\r\n        #custom-quote {\r\n            margin: 15px 0;\r\n            padding: 15px;\r\n        }\r\n        \r\n        #custom-quote .quote-body {\r\n            gap: 12px;\r\n        }\r\n\r\n        #custom-quote .quote-author-wrapper {\r\n            margin-left: 52px;\r\n        }\r\n    }\r\n\r\n    @media screen and (max-width: 480px) {\r\n        #custom-quote {\r\n            margin: 10px 0;\r\n            padding: 12px;\r\n        }\r\n\r\n        #custom-quote .quote-body {\r\n            font-size: 14px;\r\n            gap: 10px;\r\n        }\r\n\r\n        #custom-quote .quote-icon {\r\n            width: 32px;\r\n            height: 32px;\r\n        }\r\n\r\n        #custom-quote .quote-author-wrapper {\r\n            margin-top: 10px;\r\n            margin-left: 42px;\r\n        }\r\n    }\r\n<\/style>\r\n\r\n<div id=\"custom-quote\">\r\n    <div class=\"quote-body\">\r\n        <img decoding=\"async\" src=\"https:\/\/www.hashmicro.com\/blog\/wp-content\/uploads\/2025\/12\/quote.webp\" alt=\"Quote Icon\" class=\"quote-icon\">\r\n        <div>\r\n            Single Touch Payroll fundamentally shifts payroll from a periodic reporting cycle into a live operational feed. This protects Australian businesses from year-end scrambles and ATO penalties, while giving employees the real-time income transparency.        <\/div>\r\n    <\/div>\r\n    <p class=\"quote-author-wrapper\">\r\n        <em>Ricky Halim, B.Sc., Managing Director<\/em>\r\n    <\/p>\r\n<\/div>\n<h2><strong>Why Single Touch Payroll Is Important for Australian Businesses<\/strong><\/h2>\n<p>STP reshapes payroll compliance in Australia. It removes manual end-of-year reporting, improves accuracy, and gives the ATO a live view of employer obligations, benefiting businesses, employees, and agencies alike.<\/p>\n<h3>1. Streamlined payroll reporting to the ATO<\/h3>\n<p>Reporting happens automatically through the payroll software at each pay event. Therefore, employers stop duplicating effort across separate BAS statements, PAYG reports, and payment summaries.<\/p>\n<p>The software produces a validated file in a single action. For example, a weekly pay run for 50 employees can be lodged with the ATO in under two minutes, without any spreadsheet manipulation.<\/p>\n<h3>2. Greater transparency for employees<\/h3>\n<p>Employees can view year-to-date wages, tax, and super in their myGov account at any time during the year. As a result, they spot payroll errors early and raise them before the figures compound.<\/p>\n<p>This visibility also supports loan, rental, and Centrelink applications. For example, banks can verify income directly through the Income Statement rather than requiring historical payslips from the employer.<\/p>\n<h3>3. Reduced end-of-year reporting burden<\/h3>\n<p>STP removes the need to produce payment summaries or an annual PAYG report. Once the EOFY finalisation declaration is submitted by 14 July, employee Income Statements are marked &#8220;tax ready&#8221; in myGov.<\/p>\n<p>Therefore, payroll teams reclaim time previously spent on year-end reconciliation. A mid-sized employer saves roughly 20 hours of admin each July by using finalisation rather than manual summaries.<\/p>\n<h2><strong>Who Must Use Single Touch Payroll?<\/strong><\/h2>\n<p>According to the\u00a0<a href=\"https:\/\/www.abs.gov.au\/\" target=\"_blank\" rel=\"noopener\">Australian Bureau of Statistics<\/a>, more than 2.6 million actively trading businesses operate in Australia, and every employer among them falls within STP reporting rules.<\/p>\n<p>STP covers companies, sole traders, partnerships, trusts, and not-for-profits. Every legal structure that employs staff falls under the same rules, regardless of turnover or staff numbers.<\/p>\n<p>The mandate applies to all worker types: full-time, part-time, and casual employees, company directors, closely held payees, working holiday makers, and recipients of termination or lump sum payments.<\/p>\n<p>Closely held payees are individuals directly related to the entity paying them. Examples include family members of a family business, directors of a private company, and beneficiaries of a trust.<\/p>\n<p>Since 1 July 2021, closely held payees must be reported through STP. Smaller employers can choose to report on or before each pay day or every quarter, provided they meet specific ATO criteria.<\/p>\n<p>Micro employers with one to four staff also comply. Quarterly concessions applied during the transition period, but most micro employers now lodge on or before each pay day using low-cost STP software.<\/p>\n<p>Full exemptions are rare and limited to employers in remote areas without reliable internet. For short disruptions such as natural disasters or software outages, employers can request a deferral from the ATO.<\/p>\n<p>Entities with a Withholding Payer Number (WPN) rather than an ABN, such as households employing a nanny, operate under transitional rules, though the ATO encourages voluntary STP adoption.<\/p>\n<p>Foreign employers with Australian-based staff also fall within STP rules. Therefore, global companies hiring locally must register for an ABN and adopt compliant software to lodge pay events correctly.<\/p>\n<h2><strong>Key Components of STP Reporting<\/strong><\/h2>\n<p>STP reporting goes beyond wages. The ATO expects a detailed breakdown of pay, tax, super, and employment information at every pay event, so accuracy across each component protects both the employer and the employee.<\/p>\n<h3>1. Wages, PAYG withholding, and superannuation data<\/h3>\n<p>Employers report gross wages, allowances, bonuses, commissions, and deductions alongside PAYG withholding and the Superannuation Guarantee liability calculated on Ordinary Time Earnings (OTE).<\/p>\n<p>Therefore, payroll calculations must reconcile cleanly against each STP submission. For example, a miscoded allowance can inflate OTE, overstate super liability, and distort an employee&#8217;s tax position.<\/p>\n<h3>2. Employment details and income types<\/h3>\n<p>STP Phase 2 requires granular employment data, such as income type (salary and wages, closely held, working holiday maker, labour hire), employment basis, and tax treatment code.<\/p>\n<p>The tax treatment code is a six-character alphanumeric field that encodes tax scale, residency, study loan status, and Medicare Levy variations. Then the ATO applies the correct withholding rules automatically.<\/p>\n<p>Cessation data is also reported when an employee leaves. The cessation reason code (voluntary resignation, redundancy, dismissal, contract cessation) replaces the old separation certificate used by Centrelink.<\/p>\n<h3>3. EOFY finalisation and income statements<\/h3>\n<p>At year-end, employers lodge a Finalisation Declaration confirming that all reported year-to-date figures are complete and accurate for each employee.<\/p>\n<p>Once lodged, each employee&#8217;s Income Statement in myGov changes from &#8220;year-to-date&#8221; to &#8220;tax ready&#8221;. Individuals or their tax agents can then lodge annual returns without waiting for a payment summary.<\/p>\n<p>The finalisation deadline is 14 July for most employers. For example, closely held payees have a later deadline (typically 30 September) to allow for end-of-year adjustments within family businesses.<\/p>\n<h3>4. Exemptions and deferral options<\/h3>\n<p>Some employers qualify for deferrals when software is not compliant or when disruptions prevent reporting. For example, a ransomware attack disabling a payroll system supports a short-term deferral request.<\/p>\n<p>Deferrals are requested through the ATO&#8217;s online services for business or via a registered tax or BAS agent. Therefore, the request must specify the affected pay cycles and the expected resolution date.<\/p>\n<h2><strong>What Changed with Single Touch Payroll?<\/strong><\/h2>\n<p>STP has evolved since its 2018 launch. The second iteration, effective from 1 January 2022, expanded the reporting scope and replaced multiple separate obligations with one enriched data feed to the ATO.<\/p>\n<h3>1. How Phase 1 and Phase 2 differ in reporting scope<\/h3>\n<p>The original rollout captured top-level financial data: gross wages, PAYG withheld, and super liability. This satisfied the ATO but lacked the detail needed by other agencies such as Services Australia.<\/p>\n<p>The updated framework disaggregates gross pay into specific categories. Therefore, a single &#8220;gross&#8221; figure now splits into ordinary earnings, overtime, allowances, bonuses, paid leave types, and directors&#8217; fees.<\/p>\n<p>The updated framework also embeds the TFN declaration inside the pay event. For example, separate paper or digital TFN declarations are no longer required, reducing onboarding paperwork significantly.<\/p>\n<p>Services Australia, the Child Support Agency, and Home Affairs now receive data directly through STP. As a result, employers issue fewer separation certificates and supporting letters for employee benefit claims.<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border: 1px solid #ddd;\">\n<thead>\n<tr style=\"background-color: #c0392b; color: #ffffff;\">\n<th style=\"padding: 12px; text-align: left; border: 1px solid #ddd;\">Reporting Scope<\/th>\n<th style=\"padding: 12px; text-align: left; border: 1px solid #ddd;\">STP Phase 1<\/th>\n<th style=\"padding: 12px; text-align: left; border: 1px solid #ddd;\">STP Phase 2<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding: 12px; border: 1px solid #ddd;\"><strong><br \/>\nFinancial data captured<br \/>\n<\/strong><\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Top-level totals only: gross wages, PAYG withheld, and super liability.<\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Disaggregated data feeding both ATO and partner agencies.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 12px; border: 1px solid #ddd;\"><strong><br \/>\nGross pay breakdown<br \/>\n<\/strong><\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Reported as a single combined gross figure.<\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Split into ordinary earnings, overtime, allowances, bonuses, paid leave types, and directors&#8217; fees.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 12px; border: 1px solid #ddd;\"><strong><br \/>\nTFN declarations<br \/>\n<\/strong><\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Lodged separately via paper or digital forms.<\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Embedded directly inside each pay event, removing duplicate paperwork.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 12px; border: 1px solid #ddd;\"><strong><br \/>\nAgency data sharing<br \/>\n<\/strong><\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Other agencies relied on employer-issued letters and certificates.<\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Services Australia, Child Support Agency, and Home Affairs receive data directly.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 12px; border: 1px solid #ddd;\"><strong><br \/>\nEmployer admin burden<br \/>\n<\/strong><\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Frequent issuing of separation certificates and supporting letters for employee claims.<\/td>\n<td style=\"padding: 12px; border: 1px solid #ddd;\">Reduced paperwork, as agencies source data directly from STP submissions.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>2. STP Phase 2 income and reporting categories<\/h3>\n<p>Income splits into six primary categories: salary and wages, closely held payees, working holiday makers, seasonal workers, labour hire, and voluntary agreements. Each record reflects the nature of the engagement.<\/p>\n<p>Allowances must be itemised by type. For example, tool, task, qualification, travel, meals, and laundry allowances each require their own reporting category rather than being lumped into gross pay.<\/p>\n<p>Paid leave is separated, too. Categories include annual leave (O), personal or carer&#8217;s leave (S), long service leave (L), ancillary and defence leave (A), workers&#8217; compensation (W), and paid parental leave (P).<\/p>\n<p>Lump sum and termination components carry distinct codes. Lump Sum A covers unused leave on termination, Lump Sum B legacy LSL, Lump Sum D tax-free redundancy, and Lump Sum E backpay from prior years.<\/p>\n<p>Salary sacrifice arrangements must also be split. Therefore, super contributions (type S) and other employee benefits such as novated leases or devices (type O) are reported separately rather than bundled.<\/p>\n<h2><strong>How STP Reporting Works for Your Business<\/strong><\/h2>\n<p>STP operates on a year-to-date (YTD) basis. Each pay event sends cumulative YTD totals, not just the current pay period, so every submission effectively overwrites the previous one with updated figures.<\/p>\n<p>This YTD approach is self-correcting. For example, if an underpayment of $50 is discovered in week 2, the week 2 submission contains the corrected YTD total, and no amendment to week 1 is required.<\/p>\n<p>A pay run then moves through five technical stages from processing to ATO confirmation. Therefore, each stage has specific checkpoints that payroll staff must verify before treating the event as complete.<\/p>\n<p>First, the administrator calculates timesheets, applies leave, processes deductions, and finalises the pay run in compliant software. Second, the software extracts YTD figures and maps each item to its ATO category.<\/p>\n<p>Third, the user signs a digital declaration confirming that the data is true and correct. Fourth, the software transmits the encrypted payload to the ATO through the SBR gateway.<\/p>\n<p>Fifth, the ATO responds with a status message: success, partial success (some employees rejected for invalid TFNs or formatting), or full rejection (usually caused by an invalid ABN or disconnected Software ID).<\/p>\n<p>Employers also handle corrections through Update Events. For example, if a post-payment adjustment is needed, an Update Event pushes revised YTD values to the ATO without reissuing the original pay event.<\/p>\n<p>Reports must be lodged on or before each payday. Payroll accuracy at the point of pay matters more than year-end reconciliation, because late or missing events trigger failure-to-lodge penalties.<\/p>\n<h2><strong>What Information Do You Need to Report?<\/strong><\/h2>\n<p>Every pay event combines three data layers: employer data, employee demographic data, and year-to-date financial data. Each layer must be validated before submission to avoid rejection or compliance breaches.<\/p>\n<p>Employer data includes the ABN, branch number (usually 001, or another if the business operates multiple registered branches), and the registered business name for ATO account matching.<\/p>\n<p>Employee demographic data covers the Tax File Number, full legal name, date of birth, and residential address. For example, missing a TFN triggers the use of exemption codes such as 000000000 or 111111111.<\/p>\n<p>Employment basis must also be declared: full-time, part-time, casual, labour hire, or non-employee, such as a voluntary-withholding contractor. Master file accuracy, therefore, drives correct STP lodgement.<\/p>\n<p>The tax treatment code captures TFN declaration outcomes. It records whether the employee claims the tax-free threshold, holds a HELP, VSL, or SSL study loan, or qualifies for a Medicare Levy variation.<\/p>\n<p>Cessation data reports the termination date and a standardised reason code. Codes cover voluntary resignation, redundancy, dismissal, contract cessation, and transfer, replacing legacy separation certificates.<\/p>\n<p>Financial data reports year-to-date gross earnings disaggregated into Phase 2 categories, along with PAYG withholding, Superannuation Guarantee liability, and <a href=\"https:\/\/www.ato.gov.au\/businesses-and-organisations\/super-for-employers\/setting-up-super-for-your-business\/identify-reportable-employer-super-contributions\" target=\"_blank\" rel=\"noopener\">Reportable Employer Superannuation Contributions (RESC)<\/a>.<\/p>\n<p>Allowances and paid leave amounts are itemised, as outlined in the Key Components section above. Then deductions such as child support, union fees, and workplace giving appear with their own identifiers.<\/p>\n<p>Child support deductions warrant specific attention. Notices issued under section 45 of the Child Support (Registration and Collection) Act 1988 are reported directly through STP to the Child Support Agency.<\/p>\n<p>SG liability represents the amount owed, not the amount remitted. Therefore, the figure lodged through STP and the superannuation actually paid via the clearing house must reconcile before each quarterly deadline.<\/p>\n<h2><strong>How to Set Up and Register for STP<\/strong><\/h2>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-2988\" src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-scaled.webp\" alt=\"how-to-set-up-and-register-for-stp\" width=\"2560\" height=\"1429\" srcset=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-scaled.webp 2560w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-300x167.webp 300w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-1024x572.webp 1024w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-768x429.webp 768w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-1536x857.webp 1536w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-2048x1143.webp 2048w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-753x420.webp 753w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-150x84.webp 150w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-696x388.webp 696w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-1068x596.webp 1068w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/unnamed-18-1920x1072.webp 1920w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/p>\n<p>STP setup requires a structured approach because errors in configuration cascade into every future pay event. A careful rollout protects the business from rejected lodgements and ATO penalties.<\/p>\n<h3>1. Choosing STP-compliant payroll software<\/h3>\n<p>The foundation of STP compliance is choosing software listed on the ATO&#8217;s Product Register. The product must be certified for Phase 2 and support the SBR protocol for data transmission.<\/p>\n<p>For micro employers, low-cost standalone apps covering basic STP lodgement often suffice. For example, several ATO-approved apps cost under $10 per month and handle fewer than four employees with minimal setup.<\/p>\n<p>Mid-sized and large employers prefer integrated payroll and HR platforms. Embedding payroll inside an ERP or HRIS allows leave, timesheets, awards, and STP to flow through a single data model.<\/p>\n<h3>2. Connecting your software to the ATO<\/h3>\n<p>After installing the software, the business must link it to the ATO through the Access Manager portal using its myGovID credentials and Relationship Authorisation Manager (RAM).<\/p>\n<p>The connection requires the unique Software ID issued by the vendor. This identifier is registered against the ABN in ATO systems, and without it, pay event lodgements fail at the SBR gateway.<\/p>\n<p>Registered agents can link a client&#8217;s software through Online Services for Agents. For example, a BAS agent uses their agent number rather than the employer&#8217;s myGovID to authorise lodgements.<\/p>\n<h3>3. Configuring your employee details<\/h3>\n<p>Accurate master data is the single biggest determinant of STP success. Therefore, each employee record must contain a valid TFN, legal name, date of birth, residential address, and employment basis.<\/p>\n<p>The tax treatment code is derived from the employee&#8217;s TFN declaration. Claims for the tax-free threshold, HELP or VSL loans, and Medicare Levy variations all flow through the declaration into the code.<\/p>\n<p>Income type must be assigned at the employee level. For example, working holiday makers require a country code, closely held payees need the CHP flag, and labour hire staff use the LAH income type.<\/p>\n<p>Pay items, allowances, leave categories, and deductions must all be mapped to ATO reporting categories. The software then translates each pay run into a compliant Phase 2 payload automatically.<\/p>\n<h3>4. Running your first STP pay event<\/h3>\n<p>Before the first live pay event, most employers run a test submission. Therefore, the ATO provides a validation environment that checks data structure and business rules without updating production records.<\/p>\n<p>Once test lodgement succeeds, the first production pay run can be submitted. A payroll officer processes the weekly pay, reviews the draft file inside the software, and then lodges it through the SBR connection.<\/p>\n<p>The ATO response message must be reviewed immediately. As a result, any invalid TFNs, missing fields, or structural errors can be corrected through an Update Event before the next scheduled pay run.<\/p>\n<h2><strong>How Often Do You Report Payroll?<\/strong><\/h2>\n<p>The default rule is simple: STP reporting happens on or before every payday. Therefore, weekly payrolls lodge weekly, fortnightly payrolls lodge fortnightly, and monthly payrolls lodge monthly.<\/p>\n<p>The rule applies regardless of business size. A sole trader paying one casual employee weekly lodges a pay event every week, the same as a corporation paying 5,000 employees on the same cycle.<\/p>\n<p>Out-of-cycle payments require their own event. For example, a mid-month bonus, back-pay adjustment, or termination payment outside the regular run must be lodged on or before the day funds are transferred.<\/p>\n<p>Closely held payees have flexibility. Small employers can report these payments on each payday or quarterly, provided the quarterly estimate is reasonable and reconciled at year-end.<\/p>\n<p>Quarterly reporting is also available for micro employers in specific circumstances, generally accessed through a registered tax or BAS agent. The concession requires ATO approval rather than being automatic.<\/p>\n<p>Deferrals apply when an unavoidable disruption prevents lodgement. For example, a prolonged software outage or cyber incident supports a short-term deferral, but the employer must apply and document the cause.<\/p>\n<h2><strong>How Australian Businesses Across Industries Use STP<\/strong><\/h2>\n<p>STP applies universally, but industry conditions shape how it is implemented. Casual-heavy rosters, complex allowances, and seasonal workforces each create specific configurations and reporting priorities.<\/p>\n<h3>1. Retail and hospitality<\/h3>\n<p>Retail and hospitality employers run high-turnover rosters of casuals, part-timers, and penalty rates. STP configurations must handle rapidly changing headcount without delaying pay event lodgement.<\/p>\n<p>Over time, public holiday and weekend loadings must be split from ordinary time earnings. Sunday penalty rates sit within ordinary earnings, while genuine overtime reports under the dedicated overtime category.<\/p>\n<p>Rapid onboarding creates additional risk. For example, a new casual starting mid-week without a completed TFN declaration requires exemption codes, and missing that detail causes STP lodgement rejection.<\/p>\n<h3>2. Construction and trades<\/h3>\n<p>Construction payroll carries complex allowance structures dictated by enterprise agreements and awards. Therefore, tool, site, travel, meal, and inclement weather allowances must each map to a distinct STP category.<\/p>\n<p>Redundancy schemes such as Incolink produce specific reporting codes. Severance from industry funds is categorised differently from standard redundancy, affecting PAYG treatment and Lump Sum D eligibility.<\/p>\n<p>Closely held payees are common in family-run subcontracting businesses. As a result, directors drawing wages alongside non-family employees must be coded with the CHP income type to keep reporting accurately.<\/p>\n<h3>3. Healthcare and professional services<\/h3>\n<p>Healthcare employers navigate salary packaging, FBT exemptions for public and not-for-profit providers, and multi-role staff. STP configurations must handle several pay rates and allowances per employee.<\/p>\n<p>RESC and Reportable Fringe Benefits Amounts require precise reporting. For example, a nurse&#8217;s salary-packaging meal entertainment must see both figures reported through STP correctly.<\/p>\n<p>Professional services firms often engage contractors under voluntary withholding. The contractor is coded as a non-employee in payroll, with STP capturing PAYG withheld even where super is not payable.<\/p>\n<h3>4. Agriculture and seasonal workers<\/h3>\n<p>Agricultural employers deal with seasonal peaks, working holiday makers, and labour hire crews. Therefore, STP configurations must tag each worker type with the correct income category from the first pay event.<\/p>\n<p>Working holiday makers require country codes and the WHM tax scale. For example, a backpacker on a 417 visa must be registered with the ATO as a WHM employer, and PAYG withholds at standard rates.<\/p>\n<p>Seasonal Worker Programme participants have their own income type. As a result, growers using Pacific and Timor-Leste labour report these wages separately from permanent employees throughout the harvest.<\/p>\n<h2><strong>Common STP Mistakes to Avoid<\/strong><\/h2>\n<p>Even with reliable software, manual errors and process breakdowns cause most STP compliance issues. Understanding the common pitfalls helps payroll teams build controls that prevent expensive rework at year-end.<\/p>\n<p>The most frequent mistake is confusing allowances with reimbursements. Allowances are taxable and reportable, while reimbursements of substantiated expenses are generally not.<\/p>\n<p>For example, a car allowance is reported through STP, but a fuel reimbursement covering a supported receipt is not. Therefore, miscoding inflates gross income and distorts tax and Centrelink outcomes.<\/p>\n<p>Termination payments are another common source of error. For example, Lump Sum A, Lump Sum B, Lump Sum D, and Employment Termination Payments each carry distinct codes and PAYG treatments.<\/p>\n<p>Getting termination codes wrong often results in over- or under-withholding of tax. As a result, the employer either under-remits PAYG and carries the shortfall or withholds too much and triggers complaints.<\/p>\n<p>Missing the 14 July finalisation deadline is a frequent compliance failure. Therefore, employees cannot lodge annual returns, and the employer risks failure-to-lodge penalties issued by the ATO.<\/p>\n<p>Ignoring ATO response messages is a silent risk. For example, a pay event accepted with warnings may contain invalid TFNs that compound across the year, producing a major reconciliation problem in June.<\/p>\n<p>Failing to lodge Update Events promptly is equally damaging. For example, correcting an error within 14 days is straightforward, but leaving it for months creates layered discrepancies difficult to unwind.<\/p>\n<p>Incorrect Software ID registration also causes lodgement failures. Businesses switching payroll software must update the Software ID through Access Manager before the first pay event on the new system.<\/p>\n<h2><strong>STP Compliance Checklist for 2026<\/strong><\/h2>\n<p>A structured checklist converts STP compliance from a quarterly worry into routine operations. The items below cover essential controls that every Australian employer should verify during the 2026 financial year.<\/p>\n<p>First, confirm your payroll software is listed on the ATO Product Register and is running the latest Phase 2 update. For example, check for 2026 version releases supporting updated reporting categories.<\/p>\n<p>Second, audit every employee&#8217;s master record. As a result, missing TFNs, outdated addresses, incorrect tax treatment codes, and stale employment basis flags can be corrected before the next pay event.<\/p>\n<p>Third, verify the mapping of every pay item, allowance, leave type, and deduction to its ATO reporting category. Phase 2 compliance requires no bundled or miscategorised components anywhere in the pay model.<\/p>\n<p>Fourth, review recent ATO response messages across the last 12 months. For example, unresolved warnings or partial failures should be rectified through Update Events to prevent year-end reconciliation problems.<\/p>\n<p>Fifth, reconcile SG liability reported through STP with the super actually remitted through the clearing house. As a result, quarterly super deadlines align with STP figures rather than diverging over time.<\/p>\n<p>Sixth, diary the finalisation deadline of 14 July 2026. Therefore, the EOFY finalisation declaration is lodged on time, and employee Income Statements switch to &#8220;tax ready&#8221; in myGov without delay.<\/p>\n<p>Seventh, test your disaster recovery protocol. For example, confirm that payroll can be restored and STP lodged within 24 hours of a ransomware incident or major software outage.<\/p>\n<p>Eighth, confirm registered agents are linked correctly in Access Manager. As a result, your BAS agent or tax agent can lodge Update Events on your behalf without re-authentication delays.<\/p>\n<h2><strong>Best Practices for Managing STP in Your Business<\/strong><\/h2>\n<p>Consistent process discipline separates compliant employers from those scrambling at year-end. Adopting the following four practices keeps STP reporting accurate, timely, and audit-ready throughout the year.<\/p>\n<h3>1. Keep employee records accurate and up to date<\/h3>\n<p>Employee master data drives every STP submission. Onboarding checklists should confirm TFN declaration, residential address, employment basis, income type, and tax treatment code before the first pay run.<\/p>\n<p>Ongoing maintenance is equally important. For example, address changes, study loan status updates, and transitions from casual to permanent all require prompt master file updates to keep STP output accurate.<\/p>\n<h3>2. Report on or before each pay day without exception<\/h3>\n<p>Late STP events attract failure-to-lodge penalties from the ATO. Therefore, build payroll workflows that treat STP lodgement as a non-negotiable part of the pay run, not a separate follow-up task.<\/p>\n<p>Build a clear escalation process for lodgement issues. If the SBR gateway rejects a file, the payroll team should follow a documented 24-hour resolution path that includes vendor and ATO contacts.<\/p>\n<h3>3. Use payroll software to automate STP submissions<\/h3>\n<p>Manual STP handling scales badly as headcount grows. Therefore, a <a href=\"https:\/\/www.hashmicro.com\/au\/human-resource-management?medium=moneysite-banner\">fully integrated payroll<\/a> or ERP module that automates data mapping, lodgement, and reconciliation removes the bulk of human error risk.<\/p>\n<p>Integrated systems support continuous reconciliation. An ERP linking general ledger, payroll, and STP allows finance teams to reconcile wages, super, and PAYG on a pay-period basis rather than at year-end.<\/p>\n<h3>4. Review your EOFY finalisation before the 14 July deadline<\/h3>\n<p>Finalisation is the closing act of the STP year. Reconciliation should begin in early June to identify mismatches between payroll YTD figures, general ledger balances, and super clearing house records.<\/p>\n<p>Final checks protect against late surprises. Verifying RESC totals, lump sum categorisations, and termination payments before 14 July prevents tax return delays and unwanted ATO queries.<\/p>\n<h2><strong>Conclusion<\/strong><\/h2>\n<p>Single Touch Payroll sits at the centre of Australian payroll compliance. Therefore, every employer, from sole trader to enterprise, reports wages, PAYG, and super to the ATO in real time on every payday.<\/p>\n<p>The move to Phase 2 raised the technical bar, making accurate master data, precise pay item mapping, and disciplined lodgement core capabilities. As a result, the right software transforms STP from a burden to a strategic asset.<\/p>\n<p>Complying with single touch payroll can come with its own obstacles and difficulties. If this challenge concerns you too, you can request a <a href=\"https:\/\/www.hashmicro.com\/au\/free-product-tour\/?medium=free-product-tour\">free consultation<\/a> with us today, so we can assist you in this implementation.<\/p>\n<a href=\"https:\/\/www.hashmicro.com\/au\/human-resource-management?medium=moneysite-banner\" target=\"_blank\"><img decoding=\"async\" loading=\"lazy\" width=\"712\" src=\"https:\/\/www.hashmicro.com\/blog\/wp-content\/uploads\/2025\/06\/HRM.webp\" alt=\"HRM\"><\/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 does STP Phase 2 mean?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>STP Phase 2 is the expanded version of the reporting framework. It requires employers to disaggregate gross pay into specific categories such as overtime, allowances, paid leave, and bonuses, and embeds TFN declaration data inside each pay event.<\/p>\r\n        <\/div>\r\n    <\/div>\r\n    <div class=\"accordion-wrapper\">\r\n        <div class=\"header-faq\">\r\n            <button class=\"question\">When did STP Phase 2 start?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>STP Phase 2 officially began on 1 January 2022. Software providers and employers were granted transitional deferrals through 2022 and into 2023, but every Australian employer is now expected to report under Phase 2 rules.<\/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 STP mandatory for all employers in Australia?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>Yes. STP is mandatory for virtually every Australian employer, regardless of size, industry, or legal structure. The rules apply to companies, sole traders, partnerships, trusts, not-for-profits, and foreign employers with Australian-based staff.<\/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 happens if I don&#039;t comply with STP?<\/button>\r\n        <\/div>\r\n        <div class=\"answer\">\r\n            <p>Non-compliance can trigger ATO failure-to-lodge penalties, interest charges, and audit activity. Employees may also be unable to lodge annual tax returns if finalisation is missed, exposing the business to complaints and reputational damage.<\/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  \"@graph\": [\n    {\n      \"@type\": \"Article\",\n      \"headline\": \"Single Touch Payroll Explained: Complete STP Guide for Australian Businesses\",\n      \"description\": \"Single Touch Payroll (STP) explained for Australian businesses: Phase 2 rules, reporting categories, setup, deadlines, and compliance best practices for 2026.\",\n      \"datePublished\": \"2026-04-20\",\n      \"dateModified\": \"2026-04-20\",\n      \"author\": {\n        \"@type\": \"Organization\",\n        \"name\": \"HashMicro\"\n      },\n      \"publisher\": {\n        \"@type\": \"Organization\",\n        \"name\": \"HashMicro\",\n        \"logo\": {\n          \"@type\": \"ImageObject\",\n          \"url\": \"https:\/\/www.hashmicro.com\/wp-content\/uploads\/hashmicro-logo.png\"\n        }\n      },\n      \"mainEntityOfPage\": {\n        \"@type\": \"WebPage\",\n        \"@id\": \"https:\/\/www.hashmicro.com\/blog\/single-touch-payroll-australia\/\"\n      }\n    },\n    {\n      \"@type\": \"FAQPage\",\n      \"mainEntity\": [\n        {\n          \"@type\": \"Question\",\n          \"name\": \"What does STP Phase 2 mean?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"STP Phase 2 is the expanded version of the reporting framework. It requires employers to disaggregate gross pay into specific categories such as overtime, allowances, paid leave, and bonuses, and embeds TFN declaration data inside each pay event.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"When did STP Phase 2 start?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"STP Phase 2 officially began on 1 January 2022. Software providers and employers were granted transitional deferrals through 2022 and into 2023, but every Australian employer is now expected to report under Phase 2 rules.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Is STP mandatory for all employers in Australia?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Yes. STP is mandatory for virtually every Australian employer, regardless of size, industry, or legal structure. The rules apply to companies, sole traders, partnerships, trusts, not-for-profits, and foreign employers with Australian-based staff.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"What happens if I don't comply with STP?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Non-compliance can trigger ATO failure-to-lodge penalties, interest charges, and audit activity. Employees may also be unable to lodge annual tax returns if finalisation is missed, exposing the business to complaints and reputational damage.\"\n          }\n        }\n      ]\n    }\n  ]\n}\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Single Touch Payroll (STP) is the mandatory reporting framework that requires Australian employers to transmit wages, PAYG withholding, and superannuation data to the ATO through Standard Business Reporting-enabled payroll software. STP works by embedding statutory reporting inside the payroll process. Therefore, each pay run automatically generates a pay event file containing year-to-date figures, which the [&hellip;]<\/p>\n","protected":false},"author":49,"featured_media":2997,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"tdm_status":"","tdm_grid_status":"","footnotes":""},"categories":[54],"tags":[],"class_list":{"0":"post-2967","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-hrm"},"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.6 (Yoast SEO v26.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Single Touch Payroll Australia: How Companies Stay Compliant - HashMicro Australia<\/title>\n<meta name=\"description\" content=\"Single Touch Payroll (STP) explained: Phase 2 rules, reporting categories, setup, deadlines, and compliance best practices for 2026.\" \/>\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\/single-touch-payroll\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Single Touch Payroll Australia: How Companies Stay Compliant\" \/>\n<meta property=\"og:description\" content=\"Single Touch Payroll (STP) explained: Phase 2 rules, reporting categories, setup, deadlines, and compliance best practices for 2026.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/\" \/>\n<meta property=\"og:site_name\" content=\"HashMicro Australia\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-21T07:02:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-1.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Ainsley McKenzie\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ainsley McKenzie\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/\",\"url\":\"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/\",\"name\":\"Single Touch Payroll Australia: How Companies Stay Compliant - HashMicro Australia\",\"isPartOf\":{\"@id\":\"https:\/\/www.hashmicro.com\/au\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-1.webp\",\"datePublished\":\"2026-04-21T07:02:40+00:00\",\"author\":{\"@id\":\"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/ec5e092ab82fafbe8cf646ae81c8a4bc\"},\"description\":\"Single Touch Payroll (STP) explained: Phase 2 rules, reporting categories, setup, deadlines, and compliance best practices for 2026.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#primaryimage\",\"url\":\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-1.webp\",\"contentUrl\":\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-1.webp\",\"width\":800,\"height\":400,\"caption\":\"single-touch-payroll-hashmicro\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.hashmicro.com\/au\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Single Touch Payroll Australia: How Companies Stay Compliant\"}]},{\"@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\/ec5e092ab82fafbe8cf646ae81c8a4bc\",\"name\":\"Ainsley McKenzie\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Ainsley-McKenzie-WP-96x96.webp\",\"contentUrl\":\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Ainsley-McKenzie-WP-96x96.webp\",\"caption\":\"Ainsley McKenzie\"},\"description\":\"I write HR articles that show how HR actually runs day to day. My background in HR shapes how I explain payroll and statutory items, attendance and shift rules, onboarding, performance reviews, and employee documentation in a way that feels practical for managers and HR teams.\",\"url\":\"https:\/\/www.hashmicro.com\/au\/blog\/author\/ainsley-mckenzie\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Single Touch Payroll Australia: How Companies Stay Compliant - HashMicro Australia","description":"Single Touch Payroll (STP) explained: Phase 2 rules, reporting categories, setup, deadlines, and compliance best practices for 2026.","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\/single-touch-payroll\/","og_locale":"en_US","og_type":"article","og_title":"Single Touch Payroll Australia: How Companies Stay Compliant","og_description":"Single Touch Payroll (STP) explained: Phase 2 rules, reporting categories, setup, deadlines, and compliance best practices for 2026.","og_url":"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/","og_site_name":"HashMicro Australia","article_published_time":"2026-04-21T07:02:40+00:00","og_image":[{"width":800,"height":400,"url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-1.webp","type":"image\/webp"}],"author":"Ainsley McKenzie","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ainsley McKenzie","Est. reading time":"21 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/","url":"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/","name":"Single Touch Payroll Australia: How Companies Stay Compliant - HashMicro Australia","isPartOf":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#primaryimage"},"image":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-1.webp","datePublished":"2026-04-21T07:02:40+00:00","author":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/ec5e092ab82fafbe8cf646ae81c8a4bc"},"description":"Single Touch Payroll (STP) explained: Phase 2 rules, reporting categories, setup, deadlines, and compliance best practices for 2026.","breadcrumb":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#primaryimage","url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-1.webp","contentUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/04\/moneymoney-1.webp","width":800,"height":400,"caption":"single-touch-payroll-hashmicro"},{"@type":"BreadcrumbList","@id":"https:\/\/www.hashmicro.com\/au\/blog\/single-touch-payroll\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.hashmicro.com\/au\/blog\/"},{"@type":"ListItem","position":2,"name":"Single Touch Payroll Australia: How Companies Stay Compliant"}]},{"@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\/ec5e092ab82fafbe8cf646ae81c8a4bc","name":"Ainsley McKenzie","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Ainsley-McKenzie-WP-96x96.webp","contentUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Ainsley-McKenzie-WP-96x96.webp","caption":"Ainsley McKenzie"},"description":"I write HR articles that show how HR actually runs day to day. My background in HR shapes how I explain payroll and statutory items, attendance and shift rules, onboarding, performance reviews, and employee documentation in a way that feels practical for managers and HR teams.","url":"https:\/\/www.hashmicro.com\/au\/blog\/author\/ainsley-mckenzie\/"}]}},"_links":{"self":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/2967","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\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/comments?post=2967"}],"version-history":[{"count":2,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/2967\/revisions"}],"predecessor-version":[{"id":3017,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/2967\/revisions\/3017"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/media\/2997"}],"wp:attachment":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/media?parent=2967"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/categories?post=2967"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/tags?post=2967"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}