A Shopify store with tens of thousands of products from several suppliers is an operations problem first and a storefront problem second. These are the patterns behind the platform I built for a 70,000+ product beauty store sourcing from seven suppliers.
Seven Suppliers, Three Kinds of Feed
Real supplier data is messy. Of the seven suppliers here, three send automated feeds and four still send spreadsheets. Each uses its own column names, price formats and stock conventions. The first job is a shared normalisation step, so everything downstream sees one shape of data. Clean supplier data also pays off in large-catalog SEO.
Import as a Plan, Not a Blind Upload
A sync downloads the supplier feed, normalises it and matches every barcode against the live store, without writing anything. Only then does a reviewable plan appear: which products are new, which changed, and which are ready to publish.
Products with no usable images are parked instead of published so operators can review them before they reach the storefront. Splitting that queue by supplier makes it finishable; at one point 1,354 new arrivals were waiting on images across five suppliers. The missing-image review and publishing workflow explains how to take those arrivals from a hold to a reviewed listing.
Hold Bad Feeds Instead of Zeroing Stock
The most dangerous day is when a supplier sends a short or broken file. A naive sync reads "these products are missing" and sets thousands of items to zero stock. A feed-health check compares the feed with what is expected and holds removals when something looks wrong, then flags it for a person to review.
Price From a Floor, Not From a Guess
- Resolve the real supplier cost for each product and compute a cost-based minimum price.
- Use competitor research to suggest a price just under the cheapest market listing, but only when it still clears the floor.
- Flag listings where the market sits at twice your own minimum. That usually means bad data, not an opportunity.
- Run a floor audit that only ever raises prices that fell below the minimum. One run checked 70,418 variants and found 24 priced under the floor.
Order From Whoever Can Actually Fill It
Orders, whether paid, cash on delivery or bank transfer, are queued, re-checked against live Shopify data, grouped into dispatch windows and sent to suppliers as consolidated purchase orders once a batch clears the supplier's minimum. The hard case is an order line whose supplier sold out after the customer paid. The system looks for the same product at another supplier instead of cancelling.
Least-cost sourcing works the same way. When two or more suppliers carry a product, it moves to the cheaper one only if the saving is at least 2%, and the delivery estimate shown to customers is updated to match.
Guard Every Live Write
| Guard | What it prevents |
|---|---|
| Dry run first | Import, stock sync, dispatch and repricing all produce a plan before any live write |
| Typed confirmations | Spending money needs a typed word such as DISPATCH or PRICE, not one click |
| Double write flags | Live writes need both DRY_RUN=false and a specific ALLOW_*_WRITES flag |
| Paced background jobs | Bulk writes of 1,000+ items run in workers instead of hitting rate limits |
| Audit logs and ledgers | Interrupted jobs resume instead of duplicating orders or writes |
All of it runs on one Ubuntu server behind nginx, as more than ten systemd services and timers. You do not need a big cloud bill to run a big catalog; you need careful operations.
Where to Start
If your team spends its week on supplier spreadsheets and stock fixes, start with the dry-run plan and the feed-health hold. Those two alone prevent most expensive mistakes. The BC Supply Ops case study shows the full platform, and you can book a call if you want something similar for your store.