Skip to main content
Switch Language
  • Software

PureSafety®

UL Solutions offers PureSafety powered by LearnShare to help empower employers to manage health, safety and risks more efficiently and effectively with industry-leading EHS and LMS software and expertise.

Worker driving a forklift

Help promote a safer workplace with PureSafety powered by LearnShare, a learning management system customized for safety professionals

We can help you mitigate operational risks, identify opportunities for safety improvements and uncover safety trends through our online catalog of environmental, health and safety (EHS) courses.

 

Created and maintained by certified EHS advisers and industry experts and available in multiple languages, these courses feature engaging content that will resonate with your employees, reinforce best safety practices and help your employees transfer those practices to the workplace practically and safely.

Whether you need a solution you can adapt to meet your exact requirements or a preconfigured package to support the beginning of your safety training journey, PureSafety provides a modern learning experience to help you start achieving your EHS training objectives today.

PureSafety powered by LearnShare

Safety training is about more than meeting regulatory requirements — it’s about keeping your people safe and preventing as many incidents as possible.

PureSafety powered by LearnShare, coupled with our award-winning safety training library, can help you mitigate operational risks, identify opportunities for safety improvements and uncover trends in safety performance.

Watch the video 

Build a better workplace safety training program with PureSafety powered by LearnShare.

Using EHS management software to keep public credibility and regulatory compliance

Since 1894, UL Solutions has led the safety science industry, working toward a safer, more secure and sustainable world. Creating a rich online catalog that provides hundreds of environmental, health and safety (EHS) courses in multiple languages on relevant topics helps us fulfill that mission. Created and maintained by certified EHS advisers and industry experts, these courses feature engaging content that resonates with your employees’ experiences, reinforces best safety practices and helps transfer those practices into the workplace. 

Adapt our EHS content to meet the specific needs of your workplace, people or company requirements. Our SCORM- and AICC-conformant content facilitates easy integration into most learning management systems. Our EHS Learning Solutions team can customize our existing courses or develop new ones to meet your unique learning needs. Our EHS modules feature courses optimized for computers and tablets, with an average length of 20 minutes or less — ideal for helping you accelerate learning in your ever-changing workplace.

With PureSafety, you benefit from:

  • A fast and simple setup
  • A modern learning experience, including video and live or virtual instruction
  • Traditional learning modalities such as Sharable Content Object Reference Model (SCORM), assessments and read-and-sign
  • A mobile-friendly LMS that runs on virtually any device
  • Interactive dashboards, reports, manager tools and automated notifications
  • Rapid implementation
  • Safety library courses ready to use right off the shelf, or you can modify them and add your own courses and third-party content to your library
  • Our QR code feature, which allows you to provide job aids and safety tips to people on the job
  • The ability to award portable digital badges for safety training completion
  • Easy integration with other systems, such as HR and document management systems and business intelligence tools

Get connected with our team

Deploy PureSafety directly out of the box or customize its configuration to meet your specific needs. Whether you know exactly what you’re looking for or you need a preconfigured package to help you start your safety training journey, PureSafety can meet your requirements. Find out how PureSafety can benefit your business.

Stay on top of your organization’s safety standing with PureSafety

PureSafety’s dashboards show your organization’s history of completing assignments on time and its current standing in terms of meeting required training deadlines. Its interactive features let you quickly uncover the root causes of problems or successes. For example, while comparing multiple facilities, you might discover that a specific plant has an excessive amount of overdue training. Filtering down to that plant, you might be able to isolate the problem to people in a specific department. Or, by viewing a trend chart, you might notice that performance has slipped in recent months after a long history of meeting training deadlines on time. You can export the charts and graphs in your dashboard into PDF, Excel and PowerPoint formats to support presentations and provide easy access to information that can help you improve safety.

How can you make the most of our extensive video content?

