Skip to main content
← Back to plugins
Picqer Fulfillment

Picqer Fulfillment

Sync orders, stock, and products with the Picqer order picking platform

Version3.9.0
Compatibility>=3.2.0
CategoryShipping
Downloads86 monthly
Last updatedFeb 5, 2026

Official documentation here

Vendure plugin to sync orders, stock and catalogue with Picqer.com order pick platform.

  • Sync placed orders to Picqer
  • Sync all products to Picqer
  • Pull stock levels from Picqer into Vendure

The plugin follows these principles:

  • Vendure should be considered the source of truth for product presentation: Assets, descriptions and names are pushed from Vendure to Picqer
  • Picqer should be considered the source of truth for stock levels: Stock levels are pulled from Picqer into Vendure

Getting started

Add the plugin to your vendure-config.ts

Ts

Start the server and set the fulfillment handler to picqer: Fulfill with Picqer for all shipping methods that should be handled via Picqer.

Stock levels

Stock levels are updated in Vendure on

  1. Full sync via the Admin UI
  2. Or, on trigger of the GET endpoint /picqer/pull-stock-levels/<channeltoken>.
  3. On incoming webhook from Picqer. Before incoming webhooks work, you need a full sync or pull-stock-levels sync, so that stock locations are created in Vendure based on the Picqer Warehouses

This plugin will mirror the stock locations from Picqer. Non-Picqer stock locations will automatically be deleted by the plugin, to keep stock in sync with Picqer. Vendure's internal allocated stock will be ignored, because this is handled by Picqer.

You can use a custom StockLocationStrategy to control how available stock is calculated based on multiple locations.

Periodical stock level sync

You can call the endpoint /picqer/pull-stock-levels/<channeltoken>, with your Picqer API key as bearer token, to trigger a full stock level sync. This will pull stock levels from Picqer, and update them in Vendure.

curl -H "Authorization: Bearer abcde-your-apikey" `http://localhost:3000/picqer/pull-stock-levels/your-channel-token`

Order process override

This plugin requires the default order process to be configured with checkFulfillmentStates: false, so that orders can be transitioned to Shipped and Delivered without the need of fulfillment. Fulfillment is the responsibility of Picqer, so we won't handle that in Vendure when using this plugin.

!image

  • Without incoming stock from Picqer, either via webhook or pulled from the Picqer API, items would be allocated indefinitely. Picqer has to tell Vendure what the stock level of products are.

Orders

  1. Orders are pushed to Picqer with status processing when an order is placed in Vendure.
  2. On incoming order.completed event from Picqer, the order is transitioned to Shipped.
  3. There currently is no way of telling when an order is Delivered based on Picqer events, so we automatically transition to Delivered.

Caveats

  • Due to limitation of the Picqer API, the plugin only uploads images if no images exist for the product in Picqer.
  • This plugin automatically creates webhooks and deactivates old ones. Webhooks are created when you save your config.
Changelog
  • Upgraded to Vendure 3.5.3
  • Documentation update
  • Updated official documentation URL
  • Upgrade to Vendure to 3.3.2
  • Supply correct key for overriding VAT group in orders. Patch on previous version.
  • Override VAT rate for orders, when orders have a different VAT rate applied. For example, with orders in other countries.
  • Hydrate ProductVariant.Product when pushing products to Picqer, so that consumers can use Product to populate Picqer custom fields.
  • Allow configuring the plugin to not cancel Vendure orders when a Picqer order is cancelled
  • Update Vendure to 3.1.1
  • Make falling back to parent product featured asset configurable, so that only images of variants are synced to Picqer.
  • Removed unused order line index in pushPicqerOrderLineFields strategy
  • Allow specifying additional fields on order.products when pushing orders to Picqer
  • Find channel's default translation for products when sending to Picqer.
  • Transition to Shipped state first (#504)
  • Check for empty strings when sending invoicename to Picqer. Fallback to customer email address to make sure orders are sent to Picqer.
  • Allow configuration to trigger sync on custom field updates (#484)
  • Update compatibility range (#480)
  • Get the correct variant translation based on the channel's default language
  • Fetch all registered webhooks when there are more than 100 using pagination
  • Updated Vendure to 2.2.6
  • The Picqer plugin now requires manual installation of the default order process with checkFulfillment: false to prevent overriding other custom order processes in the consuming projects.
  • Don't fall back to shipping address when passing billing address to Picqer
  • Correctly set product name in Picqer based on Vendure variant name. Falls back to first translation available before falling back to using SKU as name.
  • Don't update stock of products in Vendure that have unlimitedstock=true in Picqer
  • Fix types of pushing and pulling Picqer data
  • Sync warehouses including names on full sync and stock level sync
  • Throw error when trying to fulfill, because fulfilment shouldn't be used together with Picqer.
  • Expose endpoint to periodically pull stock levels
  • Install order process that allows skipping fulfillments when transitioning to Shipped or Delivered
  • Take Picqer allocated stock into account when setting stock on hand
  • Log order code when order couldn't be added to push-order queue
  • Remove order lines when removed in Picqer
  • Update stock of virtual/assembled products based on assembled_stock webhook
  • Always created products as active in Picqer
  • Log order code for failed pushes of orders to Picqer
  • Updated vendure to 2.1.1
  • Try to fulfill again on order status changed webhooks, to support fulfilling of back orders.
  • Push to Picqer even when fulfilling failed. Log order codes and manual steps needed when fulfillment fails.
  • Complete orders on orders.status_changed webhooks, instead of picklists.closed hooks. (#281)
  • Patch priority order of names when sending to Picqer: invoicename ?? deliveryname ?? customerFullname
  • Set company as name and full name as contactname for placed orders.
  • Don't throw insufficient stock errors on incoming webhooks, because it will eventually disable the entire webhook in Picqer
  • Send streetline1 + streetline2 as address in Picqer
  • Send telephone and email address to Picqer for guest orders
  • Don't set contact name in Picqer if it's the same as customer name (#267)