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 2
↓
Order-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.
// 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',
],
]);
offset en limit parameters voor grote datasets.
// 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'ssales_order_place_after event of observer.
// 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()));
}
}
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(),
]);
}
// 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.
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.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:
- Klant meldt retour in Magento (RMA)
- 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'ssales_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%
// 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
| Practice | Waarom |
|---|---|
| Child-SKUs gebruiken voor configurabele producten | Picqer werkt op SKU-niveau, niet op parent |
| Idempotentie in alle sync-jobs | Dubbele verwerking levert nooit dubbele Picqer-orders |
| Webhook + polling combineren | Webhooks voor snelheid, polling als fallback |
| Voorraadupdates bufferen | Batch-updates zijn efficiënter dan één call per product |
| Altijd het Picqer order-ID opslaan in Magento | Noodzakelijk 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.

Geschreven door Ruthger Idema
15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.
Meer over ons team →