{"product_id":"workset-guardian","title":"Workset Guardian","description":"\u003ch3\u003eTake control of workset discipline in Revit\u003c\/h3\u003e\n\u003cp\u003eWorkset Guardian helps keep shared Revit models clean, compliant and organised by enforcing workset rules automatically. Instead of wasting hours fixing misplaced elements before deadlines, your team can rely on Workset Guardian to monitor, flag and correct issues as they happen.\u003c\/p\u003e\n\u003cp\u003eBuilt for BIM Managers, Digital Engineering teams and Revit users working in structured collaborative environments, Workset Guardian supports better model health, stronger BEP compliance and more consistent project standards.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\n\u003ch3\u003eCalculate your return\u003c\/h3\u003e\n\u003cp\u003eEnter your team's current workload to estimate how quickly Workset Guardian pays for itself.\u003c\/p\u003e\n\n\u003cstyle\u003e\n  .wsg-roi { box-sizing:border-box; width:100%; margin:16px 0 24px; border:1px solid #e5e5e5; background:#fff; font-size:15px; line-height:1.45; color:inherit; }\n  .wsg-roi *, .wsg-roi *::before, .wsg-roi *::after { box-sizing:border-box; }\n  .wsg-roi__grid { display:grid; grid-template-columns:1fr 1fr; }\n  @media (max-width:600px) { .wsg-roi__grid { grid-template-columns:1fr; } }\n  .wsg-roi__col { padding:22px 26px; }\n  .wsg-roi__col--inputs { border-right:1px solid #e5e5e5; }\n  @media (max-width:600px) { .wsg-roi__col--inputs { border-right:none; border-bottom:1px solid #e5e5e5; } }\n  .wsg-roi__col--results { background:#fafafa; }\n  .wsg-roi__caption { font-size:11px; letter-spacing:0.14em; text-transform:uppercase; color:#888; font-weight:600; margin:0 0 12px; }\n  .wsg-roi__field { display:flex; justify-content:space-between; align-items:center; gap:12px; padding:8px 0; border-bottom:1px solid #f0f0f0; }\n  .wsg-roi__field:last-child { border-bottom:none; }\n  .wsg-roi__label { font-size:14px; color:#333; flex:1; margin:0; line-height:1.35; }\n  .wsg-roi__input-wrap { position:relative; flex-shrink:0; }\n  .wsg-roi__prefix { position:absolute; left:9px; top:50%; transform:translateY(-50%); font-size:13px; color:#888; pointer-events:none; }\n  .wsg-roi__input { width:110px; padding:7px 10px; font-family:inherit; font-size:14px; color:inherit; background:#fff; border:1px solid #d0d0d0; border-radius:2px; outline:none; text-align:right; transition:border-color 120ms ease; -moz-appearance:textfield; }\n  .wsg-roi__input--currency { padding-left:22px; }\n  .wsg-roi__input::-webkit-outer-spin-button, .wsg-roi__input::-webkit-inner-spin-button { -webkit-appearance:none; margin:0; }\n  .wsg-roi__input:focus { border-color:#000; }\n  .wsg-roi__hero-label { font-size:11px; letter-spacing:0.14em; text-transform:uppercase; color:#888; font-weight:600; margin:0 0 6px; }\n  .wsg-roi__hero-value { font-size:42px; font-weight:700; line-height:1.05; margin:0 0 6px; color:inherit; }\n  .wsg-roi__hero-value small { font-size:18px; font-weight:500; color:#666; margin-left:5px; }\n  .wsg-roi__hero-note { font-size:12.5px; color:#777; margin:0 0 16px; line-height:1.45; }\n  .wsg-roi__rows { border-top:1px solid #e5e5e5; padding-top:12px; }\n  .wsg-roi__row { display:flex; justify-content:space-between; align-items:baseline; padding:4px 0; font-size:14px; }\n  .wsg-roi__row-label { color:#666; }\n  .wsg-roi__row-value { font-weight:600; color:inherit; font-variant-numeric:tabular-nums; }\n  .wsg-roi__row-value--good { color:#1f7a3d; }\n  .wsg-roi__row-value--warn { color:#b0421a; }\n  .wsg-roi__foot { padding:10px 26px; border-top:1px solid #e5e5e5; background:#fafafa; font-size:11.5px; color:#888; line-height:1.45; }\n  .wsg-roi__foot strong { color:#555; font-weight:600; }\n  .wsg-roi__warn { display:none; margin-top:10px; padding:8px 10px; background:#fdf3ee; border-left:2px solid #b0421a; font-size:12px; color:#6b2c10; line-height:1.45; }\n  .wsg-roi__warn.is-visible { display:block; }\n  .wsg-roi ul, .wsg-roi li { list-style:none; margin:0; padding:0; }\n  .wsg-twocol { display:grid; grid-template-columns:1fr 1fr; gap:32px; margin:16px 0 24px; }\n  @media (max-width:600px) { .wsg-twocol { grid-template-columns:1fr; gap:0; } }\n  .wsg-twocol h3 { margin-top:0; }\n\u003c\/style\u003e\n\n\u003csection class=\"wsg-roi\" aria-label=\"Workset Guardian ROI Calculator\"\u003e\n  \u003cdiv class=\"wsg-roi__grid\"\u003e\n    \u003cdiv class=\"wsg-roi__col wsg-roi__col--inputs\"\u003e\n      \u003cp class=\"wsg-roi__caption\"\u003eYour team\u003c\/p\u003e\n      \u003cdiv class=\"wsg-roi__field\"\u003e\n        \u003clabel class=\"wsg-roi__label\" for=\"wsgTeam\"\u003eRevit users\u003c\/label\u003e\n        \u003cdiv class=\"wsg-roi__input-wrap\"\u003e\u003cinput class=\"wsg-roi__input\" type=\"number\" id=\"wsgTeam\" min=\"1\" step=\"1\" value=\"5\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"wsg-roi__field\"\u003e\n        \u003clabel class=\"wsg-roi__label\" for=\"wsgRate\"\u003eHourly rate\u003c\/label\u003e\n        \u003cdiv class=\"wsg-roi__input-wrap\"\u003e\n\u003cspan class=\"wsg-roi__prefix\"\u003eR\u003c\/span\u003e\u003cinput class=\"wsg-roi__input wsg-roi__input--currency\" type=\"number\" id=\"wsgRate\" min=\"0\" step=\"50\" value=\"650\"\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cp class=\"wsg-roi__caption\" style=\"margin-top:18px;\"\u003eTime currently spent, per user\u003c\/p\u003e\n      \u003cdiv class=\"wsg-roi__field\"\u003e\n        \u003clabel class=\"wsg-roi__label\" for=\"wsgFix\"\u003eFixing misplaced elements (hrs\/week)\u003c\/label\u003e\n        \u003cdiv class=\"wsg-roi__input-wrap\"\u003e\u003cinput class=\"wsg-roi__input\" type=\"number\" id=\"wsgFix\" min=\"0\" step=\"0.5\" value=\"2\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"wsg-roi__field\"\u003e\n        \u003clabel class=\"wsg-roi__label\" for=\"wsgMilestone\"\u003ePre-milestone cleanup (hrs\/month)\u003c\/label\u003e\n        \u003cdiv class=\"wsg-roi__input-wrap\"\u003e\u003cinput class=\"wsg-roi__input\" type=\"number\" id=\"wsgMilestone\" min=\"0\" step=\"0.5\" value=\"4\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"wsg-roi__field\"\u003e\n        \u003clabel class=\"wsg-roi__label\" for=\"wsgReports\"\u003eCompliance reporting (hrs\/month)\u003c\/label\u003e\n        \u003cdiv class=\"wsg-roi__input-wrap\"\u003e\u003cinput class=\"wsg-roi__input\" type=\"number\" id=\"wsgReports\" min=\"0\" step=\"0.5\" value=\"2\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"wsg-roi__col wsg-roi__col--results\" aria-live=\"polite\"\u003e\n      \u003cp class=\"wsg-roi__hero-label\"\u003ePayback in\u003c\/p\u003e\n      \u003cp class=\"wsg-roi__hero-value\" id=\"wsgPayback\"\u003e— \u003csmall\u003eweeks\u003c\/small\u003e\u003c\/p\u003e\n      \u003cp class=\"wsg-roi__hero-note\" id=\"wsgPaybackNote\"\u003eTime until savings cover the licence cost.\u003c\/p\u003e\n      \u003cdiv class=\"wsg-roi__rows\"\u003e\n        \u003cdiv class=\"wsg-roi__row\"\u003e\n\u003cspan class=\"wsg-roi__row-label\"\u003eAnnual licence cost\u003c\/span\u003e\u003cspan class=\"wsg-roi__row-value\" id=\"wsgCost\"\u003eR0\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"wsg-roi__row\"\u003e\n\u003cspan class=\"wsg-roi__row-label\"\u003eHours saved \/ year\u003c\/span\u003e\u003cspan class=\"wsg-roi__row-value\" id=\"wsgHours\"\u003e0\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"wsg-roi__row\"\u003e\n\u003cspan class=\"wsg-roi__row-label\"\u003eAnnual time savings\u003c\/span\u003e\u003cspan class=\"wsg-roi__row-value\" id=\"wsgSavings\"\u003eR0\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"wsg-roi__row\"\u003e\n\u003cspan class=\"wsg-roi__row-label\"\u003eNet benefit (year 1)\u003c\/span\u003e\u003cspan class=\"wsg-roi__row-value wsg-roi__row-value--good\" id=\"wsgNet\"\u003eR0\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"wsg-roi__row\"\u003e\n\u003cspan class=\"wsg-roi__row-label\"\u003eFirst-year ROI\u003c\/span\u003e\u003cspan class=\"wsg-roi__row-value wsg-roi__row-value--good\" id=\"wsgRoi\"\u003e0%\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"wsg-roi__warn\" id=\"wsgWarn\"\u003eThese inputs do not produce payback within year one. Adjust to reflect actual workload.\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"wsg-roi__foot\"\u003e\n\u003cstrong\u003eAssumptions:\u003c\/strong\u003e 48 working weeks and 12 months per year. Licence priced at R1,995 per user per year (current promotional rate). Figures are indicative.\u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003ch3\u003eKey Features\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eReal-time workset enforcement\u003c\/strong\u003e\u003cbr\u003eMonitor the model live and flag or automatically reassign elements placed on the wrong workset according to rules you define.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eFlexible rule management\u003c\/strong\u003e\u003cbr\u003eCreate, edit and organise rules through an easy-to-use interface without scripting. Rules can be based on category, level, parameter values, instance or type scope, and more.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eBulk Reassign\u003c\/strong\u003e\u003cbr\u003eClean up existing non-compliant models in one pass and bring projects back into line quickly.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eWorkset Manager\u003c\/strong\u003e\u003cbr\u003eCreate, merge and delete worksets safely, including moving elements between them where needed.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eCompliance reports and violation logs\u003c\/strong\u003e\u003cbr\u003eGenerate exportable reports showing rule violations, actions taken and user activity for improved accountability and BEP evidence.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eTemplate import and export\u003c\/strong\u003e\u003cbr\u003eShare standardised rule sets across projects and offices using JSON, with a sample template included to help you get started faster.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eInstant user feedback\u003c\/strong\u003e\u003cbr\u003eNon-intrusive notifications alert modellers when elements are assigned incorrectly, helping reinforce good habits in real time.\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003cdiv class=\"wsg-twocol\"\u003e\n  \u003cdiv\u003e\n    \u003ch3\u003eWhy teams use Workset Guardian\u003c\/h3\u003e\n    \u003cul\u003e\n      \u003cli\u003eReduce manual cleanup before milestones\u003c\/li\u003e\n      \u003cli\u003eImprove workset consistency across shared models\u003c\/li\u003e\n      \u003cli\u003eSupport BEP and ISO 19650-driven workflows\u003c\/li\u003e\n      \u003cli\u003eStrengthen team accountability\u003c\/li\u003e\n      \u003cli\u003eProtect model performance and structure\u003c\/li\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n  \u003cdiv\u003e\n    \u003ch3\u003eIdeal For\u003c\/h3\u003e\n    \u003cul\u003e\n      \u003cli\u003eBIM Managers\u003c\/li\u003e\n      \u003cli\u003eDigital Engineering Leads\u003c\/li\u003e\n      \u003cli\u003eRevit Coordinators\u003c\/li\u003e\n      \u003cli\u003eArchitecture, engineering and multidisciplinary teams working on collaborative BIM projects\u003c\/li\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eYour BEP, enforced automatically.\u003c\/strong\u003e\u003c\/p\u003e\n\n\u003cscript\u003e\n(function () {\n  var PRICE_PER_USER = 1995;\n  var WORK_WEEKS = 48;\n  var MONTHS = 12;\n  var fmtR = new Intl.NumberFormat('en-ZA', { style:'currency', currency:'ZAR', maximumFractionDigits:0 });\n  var fmtN = new Intl.NumberFormat('en-ZA', { maximumFractionDigits:0 });\n  var ids = ['wsgTeam','wsgRate','wsgFix','wsgMilestone','wsgReports'];\n  var inputs = {};\n  ids.forEach(function (id) { inputs[id] = document.getElementById(id); });\n  var out = {\n    payback: document.getElementById('wsgPayback'),\n    paybackNote: document.getElementById('wsgPaybackNote'),\n    cost: document.getElementById('wsgCost'),\n    hours: document.getElementById('wsgHours'),\n    savings: document.getElementById('wsgSavings'),\n    net: document.getElementById('wsgNet'),\n    roi: document.getElementById('wsgRoi'),\n    warn: document.getElementById('wsgWarn')\n  };\n  function num(el, min) {\n    var v = parseFloat(el.value);\n    if (isNaN(v) || v \u003c (min || 0)) return (min || 0);\n    return v;\n  }\n  function calc() {\n    var team = Math.max(1, Math.floor(num(inputs.wsgTeam, 1)));\n    var rate = num(inputs.wsgRate, 0);\n    var fixWk = num(inputs.wsgFix, 0);\n    var milMo = num(inputs.wsgMilestone, 0);\n    var repMo = num(inputs.wsgReports, 0);\n    var hoursPerUser = (fixWk * WORK_WEEKS) + (milMo * MONTHS) + (repMo * MONTHS);\n    var totalHours = hoursPerUser * team;\n    var annualSavings = totalHours * rate;\n    var annualCost = PRICE_PER_USER * team;\n    var netBenefit = annualSavings - annualCost;\n    var roiPct = annualCost \u003e 0 ? (netBenefit \/ annualCost) * 100 : 0;\n    out.cost.textContent = fmtR.format(annualCost);\n    out.hours.textContent = fmtN.format(Math.round(totalHours));\n    out.savings.textContent = fmtR.format(annualSavings);\n    out.net.textContent = fmtR.format(netBenefit);\n    out.net.className = 'wsg-roi__row-value ' + (netBenefit \u003e= 0 ? 'wsg-roi__row-value--good' : 'wsg-roi__row-value--warn');\n    out.roi.textContent = (roiPct \u003e= 0 ? '+' : '') + fmtN.format(Math.round(roiPct)) + '%';\n    out.roi.className = 'wsg-roi__row-value ' + (roiPct \u003e= 0 ? 'wsg-roi__row-value--good' : 'wsg-roi__row-value--warn');\n    if (annualSavings \u003c= 0) {\n      out.payback.innerHTML = '\u0026mdash; \u003csmall\u003eweeks\u003c\/small\u003e';\n      out.paybackNote.textContent = 'Enter your team\\u2019s current hours to calculate payback.';\n      out.warn.classList.remove('is-visible');\n    } else if (annualSavings \u003c annualCost) {\n      var yrs = annualCost \/ annualSavings;\n      out.payback.innerHTML = yrs.toFixed(1) + ' \u003csmall\u003eyears\u003c\/small\u003e';\n      out.paybackNote.textContent = 'Savings do not cover the first-year licence fee.';\n      out.warn.classList.add('is-visible');\n    } else {\n      var paybackWeeks = (annualCost \/ annualSavings) * WORK_WEEKS;\n      out.warn.classList.remove('is-visible');\n      if (paybackWeeks \u003c 1) {\n        out.payback.innerHTML = '\u0026lt; 1 \u003csmall\u003eweek\u003c\/small\u003e';\n        out.paybackNote.textContent = 'The licence pays for itself almost immediately.';\n      } else if (paybackWeeks \u003c= 13) {\n        out.payback.innerHTML = paybackWeeks.toFixed(1) + ' \u003csmall\u003eweeks\u003c\/small\u003e';\n        out.paybackNote.textContent = 'Time until the licence pays for itself.';\n      } else {\n        var months = (annualCost \/ annualSavings) * MONTHS;\n        out.payback.innerHTML = months.toFixed(1) + ' \u003csmall\u003emonths\u003c\/small\u003e';\n        out.paybackNote.textContent = 'Time until the licence pays for itself.';\n      }\n    }\n  }\n  ids.forEach(function (id) {\n    inputs[id].addEventListener('input', calc);\n    inputs[id].addEventListener('change', calc);\n  });\n  calc();\n})();\n\u003c\/script\u003e","brand":"Modena Technologies","offers":[{"title":"Default Title","offer_id":47523004580076,"sku":null,"price":1995.0,"currency_code":"ZAR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0720\/6587\/6204\/files\/WorksetGuardian.png?v=1776081627","url":"https:\/\/modena.global\/products\/workset-guardian","provider":"Modena Technologies","version":"1.0","type":"link"}