SYLIUS NEXT.JS PWA ERP INTEGRATION 3D SHIPPING LOGIC GARDEN D2C

Plantoris

The hardest part of this store was not the cart. It was the box.

Ogrody Drama have been growing and selling plants for three generations: cultivation since 1974, a garden centre and landscape design studio near Katowice since 1996, today a team of 50. Plantoris is their move from a regional business to a nationwide one. We built the entire system from scratch: Sylius as the engine, Next.js as the presentation layer, Subiekt GT as the single source of truth for stock, and a custom 3D packing algorithm without which this store could not price a single delivery correctly.

Plantoris — the Ogrody Drama online store built on Sylius and Next.js
Plantoris — a nationwide plant store, built from scratch on Sylius and Next.js.
× Before
  • Living goods break the standard commerce model. A plant changes size through the season, some items cannot be stacked, others cannot ship at all below freezing. Off the shelf platforms have no field for that.
  • Shipping cost does not follow weight. A two metre tree and a bag of soil can weigh the same and still be two completely different shipments. A flat rate means either absorbing the loss or scaring the customer away.
  • Two warehouses, one order. Plants and accessories leave from different locations, while the customer sees one cart and one total.
  • The truth about stock lives in the ERP. Inventory, prices and VAT are maintained in Subiekt GT, and nobody was going to maintain a second parallel database inside the store.
  • Target scale, not launch scale. The architecture had to handle a catalogue in the range of 100,000 items and tens of thousands of images from day one.
→ Our approach
  • Backend first. We started with integrations and business logic, not with visuals. The design track ran in parallel on the client side and entered the build only once the engine could already calculate.
  • Logistics data as a first class citizen. Weight, three dimensions, a stackable flag, packaging type, growth phase and month of availability are product fields, not a sentence in the description.
  • Rules instead of exceptions. Seasonality, shipping cut off and the freeze hold are configuration in the admin panel, not a call to a developer in November.
  • Sylius rather than a boxed platform. With this many non standard rules, a framework with an open domain model costs less over a year than fighting the limits of a closed system.

What we built it with.

Sylius (Symfony)
commerce engine, product model with horticultural attributes, tax zones, currencies, admin panel with granular access control
Next.js (PWA)
presentation layer, coded from UI designs delivered by the client's branding agency
Subiekt GT
two way ERP integration: products, prices, stock levels and VAT into the store, orders and customer records back into the ERP
Cloudflare CDN + Images
delivery and automatic conversion of product photography to WebP and AVIF
Apaczka
courier broker integration for shipping labels and parcel statuses shown in the customer account
Sentry
error monitoring across backend and frontend
Marketing automation
purchase events, abandoned carts, customer segments, review platform integration
XML product feeds
Google Merchant, Ceneo, competitor price monitoring tools

Three things no off the shelf store will do.

3D bin packing

The system does not estimate shipping cost, it calculates it. Before checkout it simulates the physical arrangement of the goods: it takes the dimensions and weight of every item, checks the stackable flag (fragile plants do not have it), selects the cheapest combination of packaging from the available pool of boxes, crates and pallets, and only then derives the price shown to the customer. Packaging units have their own dimensions, logistics cost and stock level.

Why it matters: with a catalogue ranging from a seed packet to a two metre tree, the difference between calculating and guessing is real margin on every single order.

Split shipment

The cart is automatically divided into sub orders by item location, plants separately, pots and accessories separately, with delivery costs summed correctly. The customer sees one order, each warehouse sees its own picking list, and the ERP receives complete data.

Season, weather and cut off

Shipping living goods is not a continuous function. We implemented a configurable shipping day and cut off hour, seasonal visibility of categories and products, logistics rules defined per month, and a hold on shipping at temperatures around freezing, triggered from the panel by an operator. On top of that: per product order limits and a separate "packing started" status visible only to the packing team.

The rest of the scope.

Catalogue
one product in multiple categories, variants with their own price and EAN, cross selling, horticultural attributes (frost resistance, position, soil), visual mega menu with tiles
Pre orders
pre order items with their own fulfilment date, payment upfront, a block on combining in stock and pre order goods in one parcel
Digital plant passports
a QR code on the physical product opens a virtual plant card with care instructions and adds the plant to the customer's "My Garden" panel without searching the store
Plant Doctor
a virtual gardener, an AI agent answering questions on plant selection and care
Loyalty programme
integration with the client's existing points system: single sign in, points balance and history, tiers, progress bar, rewards, coupon wallet, tier specific offers
Promotions
time based percentage and fixed discounts, single and multi use coupons, a dedicated deals page, plant of the week and of the month, full Omnibus Directive compliance with 30 day lowest price history
Admin and CMS
roles and permissions (admin, packing, customer service), banners, advice blog, downloadable materials, information pages and contact form
Garden design service
ordering a garden design online, questionnaire and quote, final documentation with a plant list that leads back into the cart

Six months, backend first, with a hard deliverable closing every stage.

STAGE 1

Foundations

Technical workshops, ERP data mapping, Dev and Stage environments, CDN setup.

STAGE 2

ERP integration

Product, price and stock synchronisation, horticultural attributes in the database, XML feeds.

STAGE 3

Logistics

Split shipment, packing algorithm, marketing automation, courier statuses.

STAGE 4

UX logic and AI

User journeys, wireframe consultation with the client's agency, virtual gardener implementation.

STAGE 5

Frontend

Design review of the delivered visuals, Next.js view development, CMS configuration.

STAGE 6

Stabilisation

Load testing, user acceptance testing, team training, production launch.

What changed.

A regional business now sells nationwide, with the same range and the same expertise.
Shipping cost stopped being guesswork. Every order has its packaging calculated, not a flat rate derived from weight.
The ERP remained the single source of truth. The team works in Subiekt GT exactly as before and the store keeps up on its own.
The season is handled from the panel, not by a developer. Cut off times, category visibility and the freeze hold sit with the client's team.
The design studio gained a sales channel, because a garden design now ends with a plant list that can be bought in the same store.
The architecture is ready for a catalogue in the 100,000 item range, so growing the range does not mean rewriting the system.

No percentages here. The store is young, and instead of impressive numbers with nothing behind them we show what the system actually changed.

Got a similar problem?

If your cart has to understand dimensions, seasons and two warehouses at once, an off the shelf platform will not carry it. We will show you how to calculate it properly.