JOM MSPO 2.0
Ready. Set. Certify.
A structured national training series for mills, plantations, dealers, and supply chain players: covering traceability, environmental, and social requirements under MSPO 2.0
 Programmes range from one-day workshops to multi-day technical trainings, designed to support practical implementation and internal assessment readiness.
Apply Now. 
Training Programmes Available Nationwide
function handleDropdownChange(selection) {
    console.log('Selected:', selection.value, selection.text);

    const items = document.querySelectorAll('.workshop-item');
    items.forEach(item => {
        const target = item.getAttribute('data-target');

        if (selection.value === '' || selection.value === 'all' || target === selection.value) {
            item.classList.remove('itemhidden');  // show
        } else {
            item.classList.add('itemhidden');     // hide
        }
    });
}
Johor
e-MSPO Traceability Training for FFB Dealer – Johor Bahru
e-MSPO Traceability Module Training 2026
Open
DATE
30 June 2026
Target
FFB Dealers
Seats
50 Seats
LOCATIONS
Johor Bahru
view gallery
Melaka
e-MSPO Traceability Training for Mills and PF – Melaka
e-MSPO Traceability Module Training 2026
Open
DATE
9 June
Target
Mills and Processing Facilities
Seats
50 Seats
LOCATIONS
Melaka
view gallery
Online
e-MSPO Traceability Training for FFB Dealer – Online
e-MSPO Traceability Module Training 2026
Open
DATE
21 July 2026
Target
FFB Dealers
Seats
500 Seats
LOCATIONS
Online (Meeting link will be provided upon registration)
view gallery
Pahang
e-MSPO Traceability Training for FFB Dealer – Kuantan, Pahang
e-MSPO Traceability Module Training 2026
Open
DATE
14 July 2026
Target
FFB Dealers
Seats
50 Seats
LOCATIONS
Kuantan, Pahang
view gallery
Perak
e-MSPO Traceability Training for FFB Dealer – Teluk Intan, Perak
e-MSPO Traceability Module Training 2026
Open
DATE
7 July 2026
Target
FFB Dealers
Seats
50 Seats
LOCATIONS
Teluk Intan, Perak
view gallery
Sabah
e-MSPO Traceability Training for FFB Dealer – Kota Kinabalu, Sabah
e-MSPO Traceability Module Training 2026
Open
DATE
15 June 2026
Target
FFB Dealers
Seats
50 Seats
LOCATIONS
Kota Kinabalu, Sabah
view gallery
e-MSPO Traceability Training for Mills and PF – Kota Kinabalu, Sabah
e-MSPO Traceability Module Training 2026
Open
DATE
16 June 2026
Target
Mills and Processing Facilities
Seats
50 Seats
LOCATIONS
Kota Kinabalu, Sabah
view gallery
Sarawak
e-MSPO Traceability Training for FFB Dealer – Kuching, Sarawak
e-MSPO Traceability Module Training 2026
Open
DATE
24 June 2026
Target
FFB Dealers
Seats
50 Seats
LOCATIONS
Kuching, Sarawak
view gallery
e-MSPO Traceability Training for Mills and PF – Kuching, Sarawak
e-MSPO Traceability Module Training 2026
Open
DATE
23 June 2026
Target
Mills and Processing Facilities
Seats
50 Seats
LOCATIONS
Kuching, Sarawak
view gallery
MSPO HCV Lead Internal Assessor Training – Mukah
HCV Internal Assessor Training
Open
DATE
28-30 July
Target
Sustainability officers, estate managers, compliance officers, and personnel responsible for internal HCV assessments.
Seats
30 Seats
LOCATIONS
Mukah, Sarawak
view gallery
Terengganu
MSPO HCV Lead Internal Assessor Training – Dungun
HCV Internal Assessor Training
Open
DATE
28-30 April
Target
Sustainability officers, estate managers, compliance officers, and personnel responsible for internal HCV assessments.
Seats
30 Seats
LOCATIONS
Dungun, Terengganu
view gallery
Workshop Objectives
MSPO will be organising a nationwide capacity building program to enhance the readiness of the industry towards MSPO 2.0.  The Workshop is open to Oil Palm Dealers and Non-Certified Oil Palm Plantation, Palm Oil Mill & Processing Facilities.  The briefing will be conducted all across Malaysia. Click on the link provided below your chosen states to register now!
.workshop-menu-wrapper {
  flex: 0 0 auto;            /* don't shrink */
  display: flex;
  align-items: center;
  margin-right: 10px;        /* spacing between items */
}