Today’s world offers informative videos everywhere — on your company’s network, on YouTube and even on people’s mobile devices. With PureSafety, you and your people can learn to maximize effectiveness in new ways. Rely on PureSafety to help you:

  • Upload videos and turn them into assignable learning resources.
  • Automatically transcribe, closed-caption and translate into multiple languages to make videos useful to people from a variety of backgrounds.
  • Provide searchable transcripts to let users quickly find the content they need. For example, if you offer an hour-long video from your recent safety workshop, users can easily jump ahead to the part that demonstrates ladder safety.
  • Link videos from YouTube, Vimeo and other sources and assign them to learners, along with completion tracking.
  • Offer your employees a high-performance video streaming experience — no matter where they are — with PureSafety’s international content delivery network (CDN).

For employees who require OSHA 10- and 30-hour training, PureSafety is one of the few OSHA- authorized online training providers in the market.

If you consider more than just compliance when developing your training, contact us to find out how PureSafety powered by LearnShare can help you keep employees safe, maximize learning opportunities and optimize day-to-day performance.

Download
Online

Online safety courses flyer (EHS)

99.15 KB
2022

2022 PureSafety Brochure

7.78 MB
X

Get connected with our team

Deploy PureSafety directly out of the box or customize its configuration to meet your specific needs. Whether you know exactly what you’re looking for or you need a preconfigured package to help you start your safety training journey, PureSafety can meet your requirements. Find out how PureSafety can benefit your business.

