Magento 2 + Picqer: warehouse management koppeling
Terug naar blog

Magento 2 + Picqer: warehouse management koppeling

AuthorRuthger Idema
1 mei 202610 min leestijd

Picqer is het meest gebruikte WMS in Nederland voor groeiende e-commerce bedrijven. De koppeling met Magento 2 via de Picqer API bepaalt hoe snel orders worden verwerkt en hoe accuraat je voorraad is.

Magento 2 + Picqer: warehouse management koppeling

Wanneer een webshop meer dan 50 orders per dag verwerkt, wordt het handmatig beheren van pick-lijsten, pakbonnen en voorraadbewegingen een bottleneck. Picqer is het warehouse management systeem dat de meeste Nederlandse e-commerce bedrijven op dat punt kiezen.

De koppeling met Magento 2 bepaalt hoe snel orders worden verwerkt, hoe accuraat je voorraad is en of je klantenservice goede realtime informatie heeft. Dit artikel legt uit hoe je de integratie architectureel aanpakt.

Wat je leert in dit artikel

  • Hoe de Magento 2 + Picqer datastroom werkt
  • De Picqer REST API: endpoints en authenticatie
  • Order sync: van Magento-order naar Picqer-picklist
  • Voorraad sync: van Picqer naar Magento
  • Foutafhandeling en edge cases

Waarom Picqer naast Magento?

Magento 2 heeft geen ingebouwd warehouse management. Orders komen binnen, maar het pick & pack proces, de locatiebeheer in het magazijn, pakbonnen en retourverwerking zijn niet onderdeel van Magento.

Picqer vult dat gat. Het biedt:

  • Visuele pick-lijsten met locatie-aanwijzingen
  • Barcode-scanning voor foutreductie
  • Voorraadbeheer op locatieniveau
  • Retourverwerking
  • Pakstations met weging en afmeting
  • Koppeling met DHL, PostNL, DPD en andere vervoerders

De koppeling tussen Magento 2 en Picqer is de brug die orders van de winkel naar het magazijn stuurt en voorraadinformatie teruggeeft aan de webshop.

De datastroom in kaart

Klant plaatst order in Magento 2Order-event triggert middleware
  ↓
Middleware stuurt order naar Picqer API
  ↓
Picqer maakt picklist aan
  ↓
Magazijnmedewerker pikt en verpakt
  ↓
Picqer markeert order als verzonden (met track & trace)
  ↓
Middleware werkt Magento-order bij: status + tracking
  ↓
Klant ontvangt automatische bevestigingsmail met tracking

Parallel hieraan:

Picqer: voorraadmutatie (ontvangst of pick)
  
Middleware: voorraadupdate naar Magento
  
Magento: actuele voorraad op productpagina

De Picqer REST API

Picqer heeft een goed gedocumenteerde REST API op https://jouw-account.picqer.com/api/v1/. Authenticatie gaat via HTTP Basic Auth met een API-key als gebruikersnaam en een leeg wachtwoord.

php
// Picqer API client initialiseren
$client = new Client([
    'base_uri' => 'https://jouw-account.picqer.com/api/v1/',
    'auth' => [config('picqer.api_key'), ''],
    'headers' => [
        'Content-Type' => 'application/json',
        'User-Agent' => 'MagentoIntegration/1.0',
    ],
]);
Rate limiting: Picqer staat maximaal 400 verzoeken per minuut toe per API-key. Dat is ruim voor de meeste webshops maar bij bulk-synchronisaties let je er op. Paginering: Picqer-endpoints retourneren maximaal 100 items per pagina. Gebruik offset en limit parameters voor grote datasets.
php
// Alle producten ophalen (paginering)
$products = [];
$offset = 0;

do {
    $response = $client->get('products', [
        'query' => ['offset' => $offset, 'limit' => 100],
    ]);
    $page = json_decode($response->getBody(), true);
    $products = array_merge($products, $page);
    $offset += 100;
} while (count($page) === 100);

Order synchronisatie: van Magento naar Picqer

Wanneer een order in Magento wordt geplaatst, moet hij zo snel mogelijk in Picqer verschijnen. Vertraging betekent langere verwerkingstijd.

Trigger: gebruik Magento's sales_order_place_after event of observer.
php
// Magento observer: order geplaatst
class OrderPlacedObserver implements ObserverInterface
{
    public function __construct(
        private readonly PicqerSyncQueue $queue
    ) {}

