PageSourceSearch

https://bookboon.com/en/about-us

html bookboon.com collected 2026-10-01 10:20:41 UTC 31,920 bytes, 634 lines download raw bytes

1<!DOCTYPE html>
2<html lang='en'>
3<head prefix="">
4            <meta charset="UTF-8"/>
5        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
6        <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
7
8        <title>About Us</title>
9
10        <link rel="icon" type="image/x-icon" href="/favicon.ico" />
11        <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
12        <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
13        <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
14        <link rel="manifest" href="/site.webmanifest" />
15        <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5" />
16        <meta name="msapplication-TileColor" content="#da532c" />
17        <meta name="theme-color" content="#ffffff" />
18        <meta name="facebook-domain-verification" content="kbnxoiau6tkqb01lt513hmwdi9i9py" />
19        <link href="/app/frontend/main-e00cc81c.css" rel="stylesheet" type="text/css"/>
20        <link rel="dns-prefetch" href="https://cdn.bookboon.io">
21        <link rel="dns-prefetch" href="https://cdn.jsdelivr.net">
22        <link rel="dns-prefetch" href="https://dev.visualwebsiteoptimizer.com">
23        <link rel="dns-prefetch" href="https://a.omappapi.com">
24        
24<script type="text/javascript" src="https://cdn.bookboon.io/boont-v1.min.js" defer onload="initializeBoontrackIfNeeded()"></script>
24
25        
25<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cookieconsent.umd.js" defer></script>
25
26        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/cookieconsent.css">
27        
27<script type="text/javascript">
28/**
29 * Check if both required consent cookies exist
30 * @returns {boolean} true if both cc_cookie and acceptCookies exist
31 */
32function hasValidConsentCookies() {
33    if (typeof document === 'undefined') {
34        return false; // No consent on server-side
35    }
36
37    const cookies = document.cookie.split(';');
38
39    // Check if cc_cookie exists (the library's consent cookie)
40    const hasCcCookie = cookies.some((cookie) =>
41        cookie.trim().startsWith('cc_cookie=')
42    );
43
44    // Check if acceptCookies exists (our custom cookie)
45    const hasAcceptCookies = cookies.some((cookie) =>
46        cookie.trim().startsWith('acceptCookies=')
47    );
48
49    // Both cookies must exist for consent to be valid
50    return hasCcCookie && hasAcceptCookies;
51}
52
53/**
54 * Check if user has given cookie consent (for banner display logic)
55 * @returns {boolean} true if user has given consent, false if banner should show
56 */
57function hasGivenCookieConsent() {
58    return hasValidConsentCookies();
59}
60
61/**
62 * Check if a specific cookie category is accepted (for analytics loading)
63 * @param {string} category - The category to check (e.g., 'functional', 'analytics')
64 * @returns {boolean} true if category is accepted and consent is valid
65 */
66function isCategoryAccepted(category) {
67    if (!hasValidConsentCookies()) {
68        return false; // No valid consent
69    }
70
71    // Check if CookieConsent library is available and category is accepted
72    if (
73        typeof window.CookieConsent !== 'undefined' &&
74        window.CookieConsent.acceptedCategory
75    ) {
76        return window.CookieConsent.acceptedCategory(category);
77    }
78
79    return false;
80}
81
82/**
83 * Configure boontrack with current application settings
84 * This function calls getCurrentApp() and actionReceiverUrl directly from Twig
85 * and respects user's cookie consent choices
86 * @param {Object} acceptCookies - Optional acceptCookies object from React component
87 */
88function configureBoontrack(acceptCookies) {
89    if (window.boontrack) {
90        let trackPageView = false;
91        
92        // If acceptCookies object is provided (from React), use it directly
93        if (acceptCookies && typeof acceptCookies === 'object') {
94            trackPageView = acceptCookies.STATISTICAL || false;
95        } else {
96            // Try to get user's consent choices from CookieConsent library
97            if (typeof window.CookieConsent !== 'undefined' && 
98                window.CookieConsent.acceptedCategory && 
99                window.CookieConsent.acceptedCategory('analytics')) {
100                trackPageView = true;
101            } else {
102                // Fallback: parse acceptCookies cookie for other cases
103                const cookies = document.cookie.split(';');
104                const acceptCookiesCookie = cookies.find(cookie => 
105                    cookie.trim().startsWith('acceptCookies=')
106                );
107                
108                if (acceptCookiesCookie) {
109                    try {
110                        const acceptCookiesJson = acceptCookiesCookie.split('=')[1];
111                        const acceptCookies = JSON.parse(decodeURIComponent(acceptCookiesJson));
112                        trackPageView = acceptCookies.STATISTICAL || false;
113                    } catch (e) {
114                        // If parsing fails, default to false
115                        trackPageView = false;
116                    }
117                }
118            }
119        }
120        
121        boontrack.configure({
122            application: '855abac0499c28e3',
123            receiverUrl: 'https://boont.co/action',            langCode: document.documentElement.lang || 'en',
124            trackPageView: trackPageView, // Respect user's actual choices
125            featureFlags: window.features || {}
126        });
127
128        if (window.user && window.user.id) {
129            boontrack.setUserID(window.user.id);
130            if (boontrack.setOrganisationID && window.user.organisationId) {
131                boontrack.setOrganisationID(window.user.organisationId);
132            }
133            if (boontrack.setAccessUserID && window.user.accessUserId) {
134                boontrack.setAccessUserID(window.user.accessUserId);
135            }
136        }
137    }
138}
139
140// Make functions available globally
141window.hasValidConsentCookies = hasValidConsentCookies;
142window.hasGivenCookieConsent = hasGivenCookieConsent;
143window.isCategoryAccepted = isCategoryAccepted;
144window.configureBoontrack = configureBoontrack;
145</script>
145
146        
146<script type="text/javascript">var features = {"new-library-page":true,"intercom":true,"nanos":true,"video-podcasts":true,"playlists":true,"wootric":true,"languages-v2":true,"use-new-deep-links":true,"evo-tab-new-logo":true,"premium-upsell":true,"show-french-content":true,"no-interface-language":true,"light-mode-toggle":true,"library-mimir-only":true};</script>
146
147
148        
148<script type="text/javascript">
149            function cookieToObject(cookies) {
150                var cookieObj = {}
151                var cookieArr = cookies.split(';')
152                for (i = 0; i < cookieArr.length; i++) {
153                    var elementTuple = cookieArr[i].split('=');
154                    var cookieValue = elementTuple[1]
155                    try {
156                        cookieValue = JSON.parse(cookieValue)
157                    } catch {
158                        cookieValue = cookieValue
159                    }
160                    cookieObj[elementTuple[0].trim()] = cookieValue;
161                }
162                return cookieObj;
163            }
164
165            var pageLocale = 'en';
166            var locale = 'en';
167            var cookies = cookieToObject(document.cookie);
168            var head = document.getElementsByTagName('head')[0];
169
170            if (typeof CookieConsent !== 'undefined' && hasValidConsentCookies() && CookieConsent.acceptedCategory('analytics')) {
171                var link = document.createElement('link');
172                link.rel = 'preconnect';
173                link.href = 'https://dev.visualwebsiteoptimizer.com';
174                head.appendChild(link);
175
176                var scriptVWO = document.createElement('script');
177                scriptVWO.type = 'text/javascript';
178                scriptVWO.id = 'vwoCode';
179                scriptVWO.defer = true;
180                scriptVWO.innerHTML = `
181                window._vwo_code || (function() {
182                    var account_id=777880,
183                    version=2.0,
184                    settings_tolerance=2000,
185                    hide_element='body',
186                    hide_element_style = 'opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important',
187                    /* DO NOT EDIT BELOW THIS LINE */
188                    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={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(){return typeof cc.hE==='string'?cc.hE:hide_element},getVersion:function(){return version},finish:function(){if(!f){f=true;var e=d.getElementById('_vis_opt_path_hides');if(e)e.parentNode.removeChild(e)}},finished:function(){return f},load:function(e){var t=this.getSettings(),n=d.createElement('script'),i=this;if(t){n.textContent=t;d.getElementsByTagName('head')[0].appendChild(n);if(!w.VWO||VWO.caE){stT.removeItem(cK);i.load(e)}}else{n.fetchPriority='high';n.src=e;n.type='text/javascript';n.onerror=function(){_vwo_code.finish()};d.getElementsByTagName('head')[0].appendChild(n)}},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=d.currentScript,n=d.createElement('style'),i=this.hide_element(),r=t&&!t.async&&i?i+this.hide_element_style():'',c=d.getElementsByTagName('head')[0];n.setAttribute('id','_vis_opt_path_hides');v&&n.setAttribute('nonce',v.nonce);n.setAttribute('type','text/css');if(n.styleSheet)n.styleSheet.cssText=r;else n.appendChild(d.createTextNode(r));c.appendChild(n);this.load('https://dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&vn='+version)}};w._vwo_code=code;code.init();
189                })();
190                `;
191                head.appendChild(scriptVWO);
192
193                var loadOM = function(d,u,ac){var s=d.createElement('script');s.type='text/javascript';s.src='https://a.omappapi.com/app/js/api.min.js';s.async=true;s.defer=true;s.dataset.user=u;s.dataset.account=ac;d.getElementsByTagName('head')[0].appendChild(s);}
194                loadOM(document,59271,66764);
195            }
196
197            // Function to initialize boontrack after script loads
198            window.initializeBoontrackIfNeeded = function() {
199                if (typeof CookieConsent !== 'undefined' && hasValidConsentCookies() && CookieConsent.acceptedCategory('functional')) {
200                    if (window.configureBoontrack) {
201                        window.configureBoontrack();
202                    }
203                }
204            }
205        </script>
205
206    
207        
208</head>
209<body class="main">
210<div class="global-overlay"></div>
211<div class="global-menu">
212    <ul class="global-menu__items">
213        <li>
214            <a href="#" class="global-menu__items__close">
215                Close
216            </a>
217        </li>
218        <li>
219            <a href="/">
220                Home
221            </a>
222        </li>
223        <li>
224            <a href="/en/categories">
225                Categories
226            </a>
227        </li>
228        <li>
229            <a href="/en/about-us">
230                About Us
231            </a>
232        </li>
233
234        <li>
235            <div class="global-menu__language">
236                <div class="global-menu__language__selected global-menu__language__flag global-menu__language__flag--gb">
237                                                                        English
238                                                                                                        </div>
239
240                <div class="global-menu__language-options">
241                    <ul>
242                                                    <li class="global-menu__language__flag  global-menu__language__flag--active">
243                                <a class="global-menu__language__flag--gb"
244                                   href="/en">English</a>
245                            </li>
246                                                    <li class="global-menu__language__flag ">
247                                <a class="global-menu__language__flag--de"
248                                   href="/de">Deutsch</a>
249                            </li>
250                                            </ul>
251                </div>
252            </div>
253        </li>
254    </ul>
255
256    <a href="/premium/" class="global-menu__button-log-in">
257        Log in
258    </a>
259</div>
260
261
262
263    
263<script>
264    function onSearchClick() {
265        var searchField = document.getElementById('search_field');
266        boontrack.track(
267            'search.submission',
268            {
269                loggedIn: false,
270                searchQuery: searchField? searchField.value : null
271            }
272        );
273    }
274</script>
274
275
276<header class="header">
277                    <div class="header__top">
278        <button class="header__logo-menu__button" aria-label="Main menu"></button>
279        <a href="https://bookboon.com/" class="header__logo-menu__logo header__logo-menu__logo--md">
280            <img width="187px" src="/syzygy/bookboon-logo.png">
281        </a>
282        <a href="https://bookboon.com/" class="header__logo-menu__logo header__logo-menu__logo--sm">
283            <img width="187px" src="/syzygy/bookboon-logo.png">
284        </a>
285        <a class="header__links-link" href="/en/categories">Categories</a>
286        <a class="header__links-link" href="/en/about-us">About Us</a>
287
288        <form action="/en/search" method="get" class="header__search" role="search">
289            <div class="header__search__container">
290                <input type="text" name="query" value="" class="header__search__field" id="search_field"
291                       placeholder="Search all content">
292                <button type="submit"
293                        class="header__search__button"
294                        onclick="onSearchClick()"
295                >
296                    <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
297    <path d="M12.7 11.23C13.6182 10.0332 14.1109 8.56437 14.1 7.056C14.1047 6.13278 13.9273 5.21768 13.5779 4.36312C13.2285 3.50856 12.7139 2.73132 12.0637 2.0759C11.4135 1.42048 10.6404 0.899749 9.78863 0.543536C8.93688 0.187322 8.02323 0.00261814 7.1 0C5.22496 0.00127493 3.42644 0.743688 2.09648 2.06541C0.76651 3.38714 0.0129309 5.18101 0 7.056C0.0129309 8.93099 0.76651 10.7249 2.09648 12.0466C3.42644 13.3683 5.22496 14.1107 7.1 14.112C8.61752 14.1399 10.0991 13.6492 11.3 12.721L14.3 15.702C14.3906 15.7962 14.4993 15.8712 14.6196 15.9224C14.7399 15.9737 14.8693 16.0001 15 16.0001C15.1307 16.0001 15.2601 15.9737 15.3804 15.9224C15.5007 15.8712 15.6094 15.7962 15.7 15.702C15.7946 15.6126 15.87 15.5047 15.9215 15.3851C15.9731 15.2656 15.9996 15.1367 15.9996 15.0065C15.9996 14.8763 15.9731 14.7474 15.9215 14.6279C15.87 14.5083 15.7946 14.4004 15.7 14.311L12.7 11.23ZM7.1 12.03C6.43799 12.0403 5.78047 11.9196 5.16528 11.6749C4.55009 11.4301 3.98936 11.0661 3.51538 10.6038C3.04139 10.1416 2.66349 9.59011 2.40342 8.98123C2.14335 8.37236 2.00625 7.71806 2 7.056C2 5.7034 2.53732 4.40619 3.49376 3.44976C4.45019 2.49332 5.7474 1.956 7.1 1.956C8.4526 1.956 9.74981 2.49332 10.7062 3.44976C11.6627 4.40619 12.2 5.7034 12.2 7.056C12.1931 7.71764 12.0555 8.3714 11.7952 8.97969C11.5348 9.58799 11.1568 10.1388 10.6829 10.6006C10.2089 11.0623 9.64844 11.4259 9.03358 11.6703C8.41871 11.9148 7.7616 12.0353 7.1 12.025V12.03Z" fill="white"/>
298</svg>
299
300                </button>
301            </div>
302        </form>
303
304        <ul class="header__buttons">
305            <li>
306                <a href="/premium/" class="header__log-in-button">
307                    Log in
308                </a>
309            </li>
310        </ul>
311    </div>
312</header>
313
314    <div class="about-us">
315        <div class="about-us__content">
316            <div class="about-us__content-grid-left">
317                <h1>What we&#039;re all about</h1>
318                <p>At Access Bookboon, we are passionate about making learning accessible, engaging, and effective for everyone. Founded in 2005, Access Bookboon has grown into a trusted platform for professional and personal development. In 2022, we became part of The Access Group, a leading provider of business software solutions that empower organisations to achieve more. As part of Access Learning, Access Bookboon contributes to a comprehensive suite of tools designed to simplify modern L&amp;D, boost engagement, and drive workplace excellence.</p>
319            </div>
320            <div class="about-us__content-grid-image">
321                <div>
322                    <img src="/frontend/laptop.png" width="100%">
323                </div>
324            </div>
325
326            <div class="about-us__content-grid-full about-us__content-grid-quote">
327                <div class="about-us__content-grid-quote-border-top"></div>
328                <div class="about-us__content-grid-quote-inner">
329                    <p>With Access Bookboon, you’re not just buying a learning tool—you’re investing in y
329our team’s future.</p>
330                </div>
331                <div class="about-us__content-grid-quote-border-bottom"></div>
332            </div>
333
334            <div class="about-us__content-grid-image">
335                <div>
336                    <img src="/frontend/split-screen.jpg" width="100%">
337                </div>
338            </div>
339            <div class="about-us__content-grid-right">
340                <h1>Offering Opportunity and Growth</h1>
341                <p>For learners, Access Bookboon offers an unparalleled opportunity to grow and thrive on your own terms. Whether you&#039;re upskilling for work or pursuing personal interests, Access Bookboon provides a library of expertly curated content, including eBooks, audiobooks, and live classes. With topics ranging from leadership and communication to mental health and digital skills, our platform empowers you to learn at your own pace, anytime, anywhere</p>
342                <p>For organisations, Access Bookboon is the ultimate solution to foster a culture of continuous learning. Our platform helps close skill gaps, retain top talent, and unlock the full potential of teams by providing employees with the tools they need to grow and succeed. With fresh content added weekly by Subject Matter Experts (SMEs), Access Bookboon ensures your workforce stays prepared to tackle today’s business challenges.</p>
343            </div>
344
345            <div class="about-us__content-grid-full">
346                <h2>Part of The Access Group</h2>
347                <p>As part of The Access Group, Access Bookboon benefits from being integrated into one of the UK’s leading providers of business software. The Access Group supports over 75,000 organisations globally, offering innovative solutions across HR, finance, learning, and more. Together, we are committed to helping both individuals and organisations achieve their full potential by delivering impactful, accessible, and engaging learning experiences.</p>
348            </div>
349        </div>
350    </div>
351
352
353    <footer class="footer">
354                    <a class="footer__logo">
355        <img src="/syzygy/bookboon-logo.png" alt="BookBoon" class="footer__logo-image"/>
356    </a>
357
358
359    <div class="footer__menu">
360                <ul>
361            <li>
362                <a href="https://www.theaccessgroup.com/en-gb/privacy-notice-for-access-products/" class="footer__menu-link">
363                    Privacy Statement
364                </a>
365            </li>
366            <li>
367                <a href="/en/about-us" class="footer__menu-link">
368                    About Us
369                </a>
370            </li>
371            <li>
372                <a href="https://bookboon.com/blog/en/about-the-website/gdpr" class="footer__menu-link">
373                    GDPR Statement
374                </a>
375            </li>
376            <li>
377                <a href="/cookie-policy" class="footer__menu-link">
378                    Cookie Policy
379                </a>
380            </li>
381
382        </ul>
383    </div>
384
385    <div class="footer__copyright">
386        <p class="footer__logo-legend">Copyright Bookboon 2026</p>
387    </div>
388</footer>
389<script type="text/javascript">
390        // Inline utility functions (fallback when shared script not available)
391        function hasValidConsentCookies() {
392            if (typeof document === 'undefined') {
393                return false;
394            }
395            const cookies = document.cookie.split(';');
396            const hasCcCookie = cookies.some(cookie => cookie.trim().startsWith('cc_cookie='));
397            const hasAcceptCookies = cookies.some(cookie => cookie.trim().startsWith('acceptCookies='));
398            return hasCcCookie && hasAcceptCookies;
399        }
400
401        // Check if both cookies exist
402        function checkValidConsent() {
403            return hasValidConsentCookies();
404        }
405
406        // Don't initialize vanilla-cookieconsent when in iframe (tab context)
407        // In iframe context, the legacy Access Cookie Policies system handles consent
408        // Check if user is an evo customer in a tab (same logic as isEvoUserInATab in index.tsx)
409        const isEvoUserInATab = window.user?.organisationId !== undefined && window.parent !== window;
410        if (isEvoUserInATab) {
411            // In iframe context, just load the main script if consent exists
412            if (checkValidConsent()) {
413                console.log('Frontend: Loading main.js in iframe context');
414                var customScripts = document.createElement('script');
415                customScripts.type = 'text/javascript';
416                customScripts.src = "/app/frontend/main-36a32da3.js";
417                document.body.appendChild(customScripts);
418            }
419        } else if (checkValidConsent()) {
420            console.log('Frontend: Valid consent exists, loading main.js');
421            var customScripts = document.createElement('script');
422            customScripts.type = 'text/javascript';
423            customScripts.src = "/app/frontend/main-36a32da3.js";
424            document.body.appendChild(customScripts);
425        } else {
426            // Shared function to get acceptCookies object based on user preferences
427            function getAcceptCookiesFromPreferences() {
428                const userPreferences = CookieConsent.getUserPreferences();
429                const acceptType = userPreferences.acceptType;
430
431                if (acceptType === 'necessary') {
432                    return {
433                        FUNCTIONAL: true,
434                        STATISTICAL: false,
435                        MARKETING: false,
436                        FUNCTIONAL_ENHANCED: false
437                    };
438                } else if (acceptType === 'all') {
439                    return {
440                        FUNCTIONAL: true,
441                        STATISTICAL: true,
442                        MARKETING: true,
443                        FUNCTIONAL_ENHANCED: true
444                    };
445                } else {
446                    const analyticsAccepted = CookieConsent.acceptedCategory('analytics');
447                    const marketingAccepted = CookieConsent.acceptedCategory('marketing');
448                    const functionalAccepted = CookieConsent.acceptedCategory('functional');
449                    return {
450                        FUNCTIONAL: true,
451                        STATISTICAL: analyticsAccepted,
452                        MARKETING: marketingAccepted,
453                        FUNCTIONAL_ENHANCED: functionalAccepted
454                    };
455                }
456            }
457
458            // Function to initialize vanilla-cookieconsent
459            function initCookieConsent() {
460        CookieConsent.run({
461            root: 'body',
462            autoShow: true,
463            disablePageInteraction: true,
464            hideFromBots: false,
465            cookie: {
466                name: 'cc_cookie',
467                expiresAfterDays: 365
468            },
469            guiOptions: {
470                consentModal: {
471                    layout: 'box',
472                    position: 'bottom right',
473                    flipButtons: false,
474                    equalWeightButtons: true
475                },
476                preferencesModal: {
477                    layout: 'box',
478                    equalWeightButtons: true,
479                    flipButtons: false
480                }
481            },
482            categories: {
483                necessary: {
484                    enabled: true,
485                    readOnly: true
486                },
487                analytics: {
488                    enabled: false
489                },
490                marketing: {
491                    enabled: false
492                },
493                functional: {
494                    enabled: false
495                }
496            },
497            language: {
498                default: 'en',
499                translations: {
500                    en: {
501                        consentModal: {
502                            title: "This website uses cookies",
503                            description: "We use cookies to improve user experience. Choose which cookies you allow us to use. You can read more about our <a href=\"https:\/\/bookboon.com\/cookie-policy\">Cookie Policy<\/a> in our privacy policy",
504                            acceptAllBtn: "Accept all cookies",
505                            acceptNecessaryBtn: "Reject non-essential",
506                            showPreferencesBtn: "See Cookies Details",
507                            footer: '<a href="/cookie-policy" ">Cookie Policy</a>'
508                        },
509                        preferencesModal: {
510                            title: "This website uses cookies",
511                            acceptAllBtn: "Accept all cookies",
512                            acceptNecessaryBtn: "Reject non-essential",
513                            savePreferencesBtn: "Accept Selected cookies",
514                            sections: [
515                                {
516                                    title: "Functional (Necessary)",
517                                    description: "These cookies are essential for the proper functioning of the website.",
518                                    linkedCategory: 'necessary'
519                                },
520                                {
521                                    title: "Intercom",
522                                    description: "Required to provide customer support, onboarding and service communication",
523                                    linkedCategory: 'necessary'
524                                },
525                                {
526                                    title: "VWO",
527                                    description: "VWO (A/B testing and optimization)",
528                                    linkedCategory: 'analytics'
529                                },
530                                {
531                                    title: "Microsoft Application Insights",
532                                    description: "Microsoft Application Insights (performance monitoring)",
533                                    linkedCategory: 'analytics'
534                                },
535                                {
536                                    title: "Microsoft Clarity",
537                                    description: "Microsoft Clarity (user behavior analysis)",
538                                    linkedCategory: 'analytics'
539                                },
540                                {
541                                    title: "Sentry",
542                                    description: "Sentry (error monitoring)",
543                                    linkedCategory: 'analytics'
544                                },
545                                {
546                                    title: "Tracking",
547                                    description: "Marketing campaign effectiveness",
548                                    linkedCategory: 'marketing'
549                                }
550                            ]
551                        }
552                    }
553                }
554            },
555            onConsent: function () {
556                // Check if acceptCookies already exists - if so, don't recreate it
557                // The vanilla-cookieconsent library triggers onConsent after every page load
558                // when it detects valid consent (cc_cookie exists). This prevents unnecessary
559                // recreation of the acceptCookies cookie when it already exists.
560                const cookies = document.cookie.split(';');
561                const hasAcceptCookies = cookies.some(cookie =>
562                    cookie.trim().startsWith('acceptCookies=')
563                );
564
565
566                if (hasAcceptCookies) {
567                    // acceptCookies already exists, just configure boontrack and return
568                    if (window.configureBoontrack) {
569                        window.configureBoontrack();
570                    }
571                    return;
572                }
573
574                // Get acceptCookies based on user preferences
575                const acceptCookies = getAcceptCookiesFromPreferences();
576                document.cookie = `acceptCookies=${JSON.stringify(acceptCookies)};path=/`;
577
578                if (window.configureBoontrack) {
579                    window.configureBoontrack();
580                }
581
582                location.reload();
583            },
584            onChange: function () {
585                // Called when preferences are changed via the preferences modal (e.g., from footer link)
586                // Update the acceptCookies cookie without reloading the page
587                const acceptCookies = getAcceptCookiesFromPreferences();
588                document.cookie = `acceptCookies=${JSON.stringify(acceptCookies)};path=/`;
589
590                if (window.configureBoontrack) {
591                    window.configureBoontrack();
592                }
593                // No page reload - preferences are updated dynamically
594            }
595        });
596            }
597
598            // Wait for CookieConsent library to load before initializing
599            // The library is loaded with defer, so it may not be available immediately
600            if (typeof CookieConsent !== 'undefined') {
601                initCookieConsent();
602            } else {
603                // Wait for DOMContentLoaded when deferred scripts have executed
604                document.addEventListener('DOMContentLoaded', function() {
605                    if (typeof CookieConsent !== 'undefined') {
606                        initCookieConsent();
607                    } else {
608                        console.warn('Frontend: CookieConsent library n
608ot available');
609                    }
610                });
611            }
612        }
613</script>
613
614
615<style>
616    /* Vanilla Cookie Consent styling */
617    /* Style the middle "Reject non-essential" button with primary red */
618    #cc-main .cm_btn[data-role="necessary"],
619    #cc-main button[data-role="necessary"] {
620        background-color: #e5173f;
621        color: white;
622        border: none;
623        transition: background-color 0.2s ease;
624    }
625
626    #cc-main .cm_btn[data-role="necessary"]:hover,
627    #cc-main button[data-role="necessary"]:hover {
628        background-color: #ce1539;
629    }
630</style>
631
632</body>
633</html>
634

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.