CINXE.COM
Security | Userflow
<!DOCTYPE html><!-- Last Published: Fri Mar 28 2025 20:56:24 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="www.userflow.com" data-wf-page="66751e4b207cfc03aafd3433" data-wf-site="666bc9172254723eadc4af82" lang="en" data-wf-locale="en" data-wf-collection="66751e4b207cfc03aafd342b" data-wf-item-slug="security"><head><meta charset="utf-8"/><title>Security | Userflow</title><meta content="https://cdn.prod.website-files.com/6674fb6f9c918d8174bccbca/675aadf3592f3c1fce5ef560_userflow-opengragh.png" property="og:image"/><meta content="https://cdn.prod.website-files.com/6674fb6f9c918d8174bccbca/675aadf3592f3c1fce5ef560_userflow-opengragh.png" property="twitter:image"/><meta content="width=device-width, initial-scale=1" name="viewport"/><link href="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/css/userflow-victorflow.webflow.cd3066fc5.min.css" rel="stylesheet" type="text/css"/><link href="https://fonts.googleapis.com" rel="preconnect"/><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"/><script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script><script type="text/javascript">WebFont.load({ google: { families: ["Work Sans:300,regular,500,600,700,800,900","Caveat:regular,500,600,700","Archivo:300,regular,500,600","Inter:300,regular,500,600,700"] }});</script><script src="https://use.typekit.net/rak3tdq.js" type="text/javascript"></script><script type="text/javascript">try{Typekit.load();}catch(e){}</script><script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script><link href="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/66b5b86db8a9fb5be70d77a7_userflow-favicon.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/66b5c0b225dfd91ca8f67ac9_userflow-webclip.webp" rel="apple-touch-icon"/><link href="https://www.userflow.com/policies/security" rel="canonical"/><style> body { -webkit-font-smoothing: antialiased; } .primary-button { color: #f7fdfa; background-image: linear-gradient(180deg, #23d777 0, #00b353 100%); box-shadow: 0 4px 16px -8px rgba(9, 19, 83, .35); text-shadow: 0 1px 6px rgba(0, 51, 17, .35); background-size: 100% 200%; background-repeat: no-repeat; background-position-y: 100%; } .secondary-button { color: #e9f1fb; background-image: linear-gradient(180deg, #0c196e 0, #060d37 100%); box-shadow: 0 4px 16px -8px rgba(9, 19, 83, .5); text-shadow: 0 1px 6px rgba(6, 13, 55, .9); background-size: 100% 200%; background-repeat: no-repeat; background-position-y: 100%; } .navbar.dark { background-color: transparent; } @media screen and (max-width: 991px) { .nav-menu.navigation.dark { background-color: #1a57e6; } } .nav-link.dark { color: var(--white); } .nav-dropdown-link.dark { color: var(--white); } .nav-icon-light.dark { opacity: 1; } .nav-icon-dark.dark { opacity: 0; } .nav-link.dark:hover { background: #1047c6 } .quote-bg { background: radial-gradient(50% 150% at 60% 50%, rgba(15, 230, 140, .7) 0, rgba(15, 230, 140, 0) 100%), radial-gradient(40% 100% at 0 0, #9747ff 0, #1a57e6 100%); } .illustration-tab-image-wrap { transform: perspective(2000px) rotateX(25deg) rotateY(0) rotateZ(0) translate3d(0, 0, -120px); } .illustration-userflow-layer, .illustration-tab-pane { transform: perspective(2000px) rotateX(25deg) rotateY(0) rotateZ(0) translate3d(0, 0, -120px); } .in-view { transform: perspective(2000px) rotateX(25deg) rotateY(0) rotateZ(0) translate3d(0, 0, 0); } .box-shadow { box-shadow: 0 0 1px 0 rgba(19, 43, 57, .25), 0 4px 24px -4px rgba(19, 43, 57, .1); background-color: var(--blue); } .product-icon-code>svg { height: 28px; vertical-align: -.125em; } .best-practices-code>svg { height: auto; vertical-align: -.125em; } .fa-secondary { opacity: 0.4; } .table_component { width: 100%; margin: 1rem 0; border-radius: 0.25rem; border-left: 1px solid #c3d5e0; border-right: 1px solid #c3d5e0; border-collapse: separate; } .table_header, .table_cell { padding: 0.5rem; border-bottom: 1px solid #c3d5e0; } .table_header { border-top: 1px solid #c3d5e0; } .table_header:first-child { border-top-left-radius: 3px; } .table_header:last-child { border-top-right-radius: 3px; } .table_head { background: #f4f8fb; } .case-study-logo { /* Standard filter property */ filter: grayscale(1) brightness(100); /* Vendor prefixes for older browser support */ -webkit-filter: grayscale(1) brightness(100); -moz-filter: grayscale(1) brightness(100); -ms-filter: grayscale(1) brightness(100); -o-filter: grayscale(1) brightness(100); } .case-study-feature-logo { /* Standard filter property */ filter: grayscale(1) brightness(0); /* Vendor prefixes for older browser support */ -webkit-filter: grayscale(1) brightness(0); -moz-filter: grayscale(1) brightness(0); -ms-filter: grayscale(1) brightness(0); -o-filter: grayscale(1) brightness(0); } </style> <style> @media (max-width: 768px) { p.blog-cta-text-link:before, p.blog-cta-text-link:after { content: "–"; } } </style> <!-- Mixpanel Code--> <script> (function (c, a) { if (!a.__SV) { var b = window; try { var d, m, j, k = b.location, f = k.hash; d = function (a, b) { return (m = a.match(RegExp(b + "=([^&]*)"))) ? m[1] : null }; f && d(f, "state") && (j = JSON.parse(decodeURIComponent(d(f, "state"))), "mpeditor" === j.action && (b.sessionStorage.setItem("_mpcehash", f), history.replaceState(j.desiredHash || "", c.title, k.pathname + k.search))) } catch (n) { } var l, h; window.mixpanel = a; a._i = []; a.init = function (b, d, g) { function c(b, i) { var a = i.split("."); 2 == a.length && (b = b[a[0]], i = a[1]); b[i] = function () { b.push([i].concat(Array.prototype.slice.call(arguments, 0))) } } var e = a; "undefined" !== typeof g ? e = a[g] = [] : g = "mixpanel"; e.people = e.people || []; e.toString = function (b) { var a = "mixpanel"; "mixpanel" !== g && (a += "." + g); b || (a += " (stub)"); return a }; e.people.toString = function () { return e.toString(1) + ".people (stub)" }; l = "disable time_event track track_pageview track_links track_forms track_with_groups add_group set_group remove_group register register_once alias unregister identify name_tag set_config reset opt_in_tracking opt_out_tracking has_opted_in_tracking has_opted_out_tracking clear_opt_in_out_tracking start_batch_senders people.set people.set_once people.unset people.increment people.append people.union people.track_charge people.clear_charges people.delete_user people.remove".split(" "); for (h = 0; h < l.length; h++) c(e, l[h]); var f = "set set_once union unset remove delete".split(" "); e.get_group = function () { function a(c) { b[c] = function () { call2_args = arguments; call2 = [c].concat(Array.prototype.slice.call(call2_args, 0)); e.push([d, call2]) } } for (var b = {}, d = ["get_group"].concat(Array.prototype.slice.call(arguments, 0)), c = 0; c < f.length; c++) a(f[c]); return b }; a._i.push([b, d, g]) }; a.__SV = 1.2; b = c.createElement("script"); b.type = "text/javascript"; b.async = !0; b.src = "undefined" !== typeof MIXPANEL_CUSTOM_LIB_URL ? MIXPANEL_CUSTOM_LIB_URL : "file:" === c.location.protocol && "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match(/^\/\//) ? "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js" : "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"; d = c.getElementsByTagName("script")[0]; d.parentNode.insertBefore(b, d) } })(document, window.mixpanel || []); </script> <script> mixpanel.init("619494a9fdb43c4bb53cff4560b7155a", { batch_requests: true }) mixpanel.track('page_viewed', JSON.parse(atob('eyJwYXRobmFtZSI6Ii9kZW1vIn0='))) </script> <!-- Google tag manager and Google Analytics code --> <script> (function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-5ZL9DTJ'); </script> <script src="https://kit.fontawesome.com/d3dc32f4ba.js" crossorigin="anonymous" nonce=""></script> <script type="text/javascript"> window.heapReadyCb = window.heapReadyCb || [], window.heap = window.heap || [], heap.load = function (e, t) { window.heap.envId = e, window.heap.clientConfig = t = t || {}, window.heap.clientConfig.shouldFetchServerConfig = !1; var a = document.createElement("script"); a.type = "text/javascript", a.async = !0, a.src = "https://cdn.us.heap-api.com/config/" + e + "/heap_config.js"; var r = document.getElementsByTagName("script")[0]; r.parentNode.insertBefore(a, r); var n = ["init", "startTracking", "stopTracking", "track", "resetIdentity", "identify", "getSessionId", "getUserId", "getIdentity", "addUserProperties", "addEventProperties", "removeEventProperty", "clearEventProperties", "addAccountProperties", "addAdapter", "addTransformer", "addTransformerFn", "onReady", "addPageviewProperties", "removePageviewProperty", "clearPageviewProperties", "trackPageview"], i = function (e) { return function () { var t = Array.prototype.slice.call(arguments, 0); window.heapReadyCb.push({ name: e, fn: function () { heap[e] && heap[e].apply(heap, t) } }) } }; for (var p = 0; p < n.length; p++)heap[n[p]] = i(n[p]) }; heap.load("1561782827"); </script> <!-- Start RB2B --> <script>!function () { var reb2b = window.reb2b = window.reb2b || []; if (reb2b.invoked) return; reb2b.invoked = true; reb2b.methods = ["identify", "collect"]; reb2b.factory = function (method) { return function () { var args = Array.prototype.slice.call(arguments); args.unshift(method); reb2b.push(args); return reb2b; }; }; for (var i = 0; i < reb2b.methods.length; i++) { var key = reb2b.methods[i]; reb2b[key] = reb2b.factory(key); } reb2b.load = function (key) { var script = document.createElement("script"); script.type = "text/javascript"; script.async = true; script.src = "https://s3-us-west-2.amazonaws.com/b2bjsstore/b/" + key + "/4N210HEL206Z.js.gz"; var first = document.getElementsByTagName("script")[0]; first.parentNode.insertBefore(script, first); }; reb2b.SNIPPET_VERSION = "1.0.1"; reb2b.load("4N210HEL206Z"); }(); </script> <!-- Start VWO Async SmartCode --> <link rel="preconnect" href="https://dev.visualwebsiteoptimizer.com" /> <script type='text/javascript' id='vwoCode'> window._vwo_code || (function () { var account_id = 790360, version = 2.1, settings_tolerance = 2000, hide_element = 'body', hide_element_style = 'opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important;transition:none !important;', /* DO NOT EDIT BELOW THIS LINE */ f = false, w = window, d = document, v = d.querySelector('#vwoCode'), cK = '_vwo_' + account_id + '_settings', cc = {}; try { var c = JSON.parse(localStorage.getItem('_vwo_' + account_id + '_config')); cc = c && typeof c === 'object' ? c : {} } catch (e) { } var stT = cc.stT === 'session' ? w.sessionStorage : w.localStorage; code = { nonce: v && v.nonce, use_existing_jquery: function () { return typeof use_existing_jquery !== 'undefined' ? use_existing_jquery : undefined }, library_tolerance: function () { return typeof library_tolerance !== 'undefined' ? library_tolerance : undefined }, settings_tolerance: function () { return cc.sT || settings_tolerance }, hide_element_style: function () { return '{' + (cc.hES || hide_element_style) + '}' }, hide_element: function () { if (performance.getEntriesByName('first-contentful-paint')[0]) { return '' } return typeof cc.hE === 'string' ? cc.hE : hide_element }, getVersion: function () { return version }, finish: function (e) { if (!f) { f = true; var t = d.getElementById('_vis_opt_path_hides'); if (t) t.parentNode.removeChild(t); if (e) (new Image).src = 'https://dev.visualwebsiteoptimizer.com/ee.gif?a=' + account_id + e } }, finished: function () { return f }, addScript: function (e) { var t = d.createElement('script'); t.type = 'text/javascript'; if (e.src) { t.src = e.src } else { t.text = e.text } v && t.setAttribute('nonce', v.nonce); d.getElementsByTagName('head')[0].appendChild(t) }, load: function (e, t) { var n = this.getSettings(), i = d.createElement('script'), r = this; t = t || {}; if (n) { i.textContent = n; d.getElementsByTagName('head')[0].appendChild(i); if (!w.VWO || VWO.caE) { stT.removeItem(cK); r.load(e) } } else { var o = new XMLHttpRequest; o.open('GET', e, true); o.withCredentials = !t.dSC; o.responseType = t.responseType || 'text'; o.onload = function () { if (t.onloadCb) { return t.onloadCb(o, e) } if (o.status === 200 || o.status === 304) { _vwo_code.addScript({ text: o.responseText }) } else { _vwo_code.finish('&e=loading_failure:' + e) } }; o.onerror = function () { if (t.onerrorCb) { return t.onerrorCb(e) } _vwo_code.finish('&e=loading_failure:' + e) }; o.send() } }, getSettings: function () { try { var e = stT.getItem(cK); if (!e) { return } e = JSON.parse(e); if (Date.now() > e.e) { stT.removeItem(cK); return } return e.s } catch (e) { return } }, init: function () { if (d.URL.indexOf('__vwo_disable__') > -1) return; var e = this.settings_tolerance(); w._vwo_settings_timer = setTimeout(function () { _vwo_code.finish(); stT.removeItem(cK) }, e); var t; if (this.hide_element() !== 'body') { t = d.createElement('style'); var n = this.hide_element(), i = n ? n + this.hide_element_style() : '', r = d.getElementsByTagName('head')[0]; t.setAttribute('id', '_vis_opt_path_hides'); v && t.setAttribute('nonce', v.nonce); t.setAttribute('type', 'text/css'); if (t.styleSheet) t.styleSheet.cssText = i; else t.appendChild(d.createTextNode(i)); r.appendChild(t) } else { t = d.getElementsByTagName('head')[0]; var i = d.createElement('div'); i.style.cssText = 'z-index: 2147483647 !important;position: fixed !important;left: 0 !important;top: 0 !important;width: 100% !important;height: 100% !important;background: white !important;'; i.setAttribute('id', '_vis_opt_path_hides'); i.classList.add('_vis_hide_layer'); t.parentNode.insertBefore(i, t.nextSibling) } var o = window._vis_opt_url || d.URL, s = 'https://dev.visualwebsiteoptimizer.com/j.php?a=' + account_id + '&u=' + encodeURIComponent(o) + '&vn=' + version; if (w.location.search.indexOf('_vwo_xhr') !== -1) { this.addScript({ src: s }) } else { this.load(s + '&x=true') } } }; w._vwo_code = code; code.init(); })(); </script> <!-- End VWO Async SmartCode --> <!-- [Attributes by Finsweet] CMS Load --> <script async src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-cmsload@1/cmsload.js"></script></head><body><div class="header-stickey"><div class="header-bar"><div class="w-layout-blockcontainer container w-container"></div></div><div class="nav-whole-area"><div data-animation="default" data-collapse="none" data-duration="400" data-easing="ease" data-easing2="ease" role="banner" class="navbar w-nav"><div class="container w-container"><div class="navbar-area navigation"><a href="/" class="brand-link w-nav-brand"><div class="brand-logo-embed w-embed"><svg xmlns="http://www.w3.org/2000/svg" width="150" height="30" fill="none" viewBox="0 0 500 100"> <path class="userflow-logo-fg" fill="#23d777" d="m61.49 30.37-1.652 9.37c-1.762 10-11.293 18-21.244 18h-8.159c-10.011 0-16.628-8.09-14.876-18l3.313-18.77h9.42L24.98 39.74a6.992 6.992 0 0 0 1.405 6.088 7.007 7.007 0 0 0 5.713 2.542h8.16a10.77 10.77 0 0 0 6.58-2.553 10.747 10.747 0 0 0 3.58-6.077L52.9 25.67a5.849 5.849 0 0 1 5.536-4.7h17.43l1.081-6.15C78.4 6.63 72.943 0 64.734 0H24.689C16.499 0 8.67 6.63 7.239 14.82l-7.008 40C-1.21 63 4.236 69.63 12.445 69.63H52.49c8.199 0 16.018-6.63 17.45-14.81l4.314-24.45H61.49Z"></path> <path class="userflow-logo-bg" fill="#1a57e6" d="M87.62 30.37h-4.005l-6.097 34.57c-1.442 8.18-9.26 14.82-17.45 14.82h-36.09l-.951 5.43C21.575 93.37 27.03 100 35.24 100h40.045c8.19 0 16.018-6.63 17.45-14.81l7.008-40c1.531-8.18-3.935-14.82-12.124-14.82Z"></path> <path class="userflow-logo-txt" fill="#060d37" d="m347.79 3-2.253 13.112h-2.97c-5.94 0-6.864.922-8.197 9.22 0 .102-.203.716-.307 1.229h9.63l-2.253 12.497h-9.527c-2.766 15.57-6.863 38.722-6.863 38.722-2.971 17.414-5.634 22.331-20.693 22.331h-6.863l2.253-13.112h2.971c5.532 0 6.864-.922 8.298-9.22l9.219-52.55C323.205 6.073 327.611 3 343.693 3h4.097ZM129.936 26.56c8.093 0 11.474 4.508 9.322 15.571l-2.765 13.932c-1.332 6.556.717 10.346 6.35 10.346 5.123 0 8.708-5.122 10.142-12.497l5.327-27.351h14.341l-6.556 34.009c-.717 3.688-.102 5.02 3.176 5.02h2.048l-2.15 12.19h-6.66c-5.121 0-8.502-1.435-9.936-5.02-3.175 3.688-7.58 6.044-13.624 6.044-12.395.102-19.975-7.785-17.005-22.946l2.561-11.985c.82-3.995 0-5.122-2.868-5.122H120l2.254-12.19h7.682v-.001Zm65.356 52.244c12.6 0 20.692-6.249 22.229-15.263 1.946-11.371-7.273-14.956-15.059-17.312-5.429-1.64-10.243-2.664-9.731-5.327.41-2.459 2.663-4.098 6.453-4.098 4.713 0 8.298 2.356 10.552 5.737l11.37-7.376c-3.79-5.634-11.473-9.629-21.204-9.629-11.064 0-19.566 5.737-21 14.034-2.049 11.78 7.17 15.161 14.956 17.415 5.429 1.536 10.244 2.56 9.731 5.429-.512 2.97-3.175 4.61-6.863 4.61-5.122 0-9.015-2.766-11.576-7.069l-12.087 7.888c3.483 5.839 10.858 10.96 22.229 10.96v.001Zm233.695-52.243c8.093 0 11.27 4.507 9.116 15.57l-2.766 14.137c-1.33 6.863.31 10.346 5.84 10.346 5.326 0 9.22-5.634 10.653-13.112l4.713-26.941h14.24l-5.43 31.55c-.923 5.635 1.127 8.195 5.02 8.195 8.194 0 12.907-8.707 14.854-19.872 1.636-8.912.51-15.161-1.127-19.873h14.443c1.127 5.224 2.357 12.292.51 22.126-2.763 15.468-11.88 30.117-28.886 30.117-8.194 0-12.704-2.561-14.854-7.273-4.61 4.712-10.653 7.273-17.72 7.273-11.986 0-19.463-8.4-16.596-22.946l2.356-11.985c.82-3.995 0-5.122-2.87-5.122h-1.536l2.256-12.19h7.784Zm-40.77 52.243c15.263 0 25.713-10.346 28.273-23.458 2.867-15.264-6.453-29.81-24.277-29.81-14.65 0-25.713 10.346-28.273 23.458-2.87 15.264 6.453 29.81 24.277 29.81ZM233.468 57.19l.052.118-.044-.016c1.23 5.634 5.737 9.322 12.805 9.322 5.02 0 9.117-2.151 12.395-6.351l10.756 7.068c-5.02 6.863-12.087 11.473-23.97 11.473-18.644 0-27.146-14.649-24.483-29.605 2.327-13.03 13.617-21.916 25.65-23.432a25.133 25.133 0 0 1 3.41-.23h.237c.092 0 .18 0 .265.003 15.372.25 24.59 11.935 22.957 26.528l-.574 5.122h-39.456ZM366.64 3l-10.347 58.594c-.513 2.664.307 3.688 2.97 3.688h1.537l-2.253 12.498h-6.35c-11.474 0-11.68-7.069-10.04-16.288L352.4 3h14.24ZM284 26.56c6.658 0 9.116 3.176 9.526 8.093 3.688-5.531 8.912-8.092 15.366-8.092h6.556l-2.561 14.136h-5.634c-7.069 0-11.986 3.176-13.83 12.702l-4.814 24.38h-14.341l6.556-33.906c.922-3.688 0-5.122-3.278-5.122h-1.64l2.152-12.19h5.941l.001-.001Zm104.933 39.234c-7.99 0-12.803-7.273-11.473-15.16 1.23-7.478 7.683-12.293 14.033-12.293 8.197.205 12.807 7.478 11.474 15.366-1.227 7.478-7.374 12.087-14.034 12.087ZM260.05 45.921c-1.248-5.326-5.343-8.092-11.284-8.092-5.941 0-10.816 3.278-13.506 8.092h24.79Z"></path> </svg></div></a><div class="nav-menu-area"><nav role="navigation" class="nav-menu navigation w-nav-menu"><div class="nav-menu-wrap navigation"><div data-hover="true" data-delay="0" class="nav-dropdown w-dropdown"><div class="nav-link w-dropdown-toggle"><div>Product</div><div class="nav-dropdown-icon-wrap"><div class="dropdown-arrow-code w-embed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="currentColor" d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"/></svg></div></div></div><nav class="nav-dropdown-list w-dropdown-list"><a href="/product" class="nav-dropdown-link w-dropdown-link">Product Overview</a><a href="/resource-center" class="nav-dropdown-link w-dropdown-link">Resource Center</a><a href="/ai-assistant" class="nav-dropdown-link w-dropdown-link">AI Assistant</a><a href="/in-app-surveys" class="nav-dropdown-link w-dropdown-link">In-app surveys</a><a href="/feature-announcements" class="nav-dropdown-link w-dropdown-link">Feature announcements</a></nav></div><a href="/pricing" class="nav-link w-nav-link">Pricing</a><div data-hover="true" data-delay="0" class="nav-dropdown w-dropdown"><div class="nav-link w-dropdown-toggle"><div>Resources </div><div class="nav-dropdown-icon-wrap"><div class="dropdown-arrow-code w-embed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="currentColor" d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"/></svg></div></div></div><nav class="nav-dropdown-list w-dropdown-list"><a href="/blog" class="nav-dropdown-link w-dropdown-link">Blog</a><a href="https://docs.userflow.com/docs" class="nav-dropdown-link w-dropdown-link">Documentation</a><a href="/customers" class="nav-dropdown-link w-dropdown-link">Customers</a><a href="/best-practices" class="nav-dropdown-link w-dropdown-link">Best practices</a><a href="https://docs.userflow.com/docs/dev" class="nav-dropdown-link w-dropdown-link">Developer Docs</a></nav></div><div class="nav-button-wrap navigation"><a href="https://app.userflow.com/app/sign-in?__hstc=17958374.732a3001c521056a8c4cee5bb17d47c5.1721370265869.1729849049053.1730088044328.24&__hssc=17958374.3.1730088044328&__hsfp=3499748124" class="nav-link icon w-inline-block"><div class="nav-icon-wrap"><img loading="lazy" src="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/671b266ef78f063b3417c33b_sign-in-light.svg" alt="sign" class="nav-icon-light"/><img loading="lazy" src="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/671b210cefebad642f8669a1_sign-in.svg" alt="sign" class="nav-icon-dark"/></div></a><a href="/demo#schedule" class="secondary-button small navigation w-button">View a Demo</a><a href="https://app.userflow.com/app/create-account" class="primary-button navigation w-button">Start Free Trial</a></div></div></nav><div class="nav-menu-button-area"><a href="https://app.userflow.com/app/create-account" class="primary-button navigation mobile w-button">Start Free Trial</a><div data-w-id="70b3e3bc-be99-b6f6-e925-a9f4623c3870" class="nav-menu-button"><div class="nav-menu-line"></div><div class="nav-menu-line"></div><div class="nav-menu-line"></div></div></div></div></div></div></div></div></div><div class="policies-section mt120"><div class="w-layout-blockcontainer container w-container"><div class="policies-area"><div class="policies-top-bar"><a href="/policies" class="policies-bar-text link">Policies</a><div class="policies-arrow-wrap"><img src="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/66752765ed2d0f19112c2c82_policies-arrow.svg" loading="lazy" width="Auto" height="Auto" alt="icon" class="policies-arrow-icon"/></div><p class="policies-bar-text">Security</p></div><h1 class="section-title">Userflow Security</h1><div class="policies-summary-wrap"><div class="policies-summary w-richtext"><p>At Userflow, security is our absolute highest priority. In the spirit of openness and transparency, here are some of the security measures we take to protect and defend the Userflow platform.</p><h3>SOC 2 Type 2 Compliant</h3><p>To prove our high commitment to strong security, availability and privacy, we have gone through SOC 2 Type 2 certification with the help of <a href="https://drata.com/">Drata</a> and <a href="https://www.johansonllp.com/">Johanson Group LLP</a>.</p><figure style="max-width:216px" class="w-richtext-align-fullwidth w-richtext-figure-type-image"><div><img src="https://cdn.prod.website-files.com/6674fb6f9c918d8174bccbca/66c96fbf28a66d95eba9865e_66c96fbbd4581555f3b1a342_SOC-Image.png" loading="lazy" alt=""/></div></figure><h3>We protect your data</h3><p>All data is written to multiple disks instantly, backed up daily, and stored in multiple locations. Files that our customers upload are stored on servers that use modern techniques to remove bottlenecks and points of failure.</p><h3>Your users’ data never leaves our servers</h3><p>We distinguish between data about your users and data about you, yourself. While, for example, your billing information is shared with Stripe, and your profile is accessible to us in our help desk software, any data about your users are never shared with any external providers, and never leaves our server cluster hosted with Google Cloud Platform.</p><h3>We don’t collect information from your users’ browsers</h3><p>When Userflow.js is installed in your app, the only information that’s required to be sent to Userflow is the current user’s ID (or a hash of the ID, if you don’t want to share the ID either). Any user attributes you want to include is completely in your control. By default, Userflow also tracks page views including the current URL, but this can be turned off.</p><p>To be perfectly clear: Userflow does not collect any information from your users’ browsers. All logic such as “whether an element is present” or “what the value of a text input is” is handled 100% client-side and never leaves the browser.</p><h3>Encrypting data in transit</h3><p>Whenever your data is in transit between you (or your users) and us, everything is encrypted, and sent using HTTPS.</p><p>During a user agent’s (typically a web browser) first site visit, Userflow sends a Strict Transport Security Header (HSTS) to the user agent that ensures that all future requests should be made via HTTPS even if a link to Userflow is specified as HTTP. Additionally, we use HSTS preload, guaranteeing that requests are never – not even the very first – made over a non-encrypted connection. Cookies are also set with a secure flag.</p><h3>Encrypting data at rest</h3><p>Any files that you upload to us are stored and are encrypted at rest using Google Cloud Storage.</p><p>Flows/tour content, user attributes and events is stored in our Google Cloud SQL instance (Postgres), which also uses encryption at rest.</p><p>Our backups of your data are likewise encrypted.</p><h3>Hosted on Google Cloud Platform</h3><p>Userflow is hosted on Google Cloud Platform. Our database is managed by Google Cloud SQL, ensuring redundancy, high availability and trustworthy automated, encrypted backups.</p><p>Google Cloud Platform is certified for a growing number of compliance standards and controls, and undergoes several independent third party audits to test for data safety, privacy, and security. Read more about the specific certifications on the <a href="https://cloud.google.com/security/compliance"><strong>GCP compliance page</strong></a>.</p><h3>Concurrency and rate limiting</h3><p>We employ several layers to protect against abuse and DoS attacks, such as concurrency limiting (limits number of active requests) and rate limiting (limits number of requests over time). Our servers gracefully queue requests when under high load, and handles them at a safe pace.</p><h3>Organizational practices</h3><ul role="list"><li>We operate under the principle of least privilege: Employees are assigned the lowest level of access that allows them to do their work.</li><li>Two-factor authentication is enforced in all sensitive systems.</li><li>All employees are required to use approved password managers (like Lastpass or 1Password) to generate and store strong passwords that are never reused.</li><li>All employees are required to encrypt local hard drives and enable screen locking for device security.</li><li>All access to application admin functionalities is restricted to a small subset of Userflow staff.</li><li>We never store customer data on personal devices (like laptops).</li></ul><h3>Development practices</h3><ul role="list"><li>All code changes are thoroughly tested through our Continuous Integration software.</li><li>All code changes is tested in a staging environment before deploying to production.</li><li>We use automatic security vulnerability detection tools to alert us when our dependencies have known security issues. We are aggressive about applying patches and deploying quickly.</li><li>We use several tools and services to automatically monitor uptime and site availability. Key employees receive automatic email and SMS notifications in the case of downtime or emergencies.</li><li>Logs are permanently deleted after 14 days.</li></ul><h3>Penetration testing</h3><p>On top of our development-related continuous testing, we also conduct periodic third-party manual penetration testing of both our application and infrastructure. You can request a copy of our latest report at <a href="mailto:security@userflow.com"><strong>security@userflow.com</strong></a>.</p><h3>Regularly-updated infrastructure</h3><p>Our software infrastructure is updated regularly with the latest security patches. Our products run on a dedicated network which is locked down with firewalls and carefully monitored. While perfect security is a moving target, we work with security researchers to keep up with the state-of-the-art in web security.</p><h3>We protect your billing information</h3><p>All credit card transactions are processed via Stripe using secure encryption—the same level of encryption used by leading banks. Card information is transmitted, stored, and processed securely on a <a href="https://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard"><strong>PCI-Compliant network</strong></a>.</p><h3>Have a concern? Need to report an incident?</h3><p>Have you noticed abuse, misuse, an exploit, or experienced an incident with your account? Send urgent or sensitive reports directly to <a href="mailto:security@userflow.com"><strong>security@userflow.com</strong></a>. We’ll get back to you as soon as we can, usually within 24 hours. Please follow up if you don’t hear back. <strong>For requests that aren’t urgent or sensitive</strong>: submit a <a href="mailto:support@userflow.com"><strong>support request</strong></a>.</p><p>Keeping customer data safe and secure is a huge responsibility and a top priority. We work hard to protect our customers from the latest threats. Your input and feedback on our security is always appreciated.</p></div><div class="w-embed"><style> .policies-summary p+h1, .policies-summary p+h2, .policies-summary p+h3, .policies-summary p+h4, .policies-summary ol+h1, .policies-summary ol+h2, .policies-summary ol+h3, .policies-summary ol+h4, .policies-summary ul+h1, .policies-summary ul+h2, .policies-summary ul+h3, .policies-summary ul+h4, .policies-summary blockquote+h1, .policies-summary blockquote+h2, .policies-summary blockquote+h3, .policies-summary blockquote+h4, .policies-summary h1+h1, .policies-summary h1+h2, .policies-summary h1+h3, .policies-summary h1+h4, .policies-summary h2+h1, .policies-summary h2+h2, .policies-summary h2+h3, .policies-summary h2+h4, .policies-summary h3+h1, .policies-summary h3+h2, .policies-summary h3+h3, .policies-summary h3+h4, .policies-summary h4+h1, .policies-summary h4+h2, .policies-summary h4+h3, .policies-summary h4+h4 { margin-top: 2rem; } .policies-summary p+p, .policies-summary p+ol, .policies-summary p+ul, .policies-summary p+pre, .policies-summary p+blockquote, .policies-summary ol+p, .policies-summary ol+ol, .policies-summary ol+ul, .policies-summary ol+pre, .policies-summary ol+blockquote, .policies-summary ul+p, .policies-summary ul+ol, .policies-summary ul+ul, .policies-summary ul+pre, .policies-summary ul+blockquote, .policies-summary pre+p, .policies-summary pre+ol, .policies-summary pre+ul, .policies-summary pre+pre, .policies-summary pre+blockquote, .policies-summary blockquote+p, .policies-summary blockquote+ol, .policies-summary blockquote+ul, .policies-summary blockquote+pre, .policies-summary blockquote+blockquote, .policies-summary h1+p, .policies-summary h1+ol, .policies-summary h1+ul, .policies-summary h1+pre, .policies-summary h1+blockquote, .policies-summary h2+p, .policies-summary h2+ol, .policies-summary h2+ul, .policies-summary h2+pre, .policies-summary h2+blockquote, .policies-summary h3+p, .policies-summary h3+ol, .policies-summary h3+ul, .policies-summary h3+pre, .policies-summary h3+blockquote, .policies-summary h4+p, .policies-summary h4+ol, .policies-summary h4+ul, .policies-summary h4+pre, .policies-summary h4+blockquote { margin-top: 1rem; } </style></div></div><div class="security-policies"><h2 class="security-policies-title">Additional policies</h2><div class="securities-collection"><div class="w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-acceptable-use" class="policies-link">Acceptable Use Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-asset-management" class="policies-link">Asset Management Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-backup" class="policies-link">Backup Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-business-continuity" class="policies-link">Business Continuity Plan</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-code-of-conduct" class="policies-link">Code of Conduct</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-data-classification" class="policies-link">Data Classification Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-data-deletion" class="policies-link">Data Deletion Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-data-protection" class="policies-link">Data Protection Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-disaster-recovery" class="policies-link">Disaster Recovery Plan</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-encryption" class="policies-link">Encryption Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-incident-response" class="policies-link">Incident Response Plan</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-information-security" class="policies-link">Information Security Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-password" class="policies-link">Password Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-physical-security" class="policies-link">Physical Security Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-responsible-disclosure" class="policies-link">Responsible Disclosure Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-risk-assessment" class="policies-link">Risk Assessment Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-sdlc" class="policies-link">Software Development Life Cycle Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-system-access-control" class="policies-link">System Access Control Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-vendor-management" class="policies-link">Vendor Management Policy</a></li></ul></div><div role="listitem" class="w-dyn-item"><ul role="list" class="policies-list"><li class="policies-item security"><a href="/policies/security-vulnerability-management" class="policies-link">Vulnerability Management Policy</a></li></ul></div></div></div></div></div></div></div></div><section class="footer-section"><div class="w-layout-blockcontainer container w-container"><div class="footer-area"><div class="footer-link-wrap"><a href="/" class="footer-logo-link w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/666c4067646925e7d0491ec2_footer-logo.svg" alt="icon" class="footer-logo-image"/></a></div><div class="footer-wrap"><div class="footer-list-area"><div class="footer-list-whole-wrap"><h2 class="footer-list-title">PRODUCT</h2><div class="footer-list-wrap"><a href="/product" class="footer-link">Product overview<br/></a><a href="/resource-center" class="footer-link">Resource Center<br/></a><a href="/ai-assistant" class="footer-link">AI Assistant<br/></a><a href="/in-app-surveys" class="footer-link">In-app surveys</a><a href="/feature-announcements" class="footer-link">Feature announcements</a><a href="/pricing" class="footer-link">Pricing <br/></a><a href="/alternatives" class="footer-link">Alternatives<br/></a></div></div></div><div class="footer-list-area"><div class="footer-list-whole-wrap"><h2 class="footer-list-title">SOLUTIONS</h2><div class="footer-list-wrap"><a href="/user-onboarding" class="footer-link">User onboarding</a><a href="/product-tours" class="footer-link">Product tours</a><a href="/product-led-growth" class="footer-link">Product-led growth</a><a href="/customer-self-service" class="footer-link">Customer self-service</a><a href="/trial-conversion" class="footer-link">Trial conversion</a></div></div><div class="footer-list-whole-wrap"><h2 class="footer-list-title">DEVELOPERS</h2><div class="footer-list-wrap"><a href="https://docs.userflow.com/docs/dev" class="footer-link">Developer docs</a><a href="https://docs.userflow.com/docs/dev/userflow-js-installation" class="footer-link">Userflow.js Installation</a><a href="https://docs.userflow.com/docs/userflow-js#userflow-js-reference" class="footer-link">Userflow.js Reference</a><a href="https://docs.userflow.com/docs/api#userflow-api-reference" class="footer-link">API Reference</a></div></div></div><div class="footer-list-area"><div class="footer-list-whole-wrap"><h2 class="footer-list-title">RESOURCES</h2><div class="footer-list-wrap"><a href="/blog" class="footer-link">Blog</a><a href="/customers" class="footer-link">Customers</a><a href="https://docs.userflow.com/docs" class="footer-link">Documentation</a><a href="/first-userflow-onboarding" class="footer-link">First Userflow onboarding</a><a href="/userflow-tips-and-tricks" class="footer-link">Userflow tips and tricks</a><a href="/onboarding-best-practices" class="footer-link">Onboarding best practices</a><a href="/resource-center-best-practices" class="footer-link">Resource center best practices</a><a href="/product-led-at-userflow" class="footer-link">Product-led at Userflow</a></div></div></div><div class="footer-list-area"><div class="footer-list-whole-wrap"><div class="nav-button-wrap footer"><div class="footer-secondary-button"><a href="https://app.userflow.com/app/create-account" class="primary-button navigation w-button">Start Free Trial</a></div><a href="/demo#schedule" class="secondary-button small navigation w-button">View a Demo</a></div></div><div class="footer-list-whole-wrap"><h2 class="footer-list-title">© USERFLOW INC. 2025</h2><div class="footer-list-wrap"><a href="https://status.userflow.com/" class="footer-link">System status</a><a href="/policies/security" aria-current="page" class="footer-link w--current">Security</a><a href="/policies/privacy-regulations" class="footer-link">Privacy Regulations (GDPR)</a><a href="/policies/terms" class="footer-link">Terms of Service</a><a href="/policies/privacy" class="footer-link">Privacy Policy</a><a href="/policies" class="footer-link">All policies</a></div></div></div></div><div class="footer-badge-wrap"><img loading="lazy" src="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/66706c96f6aa024c3c6c9d93_footer-badge.png" alt="image" class="footer-badge-image"/></div></div></div></section><div><div class="set-all-components-to-display-none-and-use-this-div-to-create-a-symbol"><div fs-cc="banner" class="fs-cc-banner_component"><div class="cookie-banner"><div>We use cookies to help us improve userflow.com</div><a href="/policies" class="policy-link">Learn more</a><div class="fs-cc-banner_buttons-wrapper"><div fs-cc="open-preferences" class="fs-cc-banner_text-link hide">Preferences</div><div fs-cc="deny" class="fs-cc-banner_button fs-cc-button-alt hide">Deny</div><div fs-cc="allow" class="cookie-accept-link">OK</div><div fs-cc="close" class="fs-cc-banner_close hide"><div class="fs-cc-banner_close-icon w-embed"><svg fill="currentColor" aria-hidden="true" focusable="false" viewBox="0 0 16 16"> <path d="M9.414 8l4.293-4.293-1.414-1.414L8 6.586 3.707 2.293 2.293 3.707 6.586 8l-4.293 4.293 1.414 1.414L8 9.414l4.293 4.293 1.414-1.414L9.414 8z"></path> </svg></div></div></div></div><div fs-cc="interaction" class="fs-cc-banner_trigger"></div></div><div fs-cc="manager" class="fs-cc-manager_component hide"><div fs-cc="open-preferences" class="fs-cc-manager_button"><div class="fs-cc-manager_icon w-embed"><svg viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0)"> <path d="M52.631 30.3899C52.229 30.4443 51.8161 30.4769 51.3924 30.4769C47.5135 30.4769 44.2322 27.9344 43.1022 24.4358C42.9066 23.8382 42.4177 23.371 41.7984 23.2624C35.3553 22.0346 30.4877 16.3847 30.4877 9.5831C30.4877 6.72555 31.3461 4.07445 32.8237 1.86881C33.1714 1.34728 32.8781 0.641046 32.2588 0.521529C30.5529 0.173843 28.8036 0 27 0C12.093 0 0 12.093 0 27C0 41.907 12.093 54 27 54C40.4402 54 51.5553 44.2213 53.6415 31.3678C53.7392 30.7811 53.2068 30.303 52.631 30.3899Z" fill="#4264D1"/> <path d="M14.8093 21.7738C16.7355 21.7738 18.297 20.2123 18.297 18.2861C18.297 16.3599 16.7355 14.7984 14.8093 14.7984C12.883 14.7984 11.3215 16.3599 11.3215 18.2861C11.3215 20.2123 12.883 21.7738 14.8093 21.7738Z" fill="#6CE2FF"/> <path d="M16.5477 38.3215C17.9879 38.3215 19.1554 37.154 19.1554 35.7138C19.1554 34.2737 17.9879 33.1062 16.5477 33.1062C15.1075 33.1062 13.9401 34.2737 13.9401 35.7138C13.9401 37.154 15.1075 38.3215 16.5477 38.3215Z" fill="#6CE2FF"/> <path d="M38.2129 7.06237L37.963 8.56177C37.7565 9.78953 38.4519 10.9956 39.6254 11.441L41.8419 12.2668C43.2978 12.8101 44.9167 11.9626 45.297 10.4523L46.0901 7.3014C46.5791 5.33481 44.7429 3.58551 42.8089 4.16137L40.06 4.98712C39.093 5.26961 38.3759 6.07364 38.2129 7.06237Z" fill="#6CE2FF"/> <path d="M47.0354 16.5477L45.9815 17.0692C45.1557 17.4821 44.7972 18.4708 45.1557 19.3183L46.0032 21.2958C46.5139 22.4909 48.1111 22.7191 48.9477 21.7195L50.3058 20.0897C50.9469 19.3183 50.8056 18.1774 50.0125 17.5799L48.8608 16.7106C48.3284 16.3195 47.6221 16.2543 47.0354 16.5477Z" fill="#6CE2FF"/> <path d="M52.2615 13.06C53.2216 13.06 53.9999 12.2816 53.9999 11.3215C53.9999 10.3614 53.2216 9.5831 52.2615 9.5831C51.3014 9.5831 50.5231 10.3614 50.5231 11.3215C50.5231 12.2816 51.3014 13.06 52.2615 13.06Z" fill="#6CE2FF"/> <path d="M30.2704 50.7296C15.3634 50.7296 3.27042 38.6366 3.27042 23.7296C3.27042 17.1018 5.66076 11.039 9.61569 6.34528C3.73763 11.2998 0 18.7099 0 27C0 41.907 12.093 54 27 54C35.2901 54 42.7002 50.2732 47.6439 44.3952C42.9501 48.3501 36.8873 50.7296 30.2704 50.7296Z" fill="#4264D1"/> <path d="M42.2222 10.2459C40.7662 9.70263 39.897 8.19236 40.1469 6.64951L40.4403 4.86761L40.0274 4.98713C39.0712 5.26963 38.365 6.07365 38.202 7.06238L37.9521 8.56178C37.7457 9.78955 38.4411 10.9956 39.6145 11.4411L41.831 12.2668C43.0044 12.7014 44.2648 12.2342 44.9167 11.2563L42.2222 10.2459Z" fill="#4264D1"/> <path d="M47.8612 20.1658L46.905 17.9276C46.7203 17.5038 46.7095 17.0584 46.8181 16.6455L45.9815 17.0692C45.1557 17.4821 44.7972 18.4708 45.1557 19.3183L46.0032 21.2958C46.5139 22.491 48.1111 22.7191 48.9477 21.7195L49.2845 21.3175C48.6869 21.198 48.1328 20.8069 47.8612 20.1658Z" fill="#4264D1"/> <path d="M16.6563 19.9268C14.7332 19.9268 13.1686 18.3622 13.1686 16.4391C13.1686 15.961 13.2664 15.4938 13.4402 15.0809C12.1907 15.6133 11.3107 16.8519 11.3107 18.2861C11.3107 20.2093 12.8753 21.7739 14.7984 21.7739C16.2435 21.7739 17.4821 20.8938 18.0036 19.6443C17.6016 19.829 17.1344 19.9268 16.6563 19.9268Z" fill="white"/> <path d="M17.9059 36.9634C16.4608 36.9634 15.2982 35.79 15.2982 34.3557C15.2982 33.9863 15.3743 33.6386 15.5155 33.3235C14.592 33.7256 13.9401 34.6491 13.9401 35.7248C13.9401 37.1698 15.1135 38.3324 16.5477 38.3324C17.6234 38.3324 18.5469 37.6805 18.9489 36.757C18.623 36.8873 18.2753 36.9634 17.9059 36.9634Z" fill="white"/> <path d="M33.0954 41.8093C35.0216 41.8093 36.5831 40.2477 36.5831 38.3215C36.5831 36.3953 35.0216 34.8338 33.0954 34.8338C31.1692 34.8338 29.6077 36.3953 29.6077 38.3215C29.6077 40.2477 31.1692 41.8093 33.0954 41.8093Z" fill="#6CE2FF"/> <path d="M34.9425 39.9513C33.0193 39.9513 31.4547 38.3867 31.4547 36.4636C31.4547 35.9855 31.5525 35.5183 31.7264 35.1054C30.4769 35.6378 29.5968 36.8765 29.5968 38.3107C29.5968 40.2338 31.1614 41.7984 33.0845 41.7984C34.5296 41.7984 35.7682 40.9183 36.2898 39.6688C35.8877 39.8535 35.4314 39.9513 34.9425 39.9513Z" fill="white"/> <path d="M27.8063 22.9281C27.9601 21.9804 27.3165 21.0874 26.3688 20.9336C25.421 20.7798 24.5281 21.4234 24.3743 22.3711C24.2205 23.3188 24.864 24.2118 25.8118 24.3656C26.7595 24.5194 27.6525 23.8758 27.8063 22.9281Z" fill="#6CE2FF"/> <path d="M42.6785 35.6487C42.798 35.6487 42.9284 35.6161 43.0371 35.5618C43.4391 35.3553 43.602 34.8664 43.4065 34.4644L42.5373 32.726C42.3308 32.3239 41.8419 32.161 41.4399 32.3565C41.0379 32.563 40.8749 33.0519 41.0705 33.4539L41.9397 35.1924C42.0918 35.4857 42.3743 35.6487 42.6785 35.6487Z" fill="white"/> <path d="M33.0954 30.4225C33.2149 30.4225 33.3453 30.39 33.4539 30.3356L35.1923 29.4664C35.5944 29.26 35.7573 28.771 35.5618 28.369C35.3553 27.967 34.8664 27.804 34.4644 27.9996L32.726 28.8688C32.3239 29.0753 32.161 29.5642 32.3565 29.9662C32.5087 30.2596 32.802 30.4225 33.0954 30.4225Z" fill="white"/> <path d="M8.85515 28.2386C8.9964 28.5211 9.28976 28.6841 9.58312 28.6841C9.70263 28.6841 9.83302 28.6515 9.94167 28.5972C10.3437 28.3908 10.5067 27.9018 10.3111 27.4998L9.44187 25.7614C9.23543 25.3594 8.7465 25.1964 8.34449 25.392C7.94247 25.5984 7.7795 26.0873 7.97507 26.4894L8.85515 28.2386Z" fill="white"/> <path d="M22.2845 41.9505L20.5461 42.8197C20.1441 43.0262 19.9811 43.5151 20.1767 43.9171C20.3179 44.1996 20.6113 44.3626 20.9046 44.3626C21.0242 44.3626 21.1545 44.33 21.2632 44.2757L23.0016 43.4064C23.4036 43.2 23.5666 42.7111 23.371 42.3091C23.1755 41.907 22.6865 41.7441 22.2845 41.9505Z" fill="white"/> <path d="M23.2189 9.00724L22.3497 8.13802C22.0346 7.82293 21.5131 7.82293 21.198 8.13802C20.8829 8.45311 20.8829 8.97464 21.198 9.28973L22.0672 10.1589C22.2302 10.3219 22.4366 10.398 22.6431 10.398C22.8495 10.398 23.0559 10.3219 23.2189 10.1589C23.5449 9.84385 23.5449 9.32233 23.2189 9.00724Z" fill="white"/> <path d="M19.4596 28.1626C19.1445 28.4777 19.1445 28.9992 19.4596 29.3143L20.3288 30.1835C20.4918 30.3465 20.6982 30.4226 20.9047 30.4226C21.1111 30.4226 21.3175 30.3465 21.4805 30.1835C21.7956 29.8684 21.7956 29.3469 21.4805 29.0318L20.6113 28.1626C20.2853 27.8475 19.7747 27.8475 19.4596 28.1626Z" fill="white"/> <path d="M29.6729 47.0354V47.9046C29.6729 48.3501 30.0423 48.7195 30.4877 48.7195C30.9332 48.7195 31.3026 48.3501 31.3026 47.9046V47.0354C31.3026 46.5899 30.9332 46.2205 30.4877 46.2205C30.0423 46.2205 29.6729 46.5791 29.6729 47.0354Z" fill="white"/> <path d="M25.8374 15.3851L26.7067 14.5159C27.0217 14.2008 27.0217 13.6793 26.7067 13.3642C26.3916 13.0491 25.87 13.0491 25.5549 13.3642L24.6857 14.2334C24.3706 14.5485 24.3706 15.07 24.6857 15.3851C24.8487 15.5481 25.0551 15.6241 25.2616 15.6241C25.468 15.6241 25.6745 15.5372 25.8374 15.3851Z" fill="white"/> </g> <defs> <clipPath id="clip0"> <rect width="54" height="54" fill="white"/> </clipPath> </defs> </svg></div></div><div fs-cc="interaction" class="fs-cc-manager_trigger"></div></div><div fs-cc-scroll="disable" fs-cc="preferences" class="fs-cc-prefs_component w-form"><form id="cookie-preferences" name="wf-form-Cookie-Preferences" data-name="Cookie Preferences" method="get" class="fs-cc-prefs_form" data-wf-page-id="66751e4b207cfc03aafd3433" data-wf-element-id="25c9b353-1b2e-0231-fe50-01f1a7f34005"><div fs-cc="close" class="fs-cc-prefs_close"><div class="fs-cc-prefs_close-icon w-embed"><svg fill="currentColor" aria-hidden="true" focusable="false" viewBox="0 0 16 24"> <path d="M9.414 8l4.293-4.293-1.414-1.414L8 6.586 3.707 2.293 2.293 3.707 6.586 8l-4.293 4.293 1.414 1.414L8 9.414l4.293 4.293 1.414-1.414L9.414 8z"></path> </svg></div></div><div class="fs-cc-prefs_content"><div class="fs-cc-prefs_space-small"><div class="fs-cc-prefs_title">Privacy Preference Center</div></div><div class="fs-cc-prefs_space-small"><div class="fs-cc-prefs_text">When you visit websites, they may store or retrieve data in your browser. This storage is often necessary for the basic functionality of the website. The storage may be used for marketing, analytics, and personalization of the site, such as storing your preferences. Privacy is important to us, so you have the option of disabling certain types of storage that may not be necessary for the basic functioning of the website. Blocking categories may impact your experience on the website.</div></div><div class="fs-cc-prefs_space-medium"><div fs-cc="deny" class="cookie-pref-button reject">Reject all cookies</div><div fs-cc="allow" class="cookie-pref-button">Allow all cookies</div></div><div class="fs-cc-prefs_space-small"><div class="fs-cc-prefs_title">Manage Consent Preferences by Category</div></div><div class="fs-cc-prefs_option"><div class="fs-cc-prefs_toggle-wrapper"><div class="fs-cc-prefs_label">Essential</div><div class="fs-cc-prefs_text"><strong>Always Active</strong></div></div><div class="fs-cc-prefs_text">These items are required to enable basic website functionality.</div></div><div class="fs-cc-prefs_option"><div class="fs-cc-prefs_toggle-wrapper"><div class="fs-cc-prefs_label">Marketing</div><label class="w-checkbox fs-cc-prefs_checkbox-field"><input type="checkbox" name="marketing-2" id="marketing-2" data-name="Marketing 2" fs-cc-checkbox="marketing" class="w-checkbox-input fs-cc-prefs_checkbox"/><span for="marketing-2" class="fs-cc-prefs_checkbox-label w-form-label">Essential</span><div class="fs-cc-prefs_toggle"></div></label></div><div class="fs-cc-prefs_text">These items are used to deliver advertising that is more relevant to you and your interests. They may also be used to limit the number of times you see an advertisement and measure the effectiveness of advertising campaigns. Advertising networks usually place them with the website operator’s permission.</div></div><div class="fs-cc-prefs_option"><div class="fs-cc-prefs_toggle-wrapper"><div class="fs-cc-prefs_label">Personalization</div><label class="w-checkbox fs-cc-prefs_checkbox-field"><input type="checkbox" name="personalization-2" id="personalization-2" data-name="Personalization 2" fs-cc-checkbox="personalization" class="w-checkbox-input fs-cc-prefs_checkbox"/><span for="personalization-2" class="fs-cc-prefs_checkbox-label w-form-label">Essential</span><div class="fs-cc-prefs_toggle"></div></label></div><div class="fs-cc-prefs_text">These items allow the website to remember choices you make (such as your user name, language, or the region you are in) and provide enhanced, more personal features. For example, a website may provide you with local weather reports or traffic news by storing data about your current location.</div></div><div class="fs-cc-prefs_option"><div class="fs-cc-prefs_toggle-wrapper"><div class="fs-cc-prefs_label">Analytics</div><label class="w-checkbox fs-cc-prefs_checkbox-field"><input type="checkbox" name="analytics-2" id="analytics-2" data-name="Analytics 2" fs-cc-checkbox="analytics" class="w-checkbox-input fs-cc-prefs_checkbox"/><span for="analytics-2" class="fs-cc-prefs_checkbox-label w-form-label">Essential</span><div class="fs-cc-prefs_toggle"></div></label></div><div class="fs-cc-prefs_text">These items help the website operator understand how its website performs, how visitors interact with the site, and whether there may be technical issues. This storage type usually doesn’t collect information that identifies a visitor.</div></div><div class="fs-cc-prefs_buttons-wrapper"><div fs-cc="submit" class="cookie-pref-button">Confirm my preferences and close</div></div><input type="submit" data-wait="Please wait..." class="fs-cc-prefs_submit-hide w-button" value="Submit"/><div class="w-embed"><style> /* smooth scrolling on iOS devices */ .fs-cc-prefs_content{-webkit-overflow-scrolling: touch} </style></div></div></form><div class="w-form-done"></div><div class="w-form-fail"></div><div fs-cc="close" class="fs-cc-prefs_overlay"></div><div fs-cc="interaction" class="fs-cc-prefs_trigger"></div></div><div class="hide"></div></div></div><script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=666bc9172254723eadc4af82" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/js/webflow.schunk.4a394eb5af8156f2.js" type="text/javascript"></script><script src="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/js/webflow.schunk.8085171f981a85d3.js" type="text/javascript"></script><script src="https://cdn.prod.website-files.com/666bc9172254723eadc4af82/js/webflow.dd6e4937.21e5a6e92997484f.js" type="text/javascript"></script><!-- Userflow initialization and identification (For All Pages) --> <script nonce="68a4db1c-aead-432a-b3bb-f1066735b2f6"> !function () { var e = "undefined" == typeof window ? {} : window, t = e.userflow, r = e.history; function n(t, n) { return function () { var o = new CustomEvent(n), s = Array.prototype.slice.call(arguments), a = t.apply(r, s); return e.dispatchEvent(o), a } } if (r) { e.__userflowStatePatched = !0; var o = r.pushState, s = r.replaceState; r.pushState = n(o, "userflow:pushstate"), r.replaceState = n(s, "userflow:replacestate") } if (!t) { var a = "https://js.userflow.com/", l = null; t = e.userflow = { _stubbed: !0, load: function () { return l || (l = new Promise((function (t, r) { var n = document.createElement("script"); n.async = !0; var o = e.USERFLOWJS_ENV_VARS || {}; "es2020" === (o.USERFLOWJS_BROWSER_TARGET || function (e) { for (var t = [[/Edg\//, /Edg\/(\d+)/, 80], [/OPR\//, /OPR\/(\d+)/, 67], [/Chrome\//, /Chrome\/(\d+)/, 80], [/CriOS\//, /CriOS\/(\d+)/, 100], [/Safari\//, /Version\/(\d+)/, 14], [/Firefox\//, /Firefox\/(\d+)/, 74]], r = 0; r < t.length; r++) { var n = t[r], o = n[0], s = n[1], a = n[2]; if (e.match(o)) { var l = e.match(new RegExp(s)); if (l && parseInt(l[1], 10) >= a) return "es2020"; break } } return "legacy" }(navigator.userAgent)) ? (n.type = "module", n.src = o.USERFLOWJS_ES2020_URL || a + "es2020/userflow.js") : n.src = o.USERFLOWJS_LEGACY_URL || a + "legacy/userflow.js", n.onload = function () { t() }, n.onerror = function () { document.head.removeChild(n), l = null; var e = new Error("Could not load Userflow.js"); console.warn(e.message), r(e) }, document.head.appendChild(n) }))), l } }; var u = e.USERFLOWJS_QUEUE = e.USERFLOWJS_QUEUE || [], i = function (e) { t[e] = function () { var r = Array.prototype.slice.call(arguments); t.load(), u.push([e, null, r]) } }, c = function (e) { t[e] = function () { var r, n = Array.prototype.slice.call(arguments); t.load(); var o = new Promise((function (e, t) { r = { resolve: e, reject: t } })); return u.push([e, r, n]), o } }, d = function (e, r) { t[e] = function () { return r } }; i("_setTargetEnv"), i("closeResourceCenter"), i("disableEvalJs"), i("init"), i("off"), i("on"), i("prepareAudio"), i("registerCustomInput"), i("remount"), i("reset"), i("setBaseZIndex"), i("setCustomInputSelector"), i("setCustomNavigate"), i("setCustomScrollIntoView"), i("setInferenceAttributeFilter"), i("setInferenceAttributeNames"), i("setInferenceClassNameFilter"), i("setResourceCenterLauncherHidden"), i("setScrollPadding"), i("setServerEndpoint"), i("setShadowDomEnabled"), i("setPageTrackingDisabled"), i("setUrlFilter"), i("setLinkUrlDecorator"), i("openResourceCenter"), i("toggleResourceCenter"), c("endAll"), c("endAllFlows"), c("endChecklist"), c("group"), c("identify"), c("identifyAnonymous"), c("start"), c("startFlow"), c("startWalk"), c("track"), c("updateGroup"), c("updateUser"), d("getResourceCenterState", null), d("isIdentified", !1) } }(); userflow.init('evao4c7wsve27lu324gtqrtfia') userflow.identify( 'visitor-6cb4e048-408f-4376-af65-a43fe0873aef', { user_type: 'visitor' }, { signature: '2353b8f7a7dd6989a24a6d32a31d4cb9d61b642cd06328dc164182891824bb3e' } ) </script> <script> window.intercomSettings = { api_base: "https://api-iam.intercom.io", app_id: "yq7qhyvw", }; </script> <script> // We pre-filled your app ID in the widget URL: 'https://widget.intercom.io/widget/yq7qhyvw' (function () { var w = window; var ic = w.Intercom; if (typeof ic === "function") { ic('reattach_activator'); ic('update', w.intercomSettings); } else { var d = document; var i = function () { i.c(arguments); }; i.q = []; i.c = function (args) { i.q.push(args); }; w.Intercom = i; var l = function () { var s = d.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = 'https://widget.intercom.io/widget/yq7qhyvw'; var x = d.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); }; if (document.readyState === 'complete') { l(); } else if (w.attachEvent) { w.attachEvent('onload', l); } else { w.addEventListener('load', l, false); } } })(); </script> <!--Script to toggle the display of elements with the 'security-policies' class based on the current page (For Security Single Page)--> <script> document.addEventListener('DOMContentLoaded', function () { function isSecurityPoliciesPage() { return window.location.pathname === '/policies/security'; } function toggleSecurityPolicies() { const securityPoliciesElements = document.querySelectorAll('.security-policies'); if (isSecurityPoliciesPage()) { securityPoliciesElements.forEach(element => { element.style.display = 'block'; }); } else { securityPoliciesElements.forEach(element => { element.style.display = 'none'; }); } } toggleSecurityPolicies(); window.addEventListener('popstate', toggleSecurityPolicies); }); </script> <!-- JavaScript code to handle Nav Header Colour Changing Functionality (For All Pages) --> <script> const heroSection = document.querySelector('.hero-section'); if (heroSection) { const headerSticky = document.querySelector('.header-stickey'); const svgPaths = document.querySelectorAll('.header-stickey .nav-whole-area .container .navbar-area .brand-link .w-embed svg path'); // Select all elements to apply the 'dark' class const navbar = document.querySelector('.header-stickey .nav-whole-area .navbar'); const navMenuLinks = document.querySelectorAll('.header-stickey .nav-whole-area .container .navbar-area .nav-menu .nav-menu-wrap .nav-link'); const navDropdownLinks = document.querySelectorAll('.nav-dropdown-link'); // New selector const navIconsLight = document.querySelectorAll('.nav-icon-light'); const navIconsDark = document.querySelectorAll('.nav-icon-dark'); const navMenuNavigation = document.querySelector('.nav-menu.navigation'); // Initial setup - apply dark mode to elements svgPaths.forEach(path => { path.style.fill = '#fff'; }); navbar.classList.add('dark'); navMenuLinks.forEach(link => { link.classList.add('dark'); }); navDropdownLinks.forEach(link => { link.classList.add('dark'); }); // Apply dark class to dropdown links navIconsLight.forEach(icon => { icon.classList.add('dark'); }); navIconsDark.forEach(icon => { icon.classList.add('dark'); }); if (navMenuNavigation) navMenuNavigation.classList.add('dark'); const heroSectionHeight = heroSection.offsetHeight; let scrolledIntoHero = false; window.addEventListener('scroll', function () { const scrollPosition = window.scrollY; const heroTop = heroSection.offsetTop; const heroBottom = heroSection.offsetTop + heroSectionHeight; if (scrollPosition >= heroTop && scrollPosition <= heroBottom) { if (!scrolledIntoHero) { // Apply dark mode to elements svgPaths.forEach(path => { path.style.fill = '#fff'; }); navbar.classList.add('dark'); navMenuLinks.forEach(link => { link.classList.add('dark'); }); navDropdownLinks.forEach(link => { link.classList.add('dark'); }); // Apply dark class to dropdown links navIconsLight.forEach(icon => { icon.classList.add('dark'); }); navIconsDark.forEach(icon => { icon.classList.add('dark'); }); if (navMenuNavigation) navMenuNavigation.classList.add('dark'); scrolledIntoHero = true; } } else { if (scrolledIntoHero) { // Remove dark mode from elements svgPaths.forEach(path => { path.style.fill = ''; }); navbar.classList.remove('dark'); navMenuLinks.forEach(link => { link.classList.remove('dark'); }); navDropdownLinks.forEach(link => { link.classList.remove('dark'); }); // Remove dark class from dropdown links navIconsLight.forEach(icon => { icon.classList.remove('dark'); }); navIconsDark.forEach(icon => { icon.classList.remove('dark'); }); if (navMenuNavigation) navMenuNavigation.classList.remove('dark'); scrolledIntoHero = false; } } }); function resetFunctionalities() { svgPaths.forEach(path => { path.style.fill = ''; }); navbar.classList.remove('dark'); navMenuLinks.forEach(link => { link.classList.remove('dark'); }); navDropdownLinks.forEach(link => { link.classList.remove('dark'); }); // Reset dark class on dropdown links navIconsLight.forEach(icon => { icon.classList.remove('dark'); }); navIconsDark.forEach(icon => { icon.classList.remove('dark'); }); if (navMenuNavigation) navMenuNavigation.classList.remove('dark'); scrolledIntoHero = false; } } </script> <!-- Function to add the box-shadow class on scroll --> <script> function addBoxShadowOnScroll() { const navElement = document.querySelector('.nav-whole-area'); if (!navElement) return; // Exit if the element is not found window.addEventListener('scroll', () => { if (window.scrollY > 0) { navElement.classList.add('box-shadow'); } else { navElement.classList.remove('box-shadow'); } }); } addBoxShadowOnScroll(); </script> <!--Cookie notice functionality <script> import { uLocalStorage } from '../../shared/util/local-storage-wrapper'; const key = 'cookieNoticeDismissed'; if (!uLocalStorage.getItem(key)) { const div = document.createElement('div'); div.className = 'cookie-notice mdh-16'; div.innerHTML = ` <div> We use cookies to help us improve userflow.com </div> <a href="/policies/privacy">Learn more</a>`; document.body.appendChild(div); const button = document.getElementById('cookie-notice-accept')!; button.addEventListener('click', e => { e.preventDefault(); document.body.removeChild(div); uLocalStorage.setItem(key, '1'); }); } </script>--> <script> // Helpers to manipulate localStorage, which also work in tests running in // Node.js environment class StorageWrapper { constructor(type) { this.type = type; this.testState = {}; } formatKey(key) { return `userflow:${key}`; } isSupported() { if (process.env.NODE_ENV === 'test') { return true; } if (typeof window === 'undefined') { return false; } // Check if access is denied by the browser try { return window[this.type] != null; } catch { return false; } } getItem(key) { key = this.formatKey(key); if (process.env.NODE_ENV === 'test') { const v = this.testState[key]; return v == null ? null : v; } else { if (!this.isSupported()) { return null; } return window[this.type].getItem(key); } } setItem(key, value) { key = this.formatKey(key); if (process.env.NODE_ENV === 'test') { this.testState[key] = value; } else { if (!this.isSupported()) { return; } window[this.type].setItem(key, value); } } removeItem(key) { key = this.formatKey(key); if (process.env.NODE_ENV === 'test') { delete this.testState[key]; } else { if (!this.isSupported()) { return; } return window[this.type].removeItem(key); } } clear() { if (process.env.NODE_ENV === 'test') { this.testState = {}; } else { if (!this.isSupported()) { return; } return window[this.type].clear(); } } } const uLocalStorage = new StorageWrapper('localStorage'); const uSessionStorage = new StorageWrapper('sessionStorage'); </script> <!-- Start of HubSpot Embed Code --> <script type="text/javascript" id="hs-script-loader" async defer src="//js.hs-scripts.com/9255119.js"></script> <!-- End of HubSpot Embed Code --> <script> function emptyToNull(val) { if (val === "" || val === undefined) { return null; } return val; } function buildEvent(input, annotations) { var attributes = input.attributes; var path = attributes.path; var event = { metadata: { schema_name: "marketing_routes", }, attributes: { host: emptyToNull(attributes.host), path: emptyToNull(attributes.path), hash_path: emptyToNull(attributes.hash_path), referrer: emptyToNull(attributes.referrer), search: emptyToNull(attributes.search), }, annotations: annotations, }; return event; } function send(geminiEvent) { var xhr = new XMLHttpRequest(); xhr.responseType = "json"; xhr.open("POST", "https://app.userflow.com/gemini-collector"); xhr.setRequestHeader("content-type", "application/json"); xhr.setRequestHeader("accept", "application/json"); xhr.withCredentials = true; return new Promise(function (res) { xhr.onload = function () { return res(xhr.response); }; xhr.send(JSON.stringify(geminiEvent)); }); } function trackPageView() { var attributes = { host: location.host, path: location.pathname, hash_path: location.hash, referrer: document.referrer, search: location.search, }; var event = buildEvent({ attributes: attributes, }); send(event).catch(function (Err) { console.log("Gemini error: ", Err); }); } trackPageView(); </script> <!-- FS Cookie Consent --> <!-- Finsweet Cookie Consent --> <script async src="https://cdn.jsdelivr.net/npm/@finsweet/cookie-consent@1/fs-cc.js" fs-cc-mode="opt-in"></script> <script> // Function to handle style changes for label wrap on focus function setupFeatureSearchStyleChanges() { // Select the input and label wrap elements const searchField = document.querySelector('.feature-search-field'); const labelTextWrap = document.getElementById('labelTextWrap'); // Check if both elements exist if (!searchField || !labelTextWrap) return; // Media query to check if screen width is below 480px const isMobileView = () => window.innerWidth < 480; // Function to apply styles on focus const applyFocusStyles = () => { if (isMobileView()) { labelTextWrap.style.borderColor = 'transparent'; } }; // Function to reset styles when focus is lost const resetStyles = () => { if (isMobileView()) { labelTextWrap.style.borderColor = ''; // Reset to original } }; // Add event listeners for focus and blur searchField.addEventListener('focus', applyFocusStyles); searchField.addEventListener('blur', resetStyles); // Handle responsive design changes window.addEventListener('resize', () => { if (!isMobileView()) { labelTextWrap.style.borderColor = ''; // Reset on larger screens } }); } // Run the setup when the DOM is fully loaded document.addEventListener('DOMContentLoaded', setupFeatureSearchStyleChanges); </script> <!-- Sub nav Code --> <script> // Selectors for product sections and Table of Contents (ToC) links const wrapper = document.querySelector('.product-whole-wrapper'); const customerSections = wrapper.querySelectorAll('.customer-section, .product-section'); const tocLinks = document.querySelectorAll('.product-toc-link'); const tocWrap = document.querySelector('.product-toc-links-wrap'); const leftArrow = document.querySelector('.sub-nav-arrow-wrap.left-arrow'); const rightArrow = document.querySelector('.sub-nav-arrow-wrap.right-arrow'); // Assign IDs to each customer section dynamically customerSections.forEach((section, index) => { const sectionId = `customer-section-${index + 1}`; section.setAttribute('id', sectionId); }); // Add smooth and immediate scrolling to ToC links if (tocLinks.length === customerSections.length) { tocLinks.forEach((link, index) => { link.addEventListener('click', () => { const targetId = `#customer-section-${index + 1}`; const targetSection = document.querySelector(targetId); if (targetSection) { targetSection.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); } // Observe sections for visibility and toggle active class on ToC links const observerOptions = { root: null, rootMargin: '0px', threshold: 0.5, }; const observerCallback = (entries) => { entries.forEach((entry) => { const sectionIndex = Array.from(customerSections).indexOf(entry.target); if (entry.isIntersecting) { tocLinks.forEach((link, i) => { link.classList.toggle('active', i === sectionIndex); }); // Trigger custom "classChange" event for jQuery handling $(link).trigger("classChange"); } }); }; const observer = new IntersectionObserver(observerCallback, observerOptions); customerSections.forEach((section) => observer.observe(section)); // Handle horizontal scrolling for ToC links const childElements = Array.from(tocWrap.children); const averageChildWidth = childElements.reduce((total, el) => total + el.offsetWidth, 0) / childElements.length; const scrollContainer = (direction) => { const scrollAmount = direction === 'left' ? -averageChildWidth : averageChildWidth; tocWrap.scrollBy({ left: scrollAmount, behavior: 'smooth' }); }; leftArrow.addEventListener('click', () => scrollContainer('left')); rightArrow.addEventListener('click', () => scrollContainer('right')); $(document).ready(function () { // Function to scroll the active element into view with smooth scrolling const scrollToActiveElement = () => { const container = $(".product-toc-links-wrap"); const activeElement = container.find(".active"); if (activeElement.length) { const containerScrollLeft = container.scrollLeft(); const containerWidth = container.width(); const elementOffsetLeft = activeElement.position().left + containerScrollLeft; const elementWidth = activeElement.outerWidth(); // Check if the active element is out of view on the left side if (elementOffsetLeft < containerScrollLeft) { container.animate({ scrollLeft: elementOffsetLeft }, 50); // Smooth scroll to the left } // Check if the active element is out of view on the right side else if (elementOffsetLeft + elementWidth > containerScrollLeft + containerWidth) { container.animate( { scrollLeft: elementOffsetLeft + elementWidth - containerWidth }, 50 // Smooth scroll to the right ); } } }; // Call the function initially to align any pre-existing active element scrollToActiveElement(); // Re-align when the active class changes dynamically $(".product-toc-link").on("classChange", () => scrollToActiveElement()); // Optional: Observe for mutations to automatically handle class changes const mutationObserver = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === "attributes" && mutation.attributeName === "class") { scrollToActiveElement(); } }); }); $(".product-toc-link").each(function () { mutationObserver.observe(this, { attributes: true }); }); }); </script></body></html>