Three years ago we scoped a three-month WMS integration for a mid-sized retailer with two warehouses. It went live in month seven. Since then we have completed eight more WMS rollouts on the Netorigo platform, and the pattern is clear: the decisions that double a budget or slip a go-live are almost always made in the first two weeks.
The three realistic paths
In 2026 there are three honest options for connecting a warehouse to an online storefront. The first is the legacy SOAP-era WMS, often something that grew out of Microsoft Dynamics NAV or was built in-house a decade ago. We wire it up with an asynchronous adapter on BullMQ: the NestJS backend writes the order to an outbox table in PostgreSQL, a dispatcher worker retries the SOAP call three times before sending it to the dead-letter queue. Simple in theory, painful in practice. Real-world SOAP response times for these systems range from 800 ms to 12 seconds, and character encoding around SOAP envelopes can quietly mangle Hungarian or Czech address fields.
The second option is a modern REST or GraphQL WMS, usually a SaaS product. The risk here is not transport, it is the contract. Typical per-shipment pricing lands between 0.08 and 0.15 EUR, which is elegant up to about 8,000 packages per month and economically broken above 25,000.
The third path, which we choose more and more often: keep shipping inside the ERP entirely and run the warehouse with a mobile PWA that talks to a Prisma-managed stock_movement table. This wins when the client operates with three to five warehouse staff and does not need multi-tenant KPI dashboards.
The four evaluation criteria
Our WMS evaluation worksheet starts with four columns:
- Return label generation latency. Almost nobody puts this in the POC. The typical B2C retailer receives 92% of customer returns within 30 days of purchase, and if the return label takes minutes to generate, the support team gets tickets and NPS falls off a cliff. We reject any vendor above 1,500 ms.
- Batch query support. How many shipments can you sync in one call? A batch of 100 is fine. A batch of 1 means you will be opening 5,000 separate HTTP connections on the Black Friday peak.
- Webhook idempotency. Can
shipment.deliveredarrive twice? If yes, is there anX-Idempotency-Keyheader? Two carriers we evaluated cheerfully double-fire on delivery status. - Data retention. How long does the carrier retain shipment metadata? One partner purges after 90 days, which is an audit problem when the tax authority queries an invoice from two years ago.
What we would do differently
First, we would not start from the legacy SAP-style field mapping. We would design a shipment_intent semantic layer at the top of the Prisma schema, and the WMS adapter would only execute the intent. The old mapping cost us a week of work per new carrier, because delivery_method_code was 14 characters in one place and 11 in another, or the sender address had to be wrapped onto two lines.
Second, we would not trust the carrier's published SLA as the real uptime. A measured 99.4% monthly uptime is not three hours of downtime, it is four outages that all happen during the lunchtime window when we dispatch 41% of our daily volume.
Third, we would put the warehouse manager in the planning meeting from day one. The engineering team understands how code composes, but they do not understand how much time a warehouse worker spends with a handheld scanner while picking 800 packages a day.
The undervalued criterion
Return label generation latency is almost always the last column on the evaluation sheet, or missing entirely. But return rates in fashion B2C run between 22% and 35%, and a customer will not wait longer than 28 seconds for their return label. A well-chosen WMS responds in under 600 ms, a poorly chosen one in over 4 seconds, and the difference is 200 support emails a day.
On the Netorigo platform we built an idempotent caching layer for the shipment.return.label.generated event that serves the second request in under 8 ms if the label was already generated within the past 24 hours. That single change saved one partner roughly 11 million HUF last year, because their return-label-spamming bot no longer pages out to the carrier on every hit.