{"id":13603,"date":"2026-08-28T13:25:42","date_gmt":"2026-08-28T11:25:42","guid":{"rendered":"https:\/\/qls.nl\/?post_type=vacatures&#038;p=13603"},"modified":"2026-08-28T13:25:43","modified_gmt":"2026-08-28T11:25:43","slug":"analytics-engineer","status":"publish","type":"vacatures","link":"https:\/\/qls.nl\/en\/vacancies\/analytics-engineer\/","title":{"rendered":"Analytics Engineer"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">About the role<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">At QLS, data is generated in warehouses worldwide \u2014 rough, fast-moving, and only useful if it can be trusted. Being a crucial part of the data team, you&#8217;ll design, build, and evolve the analytics engine that powers QLS. You build the data platform that processes raw data from our in-house sources into clean, accurate, and reliable datasets that the rest of the business can rely on without a second thought.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ll bring structure and clarity to a genuinely complex data landscape, and bring well-established software engineering practices into how we build and maintain our data platform.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Building the data foundation is only half the job. A good analytics engineer doesn&#8217;t just move data from A to B \u2014 you know what to measure, how to measure it correctly, and when a number is quietly telling the wrong story. You&#8217;re the person who brings trust to our data and increases its value to the company, while holding a high bar for engineering quality.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What you&#8217;ll do<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Design, build, and evolve data models that turn raw operational data into clean, trustworthy datasets<\/li>\n\n\n\n<li>Bring structure and reliability to data spanning a global logistics and shipping network<\/li>\n\n\n\n<li>Apply solid software engineering practices to how our data platform is built and maintained<\/li>\n\n\n\n<li>Go beyond &#8220;moving data&#8221; \u2014 help define what should be measured, how to measure it correctly, and catch numbers that don&#8217;t add up<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What you bring<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Required:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An engineering background, with an innovative and problem-solving mindset<\/li>\n\n\n\n<li>Strong SQL, Python, and dimensional modelling experience<\/li>\n\n\n\n<li>Experience with Databricks or Snowflake<\/li>\n\n\n\n<li>2\u20133 years of relevant working experience<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nice to have:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Data engineering experience<\/li>\n\n\n\n<li>Fluent in Dutch<\/li>\n\n\n\n<li>An interest in logistics, and enjoying working directly with business stakeholders<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sounds like you?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;d love to hear from you. Apply below and let&#8217;s talk.<\/p>\n\n\n\n<section id=\"form\" class=\"module-contactform wp-block margin-xlarge header-medium\">\n    <div class=\"row align-center\">\n        <div class=\"small-12 large-6 column\">  \n            <div class=\"bg-gray round-large padding-medium\">\n                <h3>Apply now!\n<\/h3>                                                    <script>\nvar gform;gform||(document.addEventListener(\"gform_main_scripts_loaded\",function(){gform.scriptsLoaded=!0}),document.addEventListener(\"gform\/theme\/scripts_loaded\",function(){gform.themeScriptsLoaded=!0}),window.addEventListener(\"DOMContentLoaded\",function(){gform.domLoaded=!0}),gform={domLoaded:!1,scriptsLoaded:!1,themeScriptsLoaded:!1,isFormEditor:()=>\"function\"==typeof InitializeEditor,callIfLoaded:function(o){return!(!gform.domLoaded||!gform.scriptsLoaded||!gform.themeScriptsLoaded&&!gform.isFormEditor()||(gform.isFormEditor()&&console.warn(\"The use of gform.initializeOnLoaded() is deprecated in the form editor context and will be removed in Gravity Forms 3.1.\"),o(),0))},initializeOnLoaded:function(o){gform.callIfLoaded(o)||(document.addEventListener(\"gform_main_scripts_loaded\",()=>{gform.scriptsLoaded=!0,gform.callIfLoaded(o)}),document.addEventListener(\"gform\/theme\/scripts_loaded\",()=>{gform.themeScriptsLoaded=!0,gform.callIfLoaded(o)}),window.addEventListener(\"DOMContentLoaded\",()=>{gform.domLoaded=!0,gform.callIfLoaded(o)}))},hooks:{action:{},filter:{}},addAction:function(o,r,e,t){gform.addHook(\"action\",o,r,e,t)},addFilter:function(o,r,e,t){gform.addHook(\"filter\",o,r,e,t)},doAction:function(o){gform.doHook(\"action\",o,arguments)},applyFilters:function(o){return gform.doHook(\"filter\",o,arguments)},removeAction:function(o,r){gform.removeHook(\"action\",o,r)},removeFilter:function(o,r,e){gform.removeHook(\"filter\",o,r,e)},addHook:function(o,r,e,t,n){null==gform.hooks[o][r]&&(gform.hooks[o][r]=[]);var d=gform.hooks[o][r];null==n&&(n=r+\"_\"+d.length),gform.hooks[o][r].push({tag:n,callable:e,priority:t=null==t?10:t})},doHook:function(r,o,e){var t;if(e=Array.prototype.slice.call(e,1),null!=gform.hooks[r][o]&&((o=gform.hooks[r][o]).sort(function(o,r){return o.priority-r.priority}),o.forEach(function(o){\"function\"!=typeof(t=o.callable)&&(t=window[t]),\"action\"==r?t.apply(null,e):e[0]=t.apply(null,e)})),\"filter\"==r)return e[0]},removeHook:function(o,r,t,n){var e;null!=gform.hooks[o][r]&&(e=(e=gform.hooks[o][r]).filter(function(o,r,e){return!!(null!=n&&n!=o.tag||null!=t&&t!=o.priority)}),gform.hooks[o][r]=e)}});\n<\/script>\n\n                <div class='gf_browser_gecko gform_wrapper gravity-theme gform-theme--no-framework' data-form-theme='gravity-theme' data-form-index='0' id='gform_wrapper_20' ><div id='gf_20' class='gform_anchor' tabindex='-1'><\/div>\n                        <div class='gform_heading'>\n\t\t\t\t\t\t\t<p class='gform_required_legend'>&quot;<span class=\"gfield_required gfield_required_asterisk\">*<\/span>&quot; indicates required fields<\/p>\n                        <\/div><form method='post' enctype='multipart\/form-data' target='gform_ajax_frame_20' id='gform_20'  action='\/en\/wp-json\/wp\/v2\/vacatures\/13603#gf_20' data-formid='20' novalidate>\n                        <div class='gform-body gform_body'><div id='gform_fields_20' class='gform_fields top_label form_sublabel_below description_below validation_below'><div id=\"field_20_3\" class=\"gfield gfield--type-text gfield--input-type-text gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible\"  ><label class='gfield_label gform-field-label' for='input_20_3'>Name<span class=\"gfield_required\"><span class=\"gfield_required gfield_required_asterisk\">*<\/span><\/span><\/label><div class='ginput_container ginput_container_text'><input name='input_3' id='input_20_3' type='text' value='' class='large'     aria-required=\"true\" aria-invalid=\"false\"   \/><\/div><\/div><div id=\"field_20_4\" class=\"gfield gfield--type-email gfield--input-type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible\"  ><label class='gfield_label gform-field-label' for='input_20_4'>Email address<span class=\"gfield_required\"><span class=\"gfield_required gfield_required_asterisk\">*<\/span><\/span><\/label><div class='ginput_container ginput_container_email'>\n                            <input name='input_4' id='input_20_4' type='email' value='' class='large'    aria-required=\"true\" aria-invalid=\"false\"  \/>\n                        <\/div><\/div><div id=\"field_20_5\" class=\"gfield gfield--type-phone gfield--input-type-phone field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible\"  ><label class='gfield_label gform-field-label' for='input_20_5'>Phone number<\/label><div class='ginput_container ginput_container_phone'><input name='input_5' id='input_20_5' type='tel' value='' class='large'    aria-invalid=\"false\"   \/><\/div><\/div><div id=\"field_20_6\" class=\"gfield gfield--type-textarea gfield--input-type-textarea field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible\"  ><label class='gfield_label gform-field-label' for='input_20_6'>Motivation\/explanation<\/label><div class='ginput_container ginput_container_textarea'><textarea name='input_6' id='input_20_6' class='textarea large'      aria-invalid=\"false\"   rows='10' cols='50'><\/textarea><\/div><\/div><div id=\"field_20_8\" class=\"gfield gfield--type-fileupload gfield--input-type-fileupload gfield_contains_required field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible\"  ><label class='gfield_label gform-field-label' for='input_20_8'>CV<span class=\"gfield_required\"><span class=\"gfield_required gfield_required_asterisk\">*<\/span><\/span><\/label><div class='ginput_container ginput_container_fileupload'><input type='hidden' name='MAX_FILE_SIZE' value='134217728' \/><input name='input_8' id='input_20_8' type='file' class='large' aria-describedby=\"gfield_upload_rules_20_8 gfield_description_20_8\" onchange='javascript:gformValidateFileSize( this, 134217728 );'  \/><span class='gfield_description gform_fileupload_rules' id='gfield_upload_rules_20_8'>Accepted file types: pdf, doc, docx, pages, Max. file size: 128 MB.<\/span><div class='gfield_description validation_message gfield_validation_message validation_message--hidden-on-empty' id='live_validation_message_20_8'><\/div> <\/div><div class='gfield_description' id='gfield_description_20_8'>Add CV<\/div><\/div><div id=\"field_20_9\" class=\"gfield gfield--type-turnstile gfield--input-type-turnstile gfield--width-full field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible\"  ><div class='ginput_container ginput_container_turnstile'><div class=\"cf-turnstile\" id=\"cf-turnstile_20\" data-js-turnstile data-response-field-name=\"cf-turnstile-response_20\" data-theme=\"light\" data-size=\"\" data-sitekey=\"0x4AAAAAABgRl6zio3ldGOix\"><\/div><\/div><\/div><\/div><\/div>\n        <div class='gform-footer gform_footer top_label'> <input type='submit' id='gform_submit_button_20' class='gform_button button' onclick='gform.submission.handleButtonClick(this);' data-submission-type='submit' value='Send application'  \/> <input type='hidden' name='gform_ajax' value='form_id=20&amp;title=&amp;description=&amp;tabindex=0&amp;theme=gravity-theme&amp;hash=b0e45c802a3ff8d44e6ee45113c9db18' \/>\n            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_20' value='iframe' \/>\n            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_20' id='gform_theme_20' value='gravity-theme' \/>\n            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_20' id='gform_style_settings_20' value='' \/>\n            <input type='hidden' class='gform_hidden' name='is_submit_20' value='1' \/>\n            <input type='hidden' class='gform_hidden' name='gform_submit' value='20' \/>\n            \n            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='EUR' value='152Stix1uMFgFGX1jI22we+kHKmY4IID4O\/S89NyudGVnkbHXEeMfJX6LwPtru+377O5nsCxXbZBFNSpGmc4dM19s\/ZVdodPZlla54n2frPvVjw=' \/>\n            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' \/>\n            <input type='hidden' class='gform_hidden' name='state_20' value='WyJbXSIsIjg3MWNhNmI3M2VmZjcxOWQxMGYyNThiNzhhYjJlZTg4Il0=' \/>\n            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_20' id='gform_target_page_number_20' value='0' \/>\n            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_20' id='gform_source_page_number_20' value='1' \/>\n            <input type='hidden' name='gform_field_values' value='' \/>\n            \n        <\/div>\n                        <\/form>\n                        <\/div>\n\t\t                <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_20' id='gform_ajax_frame_20' title='This iframe contains the logic required to handle Ajax powered Gravity Forms.'><\/iframe>\n\t\t                <script>\ngform.initializeOnLoaded( function() {gformInitSpinner( 20, 'https:\/\/qls.nl\/wp-content\/plugins\/gravityforms\/images\/spinner.svg', true );jQuery('#gform_ajax_frame_20').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_20');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_20').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_20').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_20').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_20').removeClass('gform_validation_error');}setTimeout( function() { \/* delay the scroll by 50 milliseconds to fix a bug in chrome *\/ jQuery(document).scrollTop(jQuery('#gform_wrapper_20').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_20').val();gformInitSpinner( 20, 'https:\/\/qls.nl\/wp-content\/plugins\/gravityforms\/images\/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [20, current_page]);window['gf_submitting_20'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_20').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_20').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [20]);window['gf_submitting_20'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_20').text());}else{jQuery('#gform_20').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger(\"gform_pre_post_render\", [{ formId: \"20\", currentPage: \"current_page\", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( \"gform_wrapper_20\" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( \"span\" );            visibilitySpan.id = \"gform_visibility_test_20\";            gformWrapperDiv.insertAdjacentElement( \"afterend\", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( \"gform_visibility_test_20\" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 20, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );\n<\/script>\n    \n                            <\/div>\n        <\/div>\n    <\/div>  \n<\/section>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>About the role At QLS, data is generated in warehouses worldwide \u2014 rough, fast-moving, and only useful if it can be trusted. Being a crucial part of the data team, you&#8217;ll design, build, and evolve the analytics engine that powers QLS. You build the data platform that processes raw data from our in-house sources into<a class=\"excerpt-read-more\" href=\"https:\/\/qls.nl\/en\/vacancies\/analytics-engineer\/\" title=\"Read moreAnalytics Engineer\"> &#8230; Read more \u00bb <\/a><\/p>\n","protected":false},"author":19,"featured_media":0,"menu_order":5,"template":"","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"class_list":["post-13603","vacatures","type-vacatures","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/qls.nl\/en\/wp-json\/wp\/v2\/vacatures\/13603","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/qls.nl\/en\/wp-json\/wp\/v2\/vacatures"}],"about":[{"href":"https:\/\/qls.nl\/en\/wp-json\/wp\/v2\/types\/vacatures"}],"author":[{"embeddable":true,"href":"https:\/\/qls.nl\/en\/wp-json\/wp\/v2\/users\/19"}],"version-history":[{"count":1,"href":"https:\/\/qls.nl\/en\/wp-json\/wp\/v2\/vacatures\/13603\/revisions"}],"predecessor-version":[{"id":13604,"href":"https:\/\/qls.nl\/en\/wp-json\/wp\/v2\/vacatures\/13603\/revisions\/13604"}],"wp:attachment":[{"href":"https:\/\/qls.nl\/en\/wp-json\/wp\/v2\/media?parent=13603"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}