.workshop-menu {
    display: grid;
    grid-template-columns: 1fr auto auto;
    align-items: center;
    gap: 0.75rem;
  }

  .workshop-menu > div:first-child {
    overflow-x: auto;
    scroll-behavior: smooth;
    display: flex;
    gap: 1rem;
  }

  .content_arrow {
    display: none;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 999px;
    border: none;
    background: #1b2335;
    color: #fff;
    cursor: pointer;
  }

  .content_shell:has(> div:nth-child(2) > .content_arrow--left)
               :has(> div:nth-child(3) > .content_arrow--right) .content_arrow {
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }

  .content_arrow:disabled {
    opacity: 0.4;
    cursor: default;
  }
document.addEventListener('DOMContentLoaded', function() {
  const menu = document.querySelector('.workshop-menu');
  if (!menu) return;

  const templateItem = menu.querySelector('.workshop-menu-item');

  // Clear existing menu items (but keep template for cloning if it exists)
  const allMenuItems = menu.querySelectorAll('.workshop-menu-item');
  const allWrappers = menu.querySelectorAll('.workshop-menu-wrapper');

  // Remove all wrappers first
  allWrappers.forEach(wrapper => wrapper.remove());

  // Remove all menu items that aren't wrapped
  allMenuItems.forEach(item => {
    if (item.parentElement === menu) {
      item.remove();
    }
  });

  const stateContainer = document.querySelector('.workshopstate-list');
  const stateTitles = document.querySelectorAll('.workshopstate-list .workshop-state-title');

  // Check if menu is scrollable and adjust CSS accordingly
  function checkMenuScrollability() {
    const isScrollable = menu.scrollWidth > menu.clientWidth;
    if (isScrollable) {
      menu.style.justifyContent = 'flex-start';
    } else {
      menu.style.justifyContent = ''; // Remove inline style to use default CSS
    }
  }

  stateTitles.forEach((titleEl, idx) => {
    const stateName = titleEl.textContent.trim();

    // Use existing ID or generate one
    let stateId = titleEl.id;
    if (!stateId) {
      stateId = stateName.toLowerCase()
        .replace(/\s+/g, '-')
        .replace(/[^a-z0-9\-]/g, '');
      titleEl.id = stateId;
    }

    // Create wrapper
    const wrapper = document.createElement('div');
    wrapper.className = 'workshop-menu-wrapper';

    let menuItem;

    if (templateItem && idx === 0) {
      // Use the original template item for the first menu item
      menuItem = templateItem;
      wrapper.appendChild(menuItem);
    } else if (templateItem) {
      // Clone template for subsequent items
      menuItem = templateItem.cloneNode(true);
      wrapper.appendChild(menuItem);
    } else {
      // Create fresh item if no template exists
      menuItem = document.createElement('a');
      menuItem.className = 'workshop-menu-item';
      wrapper.appendChild(menuItem);
    }

    // Add wrapper to menu
    menu.appendChild(wrapper);

    // Update link and text
    menuItem.href = `#${stateId}`;
    menuItem.textContent = stateName;

    // Add custom scroll behavior
    menuItem.addEventListener('click', function(e) {
      e.preventDefault(); // prevent normal anchor jump
      const target = document.getElementById(stateId);
      if (target && stateContainer) {
        const containerRect = stateContainer.getBoundingClientRect();
        const targetRect = target.getBoundingClientRect();
        const scrollLeft = target.offsetLeft - stateContainer.offsetLeft;

        stateContainer.scrollTo({
          left: scrollLeft,
          behavior: 'smooth'
        });
      }
    });
  });

  // Check scrollability after all menu items are created
  checkMenuScrollability();

  // Optional: Re-check on window resize
  window.addEventListener('resize', checkMenuScrollability);
});

