Skip to main content
Switch Language
  • Software

ComplianceWire®

Learning and Qualification Management System

Navigate life science regulations, automate training and implement risk management to support development of safer and more effective medical products.

Graphical depiction of progress in online learning courses

 

Discover how our validated, FDA CFR Part 11 compliance training management system helps you comply with evolving FDA Regulations

Keep your workforce up to date

Medical device and pharmaceutical manufacturers trying to keep up with ever-changing regulations have a tough job. Medical technology advances quickly, and with it the need for compliance systems to support patient safety. To help you and your workforce stay up to date with the latest U.S. Food and Drug Administration (FDA) regulations, Good Clinical Practice (GCP) training, HIPAAA training, ISO 14971 training and more, we created ComplianceWire®.

Automated life science learning management

ComplianceWire Learning and Qualification Management System, part of ULTRUS™ software from UL Solutions, is an award-winning, industry-leading training learning management system (LMS) for compliance and qualification management created for life sciences organizations. ComplianceWire is natively compliant with FDA 21 CFR 11 and EU Annex 11 electronic records validation requirements. This proven technology Is used globally by pharmaceutical, medical device and biologics companies as well as global regulatory authorities in the U.S., China, Brazil and India. Using ComplianceWire, life sciences companies can help support the safety and effectiveness of their products through robust, automated training capabilities for employees.

Learn more about the LMS

Elevating supplier compliance and qualification standards

Navigating the intricate landscape of regulated industries, companies grapple with confirming that their suppliers adhere to strict compliance and quality standards. It’s not just about on-time deliveries and cost efficiencies — it’s about safety, the integrity of the supply chain and meeting rigorous regulatory mandates. The question is, how can the companies effectively manage and qualify their myriad suppliers to meet these standards without getting entangled in a web of complexity? The answer is utilizing ComplianceWire®, which not only streamlines the process but demonstrates control over your supplier network.

 

Meet FDA Requirements for GxP training, 21 CFR Part 11, EU Annex 11

ComplianceWire® delivers powerful learning capabilities developed by life sciences experts for FDA-regulated companies.

 

Globe icon

Globally recognized LMS

Validated, audit-ready learning management system with over 700 million completions that support over 1.5 million users in over 130 countries and 34 languages.

Learn more

Book icon

e-learning library

Library of high-quality, engaging knowledge and content assets, including more than 1,000 e-learning training modules, over 400 life science-specific courses and 52 courses developed jointly by the U.S. FDA and UL Solutions.

Learn more

Hand holding a gear icon

Customize your training

With our easy-to-use- content creation tool, CourseCreate, you can customize ComplianceWire® training and further address your training requirements by adding your own tailored content.

Learn more

 

Get even more from your LMS with professional support services

Connect with dedicated life sciences-centric professionals and advisory experts

 

Laptop with a lightbulb

Tailored content

Learning consultants and custom content services are available to help you deliver tailored, company-specific knowledge assets using the most current learning methods for maximum retention.

Learn more

Two people talking icon

Support, when and where you need it

Expert professional services to help you achieve success through efficient implementations, integrations, data migrations, validation and change management.

Learn more

Puzzle pieces icon

Easy integration

Integration with enterprise systems (identify Management, HR, Document, and Quality Management Systems through APIs or customer interfaces), performed by proven and tested professionals with over 100 projects annually.

Learn more

 

Illustration of a ComplianceWire® training module playing

Trusted by companies worldwide

More than

600 million+

training completed

More than

600+

websites

More than

3.6 million+

learners worldwide

Trust the learning management technology used by the FDA

Since 1999, ComplianceWire® and UL Solutions life science e-learning courses have been the FDA’s trusted learning tools to train more than 70,000 global, federal, state and local investigators. The agency chose the ComplianceWire® platform as part of its Office of Regulatory Affairs (ORA) training infrastructure, to build up the proficiency of its investigators under a unique Cooperative Research and Development Agreement (CRADA). This service integrates the ComplianceWire® web-based platform with curricula UL Solutions co-developed with the FDA.

This same technology platform and coursework used by the FDA to train its inspectors and investigators in its virtual university are available to UL Solutions customers.

Contact us

Align with 21 CFR Part 11 and EU Annex 11 validation requirements

As part of each implementation, customers receive validation summary reports, Part 11 white papers, an audit with our quality team and validation test scripts. Employees can be automatically sorted into training groups based on criteria such as job function, effectively governing the role-based training process. Automated version control lowers the risk of human error from manually performing multiple version reconciliations and updating a library of constantly changing SOPs.

Contact us

 

Increase product safety and record work force qualification with powerful role-based training automation

Key features help our customers manufacture safer medical device and pharmaceutical products quickly and efficiently, with tools to support personal compliance.

 

Icon of a cloud with a lock in it
Natively compliant with 21 CFR Part 11 regulatory requirements
Icon of a person in a revolving circle
Automated, role-based assignment functionality
Icon of a circle with six circles branching off of it
Seamless integration with enterprise-quality software ecosystems
Icon of a pie chart on a laptop
Easy dashboard views of organizational risk

 

Document icon with a checkmark
Powerful ad hoc reporting and over 250 audit-ready standard reports
Icon of a locked padlock inside a shield
Flexible, unlimited security roles
Icon of a pencil writing on paper
Part 11-compliant electronic signatures
Icon of three people in a triangle formation with a arrow pointed up
Multiple learning assessment options and on the job training (OJT) support

 

Icon of two talking bubbles showing a back and forth conversation
Thirty-four languages available, for both platform and content
Icon of a video play button
Distribute your own standard operating procedures (SOPs), videos or SCORM and AICC learning content

 

 

 

Ready to boost your life sciences training and e-learning capabilities?

Schedule a demonstration to learn how ComplianceWire can help you navigate complex regulatory requirements.

ComplianceWire® and ULTRUS™ software

ComplianceWire® is now part of ULTRUS software, which brings together flagship digital offerings from UL Solutions to help customers manage their regulatory, supply chain and sustainability challenges.

Learn about ULTRUS
X

Ready to boost your life sciences training and e-learning capabilities?

Schedule a demonstration to learn how ComplianceWire can help you navigate complex regulatory requirements.

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