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
Add the plugin to your vendure-config.ts
import { PicqerPlugin } from '@pinelab/vendure-plugin-picqer';
import { configureDefaultOrderProcess } from '@vendure/core';
...
// Make sure Picqer can transition to 'Delivered' without the need of fulfillment
orderOptions: {
process: [
configureDefaultOrderProcess({ checkFulfillmentStates: false })
]
},
plugins: [
// Add Picqer as plugin
PicqerPlugin.init({
enabled: true,
vendureHost: 'https://example-vendure.io',
pushProductVariantFields: (variant) => ({ barcode: variant.sku }),
pullPicqerProductFields: (picqerProd) => ({
outOfStockThreshold: picqerProd.stockThreshold,
}),
pushPicqerOrderFields: (order) => ({
customer_remarks: order.customFields.customerNote,
pickup_point_data: {
carrier: 'dhl',
id: '901892834',
},
}),
// This will also push variants to Picqer when you change the `noLongerAvailable` example custom field.
// By default custom field updates will not trigger a sync to picqer
shouldSyncOnProductVariantCustomFields: ['noLongerAvailable']
}),
AdminUiPlugin.init({
port: 3002,
route: 'admin',
app: compileUiExtensions({
outputPath: path.join(__dirname, '__admin-ui'),
extensions: [
PicqerPlugin.ui,
... // your other plugin UI extensions
],
}),
}),
... // your other plugins
]
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 are updated in Vendure on
- Full sync via the Admin UI
- Or, on trigger of the GET endpoint
/picqer/pull-stock-levels/<channeltoken>
. - 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.
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`
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.
- 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 are pushed to Picqer with status
processing
when an order is placed in Vendure. - On incoming
order.completed
event from Picqer, the order is transitioned toShipped
. - There currently is no way of telling when an order is
Delivered
based on Picqer events, so we automatically transition toDelivered
.
- 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.