Skip to main content
Switch Language
Glass medicine bottles on a factory line
  • Software

ComplianceWire® e-Learning Library for Life Sciences

Discover the unique advantage of ComplianceWire® to help you comply with U.S. Food and Drug Administration (FDA) regulation of medical devices and pharmaceuticals. Our course catalog contains more than 400 life sciences e-learning courses, 100 of which were co-developed with the FDA.

Request a demo

In-depth GxP and FDA compliance training libraries for medical device and pharmaceutical manufacturers

UL Solutions offers over 1,000 standard regulatory and performance-focused e-learning courses. Many of the GxP/FDA compliance courses were authored or reviewed by the FDA. Offer your workforce the opportunity to earn a GCP training certificate or round out their FDA compliance training with courses including 21 CFR part 820 training, 508 compliance e-learning, CAPA training and more. Build compliant courses to your specifications with our SCORM authoring tool. Course catalogs can be delivered integrated with ComplianceWire® instances, or on a standalone basis in SCORM or AICC formats.

 

Pharmacovigilance training courses, tailored to meet the needs of professionals across the medical device and pharmaceutical industries

Whether you're a ComplianceWire® subscriber seeking in-depth training for your team or an individual professional looking for accessible, on-demand learning options, our new courses are designed to fit your needs.

Now available on LearnShare™ On Demand, our offerings include key topics like:

  • Drug Safety and Pharmacovigilance
  • Pharmacovigilance Global Requirements
  • Pharmacovigilance Audit and Inspection

These courses are perfect for enhancing understanding and supporting compliance in today's complex regulatory environment.

Libraries include:
  • Aseptic Processing Library
  • Clinical: Medical Device Library
  • Clinical: Pharmaceutical Library
  • Data Integrity Library
  • Dietary Supplements Library
  • EHS for Life Science Library
  • Ethics and Corporate Responsibilities Library
  • FDA BIMO Library
  • FDA Inspection and Enforcement Library
  • Global Regulatory Library
  • HR Compliance and Risk Management Library
  • MDSAP Library
  • Medical Device GMP Library
  • Medical Device Sale and Marketing Library
  • Pharmaceutical GMP Library
  • Pharmaceutical Sale and Marketing Library
  • Pharmacovigilance Library 

Content updates are included as standard in content license agreements. UL Solutions continually monitors and analyzes regulatory agencies and related information sources for incorporation into course updates or new courses. Many courses are available in multiple languages. All courses are in a mobile-learning format and can be taken on a desktop or tablet. 
 

Explore a selection of our most popular courses

Click on the courses below to learn more. 

 

Icon of an award ribbon

Featured course

Every quarter we will feature a different course from our library. This is our current featured course.

Why is this course the feature of the quarter?

European Vigilance (DEV67)

This course discusses important concepts, terminology and reporting information for European vigilance for medical devices. Topics in this course include: Definitions, Serious Incidents Reporting, FSCA Reporting, and U.K. and Switzerland. After completing this course, learners will be able to: differentiate between incidents and serious incidents; recognize how European medical device vigilance reporting helps to protect patients and healthcare professionals; recognize the criteria for Manufacturer Incident Reporting (MIR); and recognize the purpose of field safety corrective action (FSCA) reporting, periodic summary reporting and trend reporting.

 

 

“We are committed to delivering and maintaining regulatory accurate eLearning courses which are instructional sound and visually engaging.”

  • Carrie McKeague, Program/Project Manager, ComplianceWire®
  • UL Solutions

 

Effective approaches to learning engagement

We incorporate a variety of approaches to convey content to the learner in a meaningful manner. Below are some of the methods we use to capture our learners' interest.

Lab tech looking at clipboard

 

 

Topic specific videos

Courses can also include dnamic videos to compliment the course content. Topics are portrayed through eye-catching videos helping to bring the content to life.

 


 

 

Avatar Videos

Avatar videos use a computer generated character that will introduce the content. This animated host will add interest and a personal touch to the information being delivered.

Cartoon avatar of an instructor

 


 

gif of an instructional stepper video

 

 

Stepper interactions

The stepper interaction allows you to navigate through content in sequential order. It is great for procedures with steps or timelines.

 


 

 

Vyond Videos

Dynamic content can make all the difference in creating a video that leaves a lasting impact. We can create dynamic videos for any situation. Mix multiple styles, create custom characters for any setting or job role then bring them to life with realistic movement, actions, and automatic lip-sync. 

Vyond video gif

 


 

Training quiz gif

 

 

Quiz Interactions

To ensure your users have retained the knowledge in the courses, test them with assessments that can be added throughout. You can use multiple choice, true or false and matching.

 


 

Training you can access anywhere, anytime

UL Solutions' unique web-based eLearning assets

Our professional development education programs carefully target the diverse needs of learners, regardless of industry, language, culture or education:

  • FDA-authored and/or reviewed courses identical to those used by the FDA to train its inspectors and investigators. 
  • Standardized courses on issues regulated by the International Conference on Harmonization (ICH); and by federal agencies, including Department of Health and Human Services (HHS) and Centers for Medicare and Medicaid Services (CMS).
  • Curricula focused on critical workplace subjects ranging from employee confidentiality to sexual harassment, health and safety and data integrity.
  • Customized, client-specific courses including:
    • Code of conduct
    • Corporate culture
    • Industry-specific regulations

Empowering employees with knowledge and expertise

Your organization’s greatest competitive advantage, aside from your employees, resides in your efficient communication of knowledge and procedures to drive measurable results.

The world’s leading companies recognize the intrinsic value and cost-efficiency of transforming critical procedures and processes into expert-developed solutions in the form of online LMS training courses, to instill product knowledge and deliver service consistently to employees, contractors, and suppliers.

From pharmaceuticals, medical devices and biologics to data integrity and ethics, we provide training solutions that engage employees, build knowledge retention and help provide measurable business results.

Web-based employee training has never been more easily accessible with our continuously updated premium-content library, available to customers on our exclusive compliance-based LMS.

Have your own LMS? UL Solutions courses are SCORM-and AICC-conformant.

Download our brochures
FDA

FDA Inspection and Enforcement Course Guide

2.78 MB
Life

Life Sciences Online Content and Custom Course Development

2.33 MB
ComplianceWire

ComplianceWire Pharma Course Mapping

682.11 KB
ComplianceWire

ComplianceWire Medical Device Course Mapping

540.25 KB
ComplianceWire

ComplianceWire eLearning ADDIE Model Guide

1.72 MB
ComplianceWire

ComplianceWire Course Review and Maintenance

430.04 KB
X

Get connected with our sales team

Found a course that fits your needs or interested in customization of something you’ve seen? Our expert sales team is ready to help.

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);