Logo
Open menu

Choose the package that’s best for your business or we’ll create a system just for you

Essential

from

£45 /m*

For small businesses based in one location and with four users

  • 4 users
  • 1 location
  • 500 assets

Extra

from

£ 125 /m *

For SMEs with up-to two locations, multiple users and products

  • 10 users
  • 2 locations
  • 2000 assets

Everything

from

£ 300 /m *

Complete package for productivity across multiple uses and locations

  • 20 users
  • 3 locations
  • 6000 assets

Bespoke

Ultimate customisation, collaboration and support for super-users

  • Tailored to meet your exact needs
  • Full system support
  • Ongoing upgrades & development
  • Personal account manager
  • Everything the way you want it

*Plus UK VAT where applicable. All prices are charged monthly, with a minimum 12 month term. Discounts are provided for both education and charity use.

window.addEventListener(‘load’, () =>{ const queryString = window.location.search; if(queryString.includes(‘asset’)){ console.log(‘clicking’); document.getElementById(‘asset_button’).click(); } else {console.log(‘not clicking’, queryString);}}) let asset_count = document.getElementById(“asset_count”); let asset_display = document.getElementsByClassName(“asset_display”); let cost_display = document.getElementsByClassName(“price-display”); let caredInputs = document.querySelectorAll(‘[data-multiplier]’); let featuresButton = document.getElementsByClassName(“features”); const setFeaturesButton = (link = ‘/features’) => { for(let button of featuresButton){ button.firstChild.setAttribute(‘href’, link); } } const calculate = ()=>{ let total = 0; let multiplier = 1; for(let input of caredInputs){ switch(input.tagName){ case “BUTTON”: if(!input.classList.contains(“active”)) continue; setFeaturesButton(input.getAttribute(‘data-features’)); multiplier += parseFloat(input.getAttribute(“data-multiplier”)); break; case “INPUT”: let value = input.value; let min = input.getAttribute(‘min’); multiplier += (value-min) * parseFloat(input.getAttribute(“data-multiplier”)); break; default: console.log(“Unknown how to handle ” + input.tagName, input); } } for(let cost of cost_display){ let base = parseFloat(cost.getAttribute(“data-base”)); cost.innerHTML = parseFloat(base * multiplier).toFixed(0).toString().replace(/\B(?=(\d{3})+(?!\d))/g, “,”) + ‘.00’; } } /* let expanders = document.getElementsByClassName(“expands”); for(let expander of expanders){ expander.addEventListener(‘click’, ({currentTarget}) => { let parent = currentTarget; if(parent.classList.contains(‘expand’)){ parent.classList.remove(‘expand’); } else { parent.classList.add(‘expand’); } }); }*/ let switches = document.getElementsByClassName(“toggle-switch”); const handleSwitch = (event) =>{ let toggle = event.currentTarget.parentNode; let curButton = event.currentTarget; if(curButton.tagName != ‘BUTTON’) return; let buttons = toggle.getElementsByTagName(“button”); for(let button of buttons){ button.classList.remove(‘active’); } curButton.classList.add(‘active’); calculate(); } const handleRange = ({target}) =>{ for(let display of asset_display){ display.innerHTML = parseFloat(target.value).toFixed(0).toString().replace(/\B(?=(\d{3})+(?!\d))/g, “,”); } calculate(); } asset_count.addEventListener(‘input’, handleRange); for(let toggle of switches){ let buttons = toggle.getElementsByTagName(‘button’); for(let button of buttons){ button.addEventListener(‘click’, handleSwitch) } } calculate();