Please wait…
'; let submitButton = $('form.mktoForm .mktoButtonWrap .mktoButton'); submitButton.prop("disabled", true); submitButton.append(loadingHTML); // Ocp-Apim-Subscription-Key: '***'. var $ocpKey = drupalSettings.ul_marketo_validate_key; var $ocpUrl = drupalSettings.ul_marketo_validate_url; var $ocpEnv = drupalSettings.ul_marketo_validate_env; if (submitCount > 1 || isResponseSuccess == true) { isResponseHandled = true; form.submittable(true); if (paramsDebug.debug == 1) { console.log("NO.10 submitCount > 1: form.submit() "); } submitButton.click(); } else { var email = form.vals().Email; var phone = (form.vals().Phone) ? (form.vals().Phone) : '18472728800'; var country = (form.vals().Country) ? (form.vals().Country) : 'United States'; var countryCode = (phone == '18472728800') ? 'US' : getCountryCode(country); var $emailMsg = drupalSettings.ul_marketo_validate.email; var $phoneMsg = drupalSettings.ul_marketo_validate.phone; if (paramsDebug.debug == 1) { console.log("paramsDebug:"); console.log(paramsDebug); } sendingData = JSON.stringify({ 'Input_Email': email, 'Input_Phone': phone, 'Input_ISO2_Country_Code': countryCode }); if (paramsDebug.debug == 1) { console.log('URL, debug missing button:'); console.log($ocpUrl); console.log("Sending Data to API service (ajax):"); console.log(sendingData); } // API call for validate email/phone/country. var sendDate = (new Date()).getTime(); var responseTimeMs = sendDate; // Start a timer to handle a 3-second response timeout setTimeout(function() { if (!isResponseHandled) { isResponseHandled = true; // Handle the assumed "success" due to timeout here if (paramsDebug.debug == 1) { console.log('No response within timeout, proceeding with default validation success.'); } $('#ValidMsgEmail').remove(); $('#ValidMsgPhone').remove(); // set form to be submittable here $('#valSpinner').remove(); submitButton.prop("disabled", false); // Setup status as Timeout instead of Unknown. emailAddressStatus = "Timeout"; phoneNumberStatus = "Timeout"; phoneNumberValidated = "Timeout"; form.vals({ "emailAddressStatus": emailAddressStatus, "phoneNumberStatus": phoneNumberStatus, "phoneNumberValidated": phoneNumberValidated, }); form.submittable(true); isResponseSuccess = true; if (paramsDebug.debug == 1) { let receiveDate = (new Date()).getTime(); responseTimeMs = (receiveDate - sendDate) / 1000; console.log("setTimeout: " + responseTimeMs + " seconds."); } submitButton.click(); } }, paramsDebug.timeout * 1000); //END setTimeout $.ajax({ url: $ocpUrl, type: 'POST', data: sendingData, headers: { 'Content-Type': 'application/json', 'Ocp-Apim-Subscription-Key': $ocpKey, }, success: function (response) { $('#valSpinner').remove(); submitButton.prop("disabled", false); phoneNumberValidated = response.Validated_Phone_Number; if (!isResponseHandled) { isResponseHandled = true; // **** Handle the validation response if (paramsDebug.debug == 1) { console.log("API Response Data: "); console.log(response); } var emailCode = response.Email_Validation_Status_Number; var phoneCode = response.Phone_Validation_Status_Number; // Add values into two status fields. if (emailValidCode.hasOwnProperty(emailCode)) { emailAddressStatus = emailValidCode[emailCode]; } else { // API error code doesn't exist, set defaul. emailAddressStatus = emailValidCode['300']; } if (phoneValidCode.hasOwnProperty(phoneCode)) { phoneNumberStatus = phoneValidCode[phoneCode]; } else { // API error code doesn't exist, set defaul. phoneNumberStatus = phoneValidCode['301']; } if (emailAddressStatus.indexOf("email_not") != -1) { emailAddressStatus = 'Invalid'; } else if(emailAddressStatus == 'valid') { emailAddressStatus = 'Valid'; } if (phoneNumberStatus.indexOf('invalid_') != -1) { phoneNumberStatus = 'Invalid'; } else if(phoneNumberStatus == 'valid') { phoneNumberStatus = 'Valid'; } if (paramsDebug.debug == 1) { console.log('form.emailAddressStatus ' + emailAddressStatus); console.log('form.phoneNumberStatus ' + phoneNumberStatus); console.log('form.phoneNumberValidated ' + phoneNumberValidated); } if (validEmailCode.includes(emailCode) && validPhoneCode.includes(phoneCode)) { // Remove the loading spinner. $('#ValidMsgEmail').remove(); $('#ValidMsgPhone').remove(); $('#valSpinner').remove(); submitButton.prop("disabled", false); if (paramsDebug.debug == 1) { console.log("NO.1.1 VALID OK submitCount = " + submitCount); } isResponseSuccess = true; form.vals({ "emailAddressStatus": emailAddressStatus, "phoneNumberStatus": phoneNumberStatus, "phoneNumberValidated": phoneNumberValidated, }); form.submittable(true); submitButton.click(); } // API valid code is not "valid". else { form.submittable(false); if (paramsDebug.debug == 1) { console.log("NO.1.2 Submittable false : count= " + submitCount + " validateOrigin " + validateOrigin + " isResponseSuccess " + isResponseSuccess ); } // Set the invalid message in language translation. var msgEmailStatus = ""; if (!validEmailCode.includes(emailCode)) { if (emailCode == '300' || emailCode == '400') { msgEmailStatus = $emailMsg.email_not_valid; } else if (emailCode == '310' || emailCode == '500' ) { msgEmailStatus = $emailMsg.email_not_accept; } else { msgEmailStatus = "Unknown"; } if (paramsDebug.debug == 1) { console.log("NOT validEmailCode: " + msgEmailStatus); } errEmail = ''; $('#Email').after(errEmail); form.submittable(false); } // Set the invalid message in language translation. var msgPhoneStatus = "" if (!validPhoneCode.includes(phoneCode)) { msgPhoneStatus = $phoneMsg[phoneValidCode[phoneCode]]; if (paramsDebug.debug == 1) { console.log("NOT validPhoneCode: " + msgPhoneStatus); } errPhone = ''; $('#Phone').after(errPhone); form.submittable(false); } if (paramsDebug.debug == 1) { console.log(msgEmailStatus); console.log(msgPhoneStatus); } // Remove the loading spinner. $('#valSpinner').remove(); submitButton.prop("disabled", false); if (paramsDebug.debug == 1) { console.log("NO.1.6 Submittable false, count= " + submitCount); } form.vals({ "emailAddressStatus": emailAddressStatus, "phoneNumberStatus": phoneNumberStatus, "phoneNumberValidated": phoneNumberValidated, }); // 2nd API call and subit form. if (submitCount >= 1) { $('#ValidMsgEmail').remove(); $('#ValidMsgPhone').remove(); isResponseSuccess = true; form.submittable(true); if (paramsDebug.debug == 1) { console.log("NO.1.8 : 2nd Submit:: submittable=true && count=1 : " + submitCount); } if (submitCount==1) { submitButton.click(); } } } //END if{} else{}. }//END if (!isResponseHandled) // Calculate the time comsumed for the API call. if (paramsDebug.debug == 1) { let receiveDate = (new Date()).getTime(); responseTimeMs = (receiveDate - sendDate) / 1000; console.log("NO.1.9 : AJAX success: Time for API call: " + responseTimeMs + " seconds."); } submitCount++; }, //END success: function(); // API call error response. error: function (error) { $('#valSpinner').remove(); submitButton.prop("disabled", false); if (!isResponseHandled) { isResponseHandled = true; $('#valSpinner').remove(); submitButton.prop("disabled", false); // 2nd API call and subit form. if ( submitCount >= 1 ) { $('#ValidMsgEmail').remove(); $('#ValidMsgPhone').remove(); form.submittable(true); isResponseSuccess = true; if ( submitCount == 1 ) { form.submittable(true); } } // Handle AJAX error if (paramsDebug.debug == 1) { console.log('**** 2 ajax error. submitCount = ' + submitCount); console.log(error); } // Calculate the time comsumed for the API call. if (paramsDebug.debug == 1) { let receiveDate = (new Date()).getTime(); responseTimeMs = (receiveDate - sendDate) / 1000; console.log("NO.2.3 AJAX error: Time for API call: " + responseTimeMs + " seconds."); } } submitCount++; // Error status 500, then submit the form. submitButton.click(); } //END error: function(); }); //END $.ajax; if (isResponseSuccess) { if (paramsDebug.debug == 1) { console.log("NO.8.0 submittable(true)"); } form.submittable(true); } } //END: if (submitCount > 1) else // Setup the form.vals and form.submittable; form.vals({ "emailAddressStatus": emailAddressStatus, "phoneNumberStatus": phoneNumberStatus, "phoneNumberValidated": phoneNumberValidated, }); } //END: if (validateOrigin && (marketoBundle)) else { // For Event form and Newsletter form. if (validateOrigin === true){ form.submittable(true); } } }); //END form.onValidate() // Success callback() form.onSuccess(function(values, followUpUrl){ // Debug Phone/Email validation. if (paramsDebug.debug == 1) { console.log("NO.9.1 onSuccess: submittable = " + form.submittable()); console.log(form.getValues()); } // Track analytics. if (typeof dataLayer !== 'undefined'){ dataLayer.push({ event: drplMkto.dataLayerEvent, mktoFormId: form.getId(), 'FormValues': cleanFormVals(form.getValues()), 'FormFields': form.allFieldsFilled(), 'Submittable': form.submittable() }); } // If function exists, delete UTM cookie: if(typeof _deleteUtmCookie === "function"){ _deleteUtmCookie(); } // Marketo Modal "Thank You" message: if(use_post_submit_mssg){ $('html, body').animate({ scrollTop: 0 }, 'slow'); $('.mkto-presubmit').addClass('hidden'); $('.mktoModalContent').addClass('mkto_thnx_center'); $('.mktoModalMask').addClass('not_clicable'); $('.mkto-postsubmit').removeClass('hidden'); $('.mktoButton').removeAttr('disabled').text(drupalSettings.marketo.button_text); $('.mktoForm')[0].reset(); grecaptcha.reset(); } // Else, redirect user: else { window.location.href = drplMkto.success_url; } // IMPORTANT: Return false to prevent further code execution. return false; }); //END form.onSuccess. }); })(jQuery, drupalSettings.marketo);