The problem
The client sells across multiple countries through different courier companies, with orders coming in from Shopify and supplier data arriving in whatever format that country uses — CSV, Excel, XML, often with local quirks (Croatian currency formatting, missing images, inconsistent reference data). All of that had to land in one place, linkable, auditable, with warehouses and packages tracked end to end. The manual version of this work didn't scale beyond a few countries.
What we built
Three services over one operational backbone. A React + Material UI dashboard through which the team runs orders, packages, warehouses, products, couriers, archives, and logs. A Node.js backend with the full operational model — orders, order changes, packages, package items, products, warehouses with transactions, couriers, invoices, change-audit log, plus Shopify integration on the input side. And a Python microservice that handles the heavy file-parsing part, with country-aware logic — different code paths for different supplier formats, so the team doesn't get broken data.
Modules & surfaces
- Operational dashboardA React + Material UI surface for the daily team — orders, packages, products, warehouses, archives, logs, with charts on the overview.
- Multi-format ingestCSV, Excel (xls/xlsx/xlsm), and XML — all handled by a dedicated Python service with logic tailored to each country and each supplier format.
- Shopify integrationOrders and items come in from Shopify as a first-class data source, alongside supplier files.
- Warehouses and transactionsWarehouses, packages, package items, and a transaction log over stock — the operational state of inventory at any moment.
- Couriers and invoicesCouriers and invoices are modelled as first-class entities, so multi-country delivery doesn't fragment the data.
- Audit log and archivesEvery change is recorded; old records are archived, not deleted. The team can always answer what changed and when.
- Live updatesChanges are shown in the dashboard live — no page refresh.
How we approached it
We separated responsibilities by what each part is good at. The Node backend holds the operational model and the API. The Python service does file parsing because Pandas is the right tool for CSV-and-Excel tangles. The dashboard is just a window into the backend, not a parallel source of truth. The Python service is locked to localhost — only the backend can call it, a clean boundary, no surprise inputs.
Outcome
The team runs day-to-day operations across multiple countries from one dashboard, not from a pile of spreadsheets and emails. Supplier and courier data lands in the system automatically regardless of format. One of the first big production systems in the portfolio, still running. Several hundred orders a day go through the system, closer to a thousand than to hundreds.