document.addEventListener('DOMContentLoaded', function() {
  const menu = document.querySelector('.workshop-menu');
  const menuItems = menu ? menu.querySelectorAll('.workshop-menu-item') : [];
  const stateContainer = document.querySelector('.workshopstate-list');
  const stateSections = document.querySelectorAll('.workshopstate-list .workshop-state-title');
  if (!menu || !stateContainer || stateSections.length === 0) return;

  function updateActiveStates() {
    const containerRect = stateContainer.getBoundingClientRect();
    const activeIds = [];
    const screenWidth = window.innerWidth;
    const pixelThreshold = screenWidth - 90;

    stateSections.forEach(section => {
      const sectionRect = section.getBoundingClientRect();
      // Calculate visible horizontal overlap
      const visibleLeft = Math.max(sectionRect.left, containerRect.left);
      const visibleRight = Math.min(sectionRect.right, containerRect.right);
      const visibleWidth = Math.max(0, visibleRight - visibleLeft);
      const sectionWidth = sectionRect.width;
      const visibilityRatio = visibleWidth / sectionWidth;

      if (visibilityRatio >= 0.5 || visibleWidth > pixelThreshold) { // must be at least 50% visible OR visible width > screen width - 90px
        activeIds.push(section.id);
      }
    });

    menuItems.forEach(item => {
      const targetId = item.getAttribute('href').replace('#', '');
      if (activeIds.includes(targetId)) {
        item.classList.add('active');
      } else {
        item.classList.remove('active');
      }
    });
  }

  stateContainer.addEventListener('scroll', updateActiveStates, { passive: true });
  updateActiveStates();
});

document.addEventListener('DOMContentLoaded', function() {
    console.log('Workshop scroll buttons initializing...');

    const menuContainer = document.querySelector('.workshop-menu > div:first-child');
    const leftButton = document.querySelector('.workshop-menu--left');
    const rightButton = document.querySelector('.workshop-menu--right');

    console.log('Menu container:', menuContainer);
    console.log('Left button:', leftButton);
    console.log('Right button:', rightButton);

    if (!menuContainer || !leftButton || !rightButton) {
        console.error('Missing elements! Check your selectors.');
        console.error('Make sure .workshop-menu exists with arrow buttons');
        return;
    }

    function updateButtons() {
        const scrollLeft = menuContainer.scrollLeft;
        const maxScroll = menuContainer.scrollWidth - menuContainer.clientWidth;

        console.log('Scroll position:', scrollLeft, '/', maxScroll);

        // Left button
        if (scrollLeft <= 0) {
            leftButton.style.cursor = 'none';
            leftButton.style.opacity = '0.3';
            leftButton.disabled = true;
            console.log('Left button: DISABLED');
        } else {
            leftButton.style.cursor = 'pointer';
            leftButton.style.opacity = '1';
            leftButton.disabled = false;
            console.log('Left button: ENABLED');
        }

        // Right button
        if (scrollLeft >= maxScroll - 1) {
            rightButton.style.cursor = 'none';
            rightButton.style.opacity = '0.3';
            rightButton.disabled = true;
            console.log('Right button: DISABLED');
        } else {
            rightButton.style.cursor = 'pointer';
            rightButton.style.opacity = '1';
            rightButton.disabled = false;
            console.log('Right button: ENABLED');
        }
    }

    leftButton.addEventListener('click', () => {
        console.log('Left button clicked!');
        menuContainer.scrollBy({ left: -300, behavior: 'smooth' });
    });

    rightButton.addEventListener('click', () => {
        console.log('Right button clicked!');
        menuContainer.scrollBy({ left: 300, behavior: 'smooth' });
    });

    menuContainer.addEventListener('scroll', updateButtons);
    window.addEventListener('resize', updateButtons);

    console.log('Initial button state update...');
    updateButtons();
    console.log('Workshop scroll buttons initialized successfully!');
});
Why Attend MSPO 2.0?
The Malaysian Palm Oil Board (MPOB) organizes MSPO (Malaysian Sustainable Palm Oil) workshops to help industry players, smallholders, and related stakeholders understand and meet sustainability standards. Attending an MSPO workshop is valuable because it:
Grow
Master the updates in MSPO 2.0 and the all-new e‑MSPO system, including logo claims, traceability, NC tagging, and grievance modules.
Learn
Get practical guidance, real-world use cases, and live Q&As from MSPO experts. 
Certified
Walk away with a deeper understanding of standards, processes, documentation, and audit readiness.
Connected
Connect with fellow professionals across Malaysia and share valuable insights.
Who Should Join?
Whether you’re in the supply chain or just stepping into sustainability compliance, this is your essential training ground.
Oil Palm Dealers
Non‑Certified Oil Palm Plantations
Palm Oil Mills & Processing Facilities
Frequently Asked Questions