The retailer sells short-shelf-life goods through two marketplaces, its own storefront and an offline point of sale, plus product feeds into Google Ads and Facebook Ads. Every new item was keyed in by hand — once into the warehouse system, then again into each channel. Stock was reconciled by daily export, so a channel would happily sell an item the warehouse no longer had, or one it did have but with an expiry date too close to ship, which meant a manager calling to check. Cancellations reached 15% of orders: marketplace penalties and a listing sinking in search. Delivery notes were typed by hand and errors in carrier waybills surfaced at the carrier. Goods receipts were filled in on paper and re-keyed by accounting. Purchasing was assembled from last year’s files.
The stack was chosen for the job: Python and Django at the core, PostgreSQL as the single source of truth for product, stock and expiry date. An item is entered once and the platform creates and updates it everywhere, product feeds included. The model that handles calls sits behind an interface and is replaceable on purpose — something better ships every few months, and we move the client onto it without rewriting anything else.
Each phase went to production on its own and started paying for itself before the next one began.
Because we were not learning the domain as the project went along: we have owned a business like this one and know its processes by heart — where stock reconciliation breaks, why expiry date matters more than availability, and what people actually ask a call centre. There were plenty of technical problems, but they were resolved quickly, because none of them was a surprise. In an unfamiliar industry the same scope would have taken several times longer, and we say so during the audit rather than in month three.
The service pages explain the method behind this project; the solution pages take the same building blocks on their own, each with its own scope and price.
We use cookies for analytics — to see which pages bring enquiries. Nothing else, and nothing before you agree. Cookie Policy