Scientific Business Development and Innovation Associate
Primogene GmbH
Full-time
Leipzig, Germany
Functional nutrition tailored to individual needs
About Us
Primogene is an innovative biotech company developing advanced bioprocesses for the production of functional ingredients. We support human health through all stages of life and across industries including nutrition, pharma, and personal care.
About The Role
We are seeking a Scientific Business Development & Innovation Associate to support Primogene’s commercial and innovation activities. This role is ideal for someone who enjoys sitting at the intersection of science, market analysis and commercial activities. You will help us identify attractive opportunities, analyze markets, translate scientific literature into commercial applications, and prepare presentations for investors, customers, and for internal strategy.
The ideal candidate is analytical, curious, proactive, and able to connect scientific insights to real commercial opportunities.
Please note: the position is based on site in Leipzig.
Key responsibilities
Market & Business Analysis
- Conduct market research for new ingredients, technologies, and product opportunities.
- Build business cases including market sizing, pricing logic, competitive landscape, and customer segmentation.
- Track industry trends and identify new areas where Primogene can innovate.
- Search and assess scientific literature, patent literature, and non-patent technical sources.
- Translate technical findings into commercial insights and clear summaries.
- Identify white spaces, technological gaps, and potential innovation angles.
Innovation & Strategy Support
- Evaluate new technologies and help shape early-stage innovation concepts.
- Support idea generation, technology scouting, and opportunity prioritization.
- Collaborate closely with founders and scientific teams.
Business Development & Communication
- Support outreach activities, customer preparation, and partner research.
- Develop presentations for customers, investors, and internal strategy meetings.
- Prepare concise briefs, reports, and insights for decision-making.
You should bring
Educational Background
- Degree in life sciences, biotechnology, chemistry, biochemistry, bioengineering, or a related field, or demonstrated ability to understand complex scientific concepts.
Technical & Analytical Skills
- Strong analytical and research capabilities, including experience with scientific literature review, patent searches, and market/competitive analysis.
- Ability to translate scientific findings into clear technical and commercial insights.
Business & Industry Experience
- Experience in biotech, ingredients, nutrition, fermentation, enzymes, or related sectors is preferred.
- Prior exposure to business development or innovation strategy is a plus.
- Excellent written and verbal communication abilities.
- Ability to create compelling and structured presentation material.
- Curious, proactive, and resourceful, with an entrepreneurial mindset.
- Comfortable taking ownership and working in a dynamic, fast-paced start-up environment.
- Strong interest in innovation, emerging technologies, and early-stage ventures.
- Work on bringing innovative products with real-world impact to the market and chance to influence new product pipelines and innovation strategy early on.
- Contribution to solving highly important problems in human nutrition and health.
- Direct exposure to founders and decision-making processes.
- Flexible work arrangements: on-site in Leipzig or remote/hybrid.
- High autonomy and space for creativity.
- Steep learning curve with huge potential for personal and professional growth.
- Dynamic team with a collaborative and entrepreneurial team culture.
- Amazing team and colleagues
We are looking forward to receiving your application.
In case you have any questions, reach out to [email protected]
Business Areas
- Nutrition
- Personal Care
- R&D
- About Us
- Legal Notice
- Privacy Policy
let swipers = {}; let windowWidth = window.innerWidth; let uniqueIdCounter = 0; const createResponsiveSwiper = ( componentSelector, swiperSelector, classSelector, options, mode ) => { const mobile = window.matchMedia('(min-width: 0px) and (max-width: 991px)'); const desktop = window.matchMedia('(min-width: 992px)'); let elements = $(componentSelector); if (elements.length === 0) { console.log('No elements found for selector', componentSelector); // Step 2 return; } elements.each(function () { // Generate a unique key for this instance let uniqueKey = classSelector + '_' + uniqueIdCounter; const arrows = '.swiper-arrow'; const pagination = '.swiper-navigation'; $(this).find(swiperSelector).addClass(uniqueKey); $(this).find(arrows).addClass(uniqueKey); $(this).find(pagination).addClass(uniqueKey); let swiperOptions = Object.assign({}, options, { navigation: { prevEl: `${arrows}.prev.${uniqueKey}`, nextEl: `${arrows}.next.${uniqueKey}`, }, pagination: { el: `${pagination}.${uniqueKey}`, type: 'bullets', bulletActiveClass: 'swiper-pagination-bullet-active', bulletClass: 'swiper-pagination-bullet', clickable: true, }, }); swipers[classSelector] = swipers[classSelector] || {}; swipers[classSelector][uniqueKey] = swipers[classSelector][uniqueKey] || {}; let existingInstance = swipers[classSelector] ? swipers[classSelector][uniqueKey] : null; let shouldInitDesktop = mode === 'desktop' && desktop.matches; let shouldInitMobile = mode === 'mobile' && mobile.matches; let shouldInitAll = mode === 'all'; let existingSwiper = swipers[classSelector] && swipers[classSelector][uniqueKey] ? swipers[classSelector][uniqueKey].swiperInstance : null; let existingMode = swipers[classSelector] && swipers[classSelector][uniqueKey] ? swipers[classSelector][uniqueKey].mode : null; if (shouldInitDesktop || shouldInitMobile || shouldInitAll) { if (!existingSwiper) { // Initialize new instance let swiper = new Swiper(`${swiperSelector}.${uniqueKey}`, swiperOptions); swipers[classSelector][uniqueKey] = { swiperInstance: swiper, mode: shouldInitDesktop ? 'desktop' : shouldInitMobile ? 'mobile' : 'all', initialized: true, // set the initialized flag to true }; console.log('Swiper initialized for', componentSelector, 'with uniqueKey', uniqueKey); } } else if (existingSwiper) { // If none of the init conditions are true and an existing swiper instance is found, destroy it existingSwiper.destroy(true, true); delete swipers[classSelector][uniqueKey]; console.log('Swiper destroyed for', componentSelector, 'with uniqueKey', uniqueKey); } // Increment the uniqueIdCounter after processing each element uniqueIdCounter++; }); }; // Function to initialize swipers from an array of instances const runSwipers = (swiperInstances) => { swiperInstances.forEach((instance) => { console.log(...instance); createResponsiveSwiper(...instance); }); }; const initSwipers = (swiperInstances) => { // Load window.addEventListener('load', function () { console.log('Window Loaded'); runSwipers(swiperInstances); }); // Resize window.addEventListener('resize', function () { if (window.innerWidth !== windowWidth) { windowWidth = window.innerWidth; uniqueIdCounter = 0; // Reset the uniqueIdCounter runSwipers(swiperInstances); } }); }; var pix = document.getElementsByClassName("pixel"); for (var i = 0; i < pix.length; i++) { pix[i].style.animationDelay = Math.ceil(Math.random()*5000)+"ms"; } (function ($) { "use strict"; $.fn.counterUp = function (options) { // Defaults var settings = $.extend({ 'time': 800, 'delay': 100, 'formatter': false, callback: function () { } }, options), s; return this.each(function () { // Store the object var $this = $(this), counter = { time: $(this).data('counterup-time') || settings.time, delay: $(this).data('counterup-delay') || settings.delay }; var counterUpper = function () { var nums = []; var divisions = counter.time / counter.delay; var num = $this.text(); var isComma = /[0-9]+,[0-9]+/.test(num); num = num.replace(/,/g, ''); var decimalPlaces = (num.split('.')[1] || []).length; var isTime = /[0-9]+:[0-9]+:[0-9]+/.test(num); // Convert time to total seconds if (isTime) { var times = num.split(':'), m = 1; s = 0; while (times.length > 0) { s += m * parseInt(times.pop(), 10); m *= 60; } } // Generate list of incremental numbers to display for (var i = divisions; i >= 1; i--) { var newNum = parseFloat(num / divisions * i).toFixed(decimalPlaces); // Add incremental seconds and convert back to time if (isTime) { newNum = parseInt(s / divisions * i); var hours = parseInt(newNum / 3600) % 24; var minutes = parseInt(newNum / 60) % 60; var seconds = parseInt(newNum % 60, 10); newNum = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds); } // Preserve commas if input had commas if (isComma) { while (/(\d+)(\d{3})/.test(newNum.toString())) { newNum = newNum.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2'); } } if (settings.formatter) { newNum = settings.formatter.call(this, newNum); } nums.unshift(newNum); } $this.data('counterup-nums', nums); $this.text('0'); // Updates the number until we're done var f = function () { $this.html($this.data('counterup-nums').shift()); if ($this.data('counterup-nums').length) { setTimeout($this.data('counterup-func'), counter.delay); } else { $this.data('counterup-nums', null); $this.data('counterup-func', null); settings.callback.call(this); } }; $this.data('counterup-func', f); // Start the count up setTimeout($this.data('counterup-func'), counter.delay); }; // Perform counts when the element gets into view $this.waypoint(function (direction) { counterUpper(); this.destroy(); //-- Waypoint 3.0 version of triggerOnce }, {offset: '100%'}); }); }; })(jQuery); jQuery(document).ready(function($) { $('.counterup').counterUp({ delay: 10, time: 800, }); }); $(document).ready(function() { const clickWrapElement = $('.graph_bar-wrap.click-wrap'); clickWrapElement.each(function() { $(this).on('click', function() { console.log('.graph_bar.click_wrap element was successfully clicked.'); }); }); setTimeout(function() { clickWrapElement.click(); }, 100); $('.graph_bar').hover(function() { $('.graph_bar._1').removeClass('active'); $('.graph_bar_content-wrap_inner.motor').css('opacity', '0'); }); });
Scientific Business Development & Innovation Associate
Full-time
Leipzig, Germany
Functional nutrition tailored to individual needs
Communication & Presentation Skills
- Excellent written and verbal communication abilities.
- Ability to create compelling and structured presentation material.
- Curious, proactive, and resourceful, with an entrepreneurial mindset.
- Comfortable taking ownership and working in a dynamic, fast-paced start-up environment.
- Strong interest in innovation, emerging technologies, and early-stage ventures.
- Work on bringing innovative products with real-world impact to the market and chance to influence new product pipelines and innovation strategy early on.
- Contribution to solving highly important problems in human nutrition and health.
- Direct exposure to founders and decision-making processes.
- Flexible work arrangements: on-site in Leipzig or remote/hybrid.
- High autonomy and space for creativity.
- Steep learning curve with huge potential for personal and professional growth.
- Dynamic team with a collaborative and entrepreneurial team culture.
- Amazing team and colleagues
We are looking forward to receiving your application.
In case you have any questions, reach out to [email protected]
Business Areas
- Nutrition
- Personal Care
- R&D
- About Us
- Legal Notice
- Privacy Policy
let swipers = {}; let windowWidth = window.innerWidth; let uniqueIdCounter = 0; const createResponsiveSwiper = ( componentSelector, swiperSelector, classSelector, options, mode ) => { const mobile = window.matchMedia('(min-width: 0px) and (max-width: 991px)'); const desktop = window.matchMedia('(min-width: 992px)'); let elements = $(componentSelector); if (elements.length === 0) { console.log('No elements found for selector', componentSelector); // Step 2 return; } elements.each(function () { // Generate a unique key for this instance let uniqueKey = classSelector + '_' + uniqueIdCounter; const arrows = '.swiper-arrow'; const pagination = '.swiper-navigation'; $(this).find(swiperSelector).addClass(uniqueKey); $(this).find(arrows).addClass(uniqueKey); $(this).find(pagination).addClass(uniqueKey); let swiperOptions = Object.assign({}, options, { navigation: { prevEl: `${arrows}.prev.${uniqueKey}`, nextEl: `${arrows}.next.${uniqueKey}`, }, pagination: { el: `${pagination}.${uniqueKey}`, type: 'bullets', bulletActiveClass: 'swiper-pagination-bullet-active', bulletClass: 'swiper-pagination-bullet', clickable: true, }, }); swipers[classSelector] = swipers[classSelector] || {}; swipers[classSelector][uniqueKey] = swipers[classSelector][uniqueKey] || {}; let existingInstance = swipers[classSelector] ? swipers[classSelector][uniqueKey] : null; let shouldInitDesktop = mode === 'desktop' && desktop.matches; let shouldInitMobile = mode === 'mobile' && mobile.matches; let shouldInitAll = mode === 'all'; let existingSwiper = swipers[classSelector] && swipers[classSelector][uniqueKey] ? swipers[classSelector][uniqueKey].swiperInstance : null; let existingMode = swipers[classSelector] && swipers[classSelector][uniqueKey] ? swipers[classSelector][uniqueKey].mode : null; if (shouldInitDesktop || shouldInitMobile || shouldInitAll) { if (!existingSwiper) { // Initialize new instance let swiper = new Swiper(`${swiperSelector}.${uniqueKey}`, swiperOptions); swipers[classSelector][uniqueKey] = { swiperInstance: swiper, mode: shouldInitDesktop ? 'desktop' : shouldInitMobile ? 'mobile' : 'all', initialized: true, // set the initialized flag to true }; console.log('Swiper initialized for', componentSelector, 'with uniqueKey', uniqueKey); } } else if (existingSwiper) { // If none of the init conditions are true and an existing swiper instance is found, destroy it existingSwiper.destroy(true, true); delete swipers[classSelector][uniqueKey]; console.log('Swiper destroyed for', componentSelector, 'with uniqueKey', uniqueKey); } // Increment the uniqueIdCounter after processing each element uniqueIdCounter++; }); }; // Function to initialize swipers from an array of instances const runSwipers = (swiperInstances) => { swiperInstances.forEach((instance) => { console.log(...instance); createResponsiveSwiper(...instance); }); }; const initSwipers = (swiperInstances) => { // Load window.addEventListener('load', function () { console.log('Window Loaded'); runSwipers(swiperInstances); }); // Resize window.addEventListener('resize', function () { if (window.innerWidth !== windowWidth) { windowWidth = window.innerWidth; uniqueIdCounter = 0; // Reset the uniqueIdCounter runSwipers(swiperInstances); } }); }; var pix = document.getElementsByClassName("pixel"); for (var i = 0; i < pix.length; i++) { pix[i].style.animationDelay = Math.ceil(Math.random()*5000)+"ms"; } (function ($) { "use strict"; $.fn.counterUp = function (options) { // Defaults var settings = $.extend({ 'time': 800, 'delay': 100, 'formatter': false, callback: function () { } }, options), s; return this.each(function () { // Store the object var $this = $(this), counter = { time: $(this).data('counterup-time') || settings.time, delay: $(this).data('counterup-delay') || settings.delay }; var counterUpper = function () { var nums = []; var divisions = counter.time / counter.delay; var num = $this.text(); var isComma = /[0-9]+,[0-9]+/.test(num); num = num.replace(/,/g, ''); var decimalPlaces = (num.split('.')[1] || []).length; var isTime = /[0-9]+:[0-9]+:[0-9]+/.test(num); // Convert time to total seconds if (isTime) { var times = num.split(':'), m = 1; s = 0; while (times.length > 0) { s += m * parseInt(times.pop(), 10); m *= 60; } } // Generate list of incremental numbers to display for (var i = divisions; i >= 1; i--) { var newNum = parseFloat(num / divisions * i).toFixed(decimalPlaces); // Add incremental seconds and convert back to time if (isTime) { newNum = parseInt(s / divisions * i); var hours = parseInt(newNum / 3600) % 24; var minutes = parseInt(newNum / 60) % 60; var seconds = parseInt(newNum % 60, 10); newNum = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds); } // Preserve commas if input had commas if (isComma) { while (/(\d+)(\d{3})/.test(newNum.toString())) { newNum = newNum.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2'); } } if (settings.formatter) { newNum = settings.formatter.call(this, newNum); } nums.unshift(newNum); } $this.data('counterup-nums', nums); $this.text('0'); // Updates the number until we're done var f = function () { $this.html($this.data('counterup-nums').shift()); if ($this.data('counterup-nums').length) { setTimeout($this.data('counterup-func'), counter.delay); } else { $this.data('counterup-nums', null); $this.data('counterup-func', null); settings.callback.call(this); } }; $this.data('counterup-func', f); // Start the count up setTimeout($this.data('counterup-func'), counter.delay); }; // Perform counts when the element gets into view $this.waypoint(function (direction) { counterUpper(); this.destroy(); //-- Waypoint 3.0 version of triggerOnce }, {offset: '100%'}); }); }; })(jQuery); jQuery(document).ready(function($) { $('.counterup').counterUp({ delay: 10, time: 800, }); }); $(document).ready(function() { const clickWrapElement = $('.graph_bar-wrap.click-wrap'); clickWrapElement.each(function() { $(this).on('click', function() { console.log('.graph_bar.click_wrap element was successfully clicked.'); }); }); setTimeout(function() { clickWrapElement.click(); }, 100); $('.graph_bar').hover(function() { $('.graph_bar._1').removeClass('active'); $('.graph_bar_content-wrap_inner.motor').css('opacity', '0'); }); });