Skip to main content
Uplab Software

Uplab Software

Official PartnerTernopil, Ukraine

About

Vendure gets you most of the way -> We build the part that is specific to your business Uplab has built production software since 2017 – a Ukrainian team distributed across Europe, with an EU company in Estonia. On our longest-running Vendure store, 65 first-party plugins are in production: local payment providers and fiscal registration, a national carrier integration, order intake from Instagram, a Telegram bot for the order-processing team, CRM sync, Odoo ERP synchronisation covering products, facets, customers, orders and stock levels, and a search layer migrated from Postgres full-text to OpenSearch behind a differential test harness. We take long engagements - years, not sprints - covering backend, storefront, DevOps, and QA.

Team

Ihor Barmak
Ihor Barmak225 VXP

Project showcases

Vendure ↔ Odoo — bidirectional ERP sync in production

Vendure ↔ Odoo — bidirectional ERP sync in production

A bidirectional synchronisation layer between a production Vendure store and Odoo ERP, built in May 2025 and in continuous production since. Ownership is explicit per entity. Odoo is the source of truth for products and variants, colours, facets and stock levels, which flow into Vendure on scheduled jobs. Vendure owns customers and orders, which are pushed back to Odoo. Every module declares its direction, trigger, and status in one table, so nobody has to guess which system wins on a given field. Orders push on state transition, not on a timer. The primary path fires when an order transitions into its CRM state, mapping Vendure orders onto Odoo sales orders; a scheduled task is a fallback that only picks up eligible orders still missing their Odoo id. Stock for the affected variants is re-fetched on the same transition rather than waiting for the next cycle. Getting the money right was the hard part. Vendure distributes an order-level promotion across the individual lines as an adjustment, and only the prorated price getters account for that distribution; using the obvious line-level getter instead sent every order-level-discounted order to the ERP at its full pre-discount price. Rounding then adds its own wrinkle: prorated prices round per unit while order totals round per line, so quantity times unit price can drift by a few kopecks when a discount does not divide evenly. Orders paid in a foreign currency add a third residual, because the acquirer settles in local currency at a slightly different amount. All three are folded into a single line adjustment, so the total in the ERP always equals what the customer actually paid. Fiscalisation data rides along in the same payload, including the explicit null case for orders that are legitimately not fiscalised. Reliability is designed in, not retrofitted. ERP payloads are parsed with tolerant schemas that validate item by item, so one malformed record cannot kill an entire page of results. Bulk stock writes go through a dedicated writer that chunks and deterministically orders its statements, specifically to avoid deadlocking against live checkout writes. Long-running syncs and per-entity pushes serialise across runs on session-scoped advisory locks that release automatically on crash. It is maintained, not just shipped. We actively maintain the integration and plan to also sync our gift certificates from Odoo, loyalty program integration, and much more!

Odoo
COOSH - WooCommerce exit, then four years of operating it

COOSH - WooCommerce exit, then four years of operating it

COOSH (cooshwear.com) is a fashion retailer whose platform we migrated from WooCommerce to Vendure in 2022 and have operated ever since. The problem. The inherited WooCommerce setup bundled database, back office and storefront onto a single server, ran a stack of third-party plugins of uneven quality, and had no version control on the live code. The ceiling was architectural, not something tuning would fix. Why Vendure. We evaluated OpenCart, Adobe Commerce, Shopify and Medusa. Shopify was ruled out on a hard requirement — it could not support the local payment providers the business needed. Vendure was the only option where market-specific commerce logic was plugin work against a documented API rather than a fight with the platform. We migrated roughly 1,500 products and split the monolith into database, Vendure back office and Next.js storefront, going live without reported business disruption. What runs today. 65 first-party plugins in production, covering local payment providers, statutory fiscal registration, national carrier integration, order intake from Instagram, a Telegram bot for the order-processing team, and CRM sync. Search has been rebuilt twice — from Postgres full-text to OpenSearch, cut over behind a differential test harness run on 106 real query shapes, which surfaced four relevance bugs that predated the migration. An Odoo ERP synchronisation layer covers products, facets, colours, customers, orders and stock levels, and feeds 18 scheduled operational reports including automated stock reconciliation. A native React Native app ships against the same Shop API as the web storefront — the clearest proof the backend is genuinely headless. Kept current, not frozen. The same production store has run on Vendure 1.8.3, 1.9, 2.0, 2.1, 2.2, 3.0, 3.1, 3.3, 3.5, 3.6 and now 3.7.2. Three major versions, no re-platform, no feature freeze.

React NativeWooCommerceMobile AppOpenCartMedusaTelegramOpenSearchElasticsearch

Contact Uplab Software

Tell Uplab Software about your project. Your message goes straight to their team, and they'll reply to you directly.

Vendure partner network
Find the right partner for your project

Browse vetted agencies and independent experts across the Vendure ecosystem, or apply to join the network as a partner.