Project Overview
A small US online store selling across three sales channels, their own website, a marketplace, and a third-party retail partner, was managing inventory entirely through manual spreadsheets. The owner spent the better part of each week reconciling numbers across platforms, and even then, the data was inconsistent enough that overselling and stockouts were a regular occurrence. We were brought in to replace that manual process with a lightweight ML system built on the data they already had.
The Challenge
The core problem was that the owner had no unified view of inventory. Each sales channel reported stock levels differently, with no automated sync between them. Orders placed on one channel would sometimes sell through inventory that was already committed elsewhere, triggering customer complaints and emergency restocking orders at poor margins.
- Inventory data was scattered across three platforms with inconsistent formatting and no shared product identifiers
- Reorder decisions were made manually based on gut feel and weekly spot-checks, with no predictive visibility
- Stockouts were only discovered after customers had already placed orders for unavailable items
- The owner had no data science background and no budget for technical staff to manage a complex system
Our Solution
We built a lightweight ML model trained on six months of the client's sales history that automated two things: predicting reorder points for each SKU across channels, and flagging low-stock risks 48 hours before a projected stockout. The solution connected directly to their existing sales channel data, requiring no new platforms or manual data entry from the owner.
- Data Unification Layer: We built a simple ETL pipeline that pulled inventory and order data from all three channels into a single normalized table, resolving inconsistent product naming and formatting across platforms.
- Demand Forecasting Model: A gradient boosted model trained on the client's own sales history, accounting for day-of-week patterns, promotional periods, and seasonal variation in their product categories.
- Automated Reorder Alerts: The model calculated dynamic reorder points per SKU and sent the owner an automated summary each morning flagging items projected to stock out within 48 hours, with a suggested reorder quantity.
Technical Approach
Given the absence of any technical staff on the client side, the system was designed for near-zero maintenance. The pipeline runs on a lightweight scheduled job that pulls data from each channel's API nightly, runs the forecasting model, and writes alert outputs to a simple dashboard the owner accesses each morning. No model retraining or intervention is required unless the product catalog changes significantly. We used Python with scikit-learn for modeling and built the pipeline to run on a low-cost cloud instance within the client's existing budget constraints.
Results and Impact
- Stockouts reduced significantly in the first two months following deployment, with the owner identifying and restocking at-risk items before they ran out
- Manual inventory tracking eliminated completely: the owner no longer maintains spreadsheets across channels
- 8 hours per week recovered that had previously been spent on manual reconciliation and reactive restocking
- 3 channels unified into a single inventory view for the first time in the business's history
- 48-hour advance warning on low-stock events gave the owner enough lead time to reorder before any customer-facing impact
Lessons Learned
The most important decision on this project was scoping the solution to match what the client could actually operate. A more sophisticated system with real-time sync and automated purchase orders would have been technically possible, but it would have introduced complexity the owner couldn't manage or troubleshoot independently. By keeping the output simple, a daily alert summary with clear reorder suggestions, we ensured the system got used consistently rather than abandoned when something unfamiliar appeared.
The data unification work also proved to be the most time-consuming part of the engagement, not the modeling. Getting three platforms with inconsistent SKU naming into a single clean table required more iteration than expected. For small businesses with data spread across multiple tools, that foundational step is almost always where the bulk of the early effort needs to go.