    public function execute(Observer $observer): void
    {
        $order = $observer->getEvent()->getOrder();

        // Alleen syncen als order betaald of geconfirmeerd
        if (!in_array($order->getStatus(), ['processing', 'pending_payment'])) {
            return;
        }

        $this->queue->dispatch(new SyncOrderToPicqer($order->getId()));
    }
}
Order aanmaken in Picqer:
php
public function createPickingOrder(Order $order): array
{
    $orderLines = [];

    foreach ($order->getAllVisibleItems() as $item) {
        $orderLines[] = [
            'productcode' => $item->getSku(),
            'amount' => (int) $item->getQtyOrdered(),
            'name' => $item->getName(),
            'price' => $item->getRowTotalInclTax() / $item->getQtyOrdered(),
        ];
    }

    return $this->picqerClient->post('orders', [
        'idorder' => $order->getIncrementId(), // Magento ordernummer als referentie
        'deliveryname' => $order->getShippingAddress()->getName(),
        'deliveryaddress' => $order->getShippingAddress()->getStreetLine(1),
        'deliverycity' => $order->getShippingAddress()->getCity(),
        'deliveryzip' => $order->getShippingAddress()->getPostcode(),
        'deliverycountry' => $order->getShippingAddress()->getCountryId(),
        'products' => $orderLines,
        'reference' => $order->getIncrementId(),
    ]);
}
Idempotentie is verplicht. Als een job twee keer wordt uitgevoerd, mag er maar één Picqer-order worden aangemaakt. Sla het Picqer order-ID op in Magento en controleer bij elke sync-poging.
php
// Controleer of order al bestaat in Picqer
$existingOrders = $this->picqerClient->get('orders', [
    'query' => ['idorder' => $order->getIncrementId()],
]);

if (!empty($existingOrders)) {
    // Al gesynchroniseerd, sla het Picqer ID op als dat nog niet is gedaan
    $order->setData('picqer_order_id', $existingOrders[0]['idorder']);
    return;
}

Track & trace terugkoppeling

Wanneer Picqer een order verzendt, genereert het een verzendbevestiging met track & trace code. Die moet terug naar Magento.

Optie 1: Polling. Elke 15 minuten controleer je in Picqer welke orders zijn verzonden maar nog niet in Magento als shipped zijn gemarkeerd. Optie 2: Picqer webhooks. Picqer ondersteunt webhooks voor order-statuswijzigingen. Stuur een webhook naar je middleware bij statuswijziging naar "verzonden".

Webhooks zijn sneller maar vereisen een publiek endpoint. Voor de meeste implementaties is polling op 15 minuten voldoende.

php
public function processPicqerShipment(array $picqerOrder): void
{
    // Vind de Magento order via het referentienummer
    $magentoOrder = $this->orderRepository->get(
        $this->orderFactory->create()->loadByIncrementId($picqerOrder['reference'])->getId()
    );

    // Maak shipment aan in Magento
    $shipment = $this->shipmentFactory->create($magentoOrder);

    foreach ($magentoOrder->getAllItems() as $orderItem) {
        $shipmentItem = $this->shipmentItemFactory->create();
        $shipmentItem->setOrderItem($orderItem)->setQty($orderItem->getQtyToShip());
        $shipment->addItem($shipmentItem);
    }

    // Track & trace toevoegen
    if (!empty($picqerOrder['shipments'][0]['barcode'])) {
        $track = $this->trackFactory->create();
        $track->setCarrierCode($this->resolveCarrierCode($picqerOrder['shipments'][0]['shipper']))
              ->setTitle($picqerOrder['shipments'][0]['shipper'])
              ->setTrackNumber($picqerOrder['shipments'][0]['barcode']);
        $shipment->addTrack($track);
    }

    $this->shipmentRepository->save($shipment);

    // Stuur automatisch verzendbevestiging naar klant
    $this->shipmentSender->send($shipment);
}

Voorraadsynchronisatie

Picqer is de master voor voorraadinformatie. Magento ontvangt updates. Dit is een polling-operatie — Picqer heeft geen webhooks voor voorraadupdates.

Strategie: haal elke 30 minuten gewijzigde producten op uit Picqer en update Magento.
php
public function syncInventoryFromPicqer(): void
{
    // Producten ophalen die zijn gewijzigd in de afgelopen 35 minuten
    // (5 minuten overlap voor veiligheid)
    $since = now()->subMinutes(35)->toIso8601String();

    $products = $this->picqerClient->get('products', [
        'query' => ['updated_since' => $since],
    ]);

    foreach ($products as $product) {
        try {
            $this->updateMagentoStock(
                sku: $product['productcode'],
                qty: $product['stock'],
                isInStock: $product['stock'] > 0
            );
        } catch (NoSuchEntityException $e) {
            // Product bestaat niet in Magento, loggen en doorgaan
            Log::warning("Picqer product niet gevonden in Magento: {$product['productcode']}");
        }
    }
}

private function updateMagentoStock(string $sku, int $qty, bool $isInStock): void
{
    $stockItem = $this->stockRegistry->getStockItemBySku($sku);
    $stockItem->setQty($qty);
    $stockItem->setIsInStock($isInStock);
    $this->stockRegistry->updateStockItemBySku($sku, $stockItem);
}

Bij Magento 2.4+ met Multi-Source Inventory (MSI) gebruik je de SourceItemsSaveInterface in plaats van de legacy stockRegistry.

Retouren verwerken

Retouren zijn een tweestapsproces:

  1. Klant meldt retour in Magento (RMA)
  2. Picqer verwerkt de fysieke retourontvangst

Magento's RMA-module (beschikbaar in Commerce, niet in Open Source) genereert een return merchandise authorization. Die stuur je door naar Picqer als een "return order".

Wanneer Picqer de retour ontvangt en verwerkt, stuurt je middleware de voorraadupdate terug naar Magento. Afhankelijk van de reden (beschadigd vs. ongebruikt) schrijf je de voorraad al dan niet terug.

Edge cases en valkuilen

Configurabele producten. Magento gebruikt parent- en child-producten. Picqer werkt met individuele SKUs. Zorg dat je altijd de child-product SKU gebruikt in Picqer-orderregels, niet de parent. Deellevering. Als Picqer een order in twee zendingen verzendt, moet je in Magento twee aparte shipments aanmaken. Verwerk verzend-events per shipment, niet per order. Geannuleerde orders. Als een klant een order annuleert in Magento nadat die al in Picqer staat, moet je de Picqer order ook annuleren. Verwerk Magento's sales_order_cancel_after event. Backorders. Als Picqer een product als uitverkocht markeert maar Magento staat backorders toe, kunnen orders binnenkomen die Picqer niet kan verwerken. Definieer beleid: welk systeem bepaalt of een product bestelbaar is? Productwijzigingen. Als een SKU in Magento wordt gewijzigd, verlies je de link met Picqer. Gebruik SKU als stabiele identifier en communiceer SKU-wijzigingen altijd naar Picqer.

Monitoring en alerting

Stel de volgende alerts in:

  • Orders ouder dan 2 uur die nog niet in Picqer staan
  • Voorraadupdates die langer dan 1 uur geleden zijn gesynchroniseerd
  • Mislukte track & trace koppelingen
  • API-foutpercentage boven 1%
php
// Dagelijkse check: ongesynchroniseerde orders
$unsyncedOrders = Order::where('status', 'processing')
    ->whereNull('picqer_order_id')
    ->where('created_at', '<', now()->subHours(2))
    ->count();

if ($unsyncedOrders > 0) {
    Notification::route('mail', config('picqer.alert_email'))
        ->notify(new UnsyncedOrdersAlert($unsyncedOrders));
}

Best practices

PracticeWaarom
Child-SKUs gebruiken voor configurabele productenPicqer werkt op SKU-niveau, niet op parent
Idempotentie in alle sync-jobsDubbele verwerking levert nooit dubbele Picqer-orders
Webhook + polling combinerenWebhooks voor snelheid, polling als fallback
Voorraadupdates bufferenBatch-updates zijn efficiënter dan één call per product
Altijd het Picqer order-ID opslaan in MagentoNoodzakelijk voor updates en annuleringen

Conclusie

Een goede Picqer–Magento 2 koppeling versnelt je orderverwerking, houdt je voorraad accuraat en geeft klanten automatisch track & trace informatie. De architectuur is niet complex maar vraagt zorgvuldigheid in de edge cases.

De meest voorkomende problemen zijn te vermijden met een betrouwbare queue-architectuur, idempotente jobs en heldere afspraken over welk systeem master is voor voorraadinformatie.

Meer lezen over ERP-koppelingen in bredere context? Zie ons artikel ERP koppelen aan Magento 2. Voor middleware-architectuur met Alumio als iPaaS-platform. Voor vragen over implementatie, ga naar onze Magento pagina.


Schalen je ordervolumes en loopt je magazijnproces vast? Neem contact op — wij bouwen de integratie die dat oplost.
Ruthger Idema

Geschreven door Ruthger Idema

15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.

Meer over ons team →
Deel dit artikel:

Wil je jouw e-commerce naar het volgende niveau?

Plan een vrijblijvend gesprek met onze experts over Magento, Shopify of Laravel maatwerk.

Plan een Tech Check