Beauty Corner Teams / Operations

BC Supply Ops

A self-hosted operations platform for BeautyCorner.gr that controls catalog import, stock synchronization, supplier ordering, least-cost routing, repricing, price-comparison feeds, revenue analytics, and merchandising for a 70,000+ product Shopify store. Built to act on a live storefront safely, with real inventory and real money on the line.

Live operations portal

One workspace for catalog, pricing, stock, orders, and supplier control.

The system replaces scattered spreadsheets, manual Shopify admin work, supplier emails, price research sheets, and third-party merchandising tooling with one authenticated dashboard backed by scheduled automation. It opens on a single screen that answers the only question that matters first thing in the morning: what needs a human today.

BC Supply Ops operations overview showing active products, new arrivals, out-of-stock count, order queue, and a products-by-supplier breakdown
Timeline2026 - Present
RoleProduct, design, architecture, engineering
StackPython • React • Flask • Node • Shopify
70,000+products on the live store
7suppliers unified (3 automated · 4 spreadsheet)
70,418variants checked in one minimum-price audit
10+systemd services and timers behind it

The problem was not one automation. It was the whole operating model.

BeautyCorner sells fragrance and beauty products through Shopify while sourcing from three API suppliers and four spreadsheet-based suppliers. Each supplier has different product data, stock behavior, pricing rules, and order workflows.

Manual work broke in predictable places: new products had to be reviewed, stock needed to stay true, COD and paid orders needed supplier ordering, prices had to protect margin, and collection merchandising needed better signals than a shallow app could provide.

3 APIsuppliers with automated catalog and ordering
4 sheetsspreadsheet suppliers with custom parsers
0unguarded live writes by default
Architecture

Two automation engines, one session-gated portal, no browser-side secrets.

The platform runs on a single VPS behind nginx and TLS. Python handles catalog, stock, ordering, pricing, and enrichment. Node handles analytics-backed collection ranking. React exposes only controlled operations; keys and write permissions stay server-side.

Analytics

Revenue, profit, margin, AOV, top products, and top brands in the same portal.

The latest analytics view shows a 30-day revenue and profit snapshot pulled into the operations dashboard, not a marketing projection — revenue up 79% and profit up 106% on the previous period, against 54.974,07 € revenue and 22.159,46 € profit lifetime.

31.294,61 €30-day revenue
13.499,27 €30-day profit
55.5%margin after supplier cost
44,96 €average order value
696orders in the analytics window
1,485units sold
BC Supply Ops revenue and profit analytics dashboard
Catalog import

Supplier rows become reviewable storefront work, not blind imports.

Sync downloads the supplier feed, normalizes it through the shared engine, and matches every barcode against the live store — read-only, no Shopify writes. Only then does a reviewable new-arrival plan appear. On the Fragrances Wholesale feed that means 18,649 catalog products matched, 456 clean candidates ready to publish, 113 new variants for products already listed, and 1,271 held back for review. Publishing is capped per run, idempotent, and resumable, so duplicate barcodes and already-published items are skipped rather than re-created; house-style AI copy is layered on at publish time. 23,924 products have been created on Shopify this way.

BC Supply Ops new-arrivals view showing catalog match counts, products ready to publish, and publish controls
The imageless tail

A product with no image cannot be sold, so it never reaches the store.

Some suppliers ship rows with no usable imagery at all. Rather than publish blank product pages or silently drop the products, the portal parks them: 1,354 arrivals are currently waiting on images, split by supplier so the work is finishable — Perfect Fragrance 518, BeautyCommerce 337, Symphonia 259, 1001Parfum 200, VeryCosmetics 40. An operator pastes image URLs onto a card, saves, and pushes. Only products with a saved image are published; each image lands on the right variant, and the push is idempotent, so an interrupted batch resumes instead of duplicating.

BC Supply Ops manual scraping view for adding image URLs to imageless new arrivals before publishing
Order automation

When a supplier runs out mid-order, the system looks for the product somewhere else.

Paid, COD, and bank-transfer orders are queued, re-confirmed against live Shopify state, grouped into dispatch windows, and submitted as consolidated supplier purchase orders once a batch clears its minimum ex-VAT subtotal. The hard case is an order line whose supplier has since gone out of stock. Every one of those is matched by barcode against every other supplier in the pool: of 46 stuck lines, 4 are buyable elsewhere right now and can be re-sourced or ordered from that supplier in one action, while 42 genuinely have no source anywhere and wait for a restock. Restocks rejoin the auto-order on their own; excluding a line stops it from ever being auto-ordered again.

BC Supply Ops orders manager showing order lines out of stock at their supplier and alternative in-stock suppliers
Manual suppliers

Four spreadsheet suppliers, one controlled sync model.

Each supplier sends a different weekly sheet — different headers, currencies, SKU prefixes, and stock semantics, and one of them prices in pounds. Supplier-specific parsers normalize them into comparable snapshots, detect new arrivals, apply stock changes in paced jobs, and keep cost resolution tied back to the supplier source. Every upload re-runs the price audit automatically. The API suppliers stay fully automated elsewhere in the portal.

Perfect FragrancePF

13 sheets

1,624 rows · last upload 31 Jul 2026

BeautyCommerceBC

7 sheets

2,263 rows · last upload 27 Jul 2026

VeryCosmeticsVC

4 sheets

746 rows · last upload 09 Jul 2026

1001ParfumSD

4 sheets

46 rows · last upload 23 Jul 2026

BC Supply Ops manual supplier stock sheets with upload, open, and history controls per supplier
Pricing controls

Market undercutting and margin floors share the same safety model.

Pricing is split into two views: competitive market repricing when the market is safe to undercut, and a catalog-wide minimum-price audit that only lifts prices back to margin floor.

Market pricing

Competitor research turns into guarded price changes.

The market-pricing view ingests competitor research workbooks, resolves supplier cost, computes a cost-based minimum per supplier, then recommends a price one cent under the cheapest market listing — but only when that still clears the floor. Anything where the market sits at twice our own minimum is flagged as suspect and excluded from auto-apply rather than trusted. The latest run priced 8,047 products, undercut 3,004, held 4,520 at minimum, and flagged 399 for review.

  • 8,047 products priced
  • 4,056 store changes pending
  • 399 high-market rows held
BC Supply Ops market pricing dashboard with undercut, minimum floor, and review buckets
Minimum-price audit

The floor audit only lifts prices. It never lowers them.

The audit walks every live variant, resolves cost from the right supplier source, and sorts each SKU into below minimum, at or above minimum, or no cost on file. The latest run audited 70,418 variants and found 35,869 already safe, 34,525 with no cost to check against, and 24 priced under the floor — of which 3 are queued to be lifted. That the number is 24 and not 2,400 is the point: the guard runs continuously, so it never has much to catch.

  • 70,418 variants audited
  • 35,869 at or above min
  • 3 lifts pending
BC Supply Ops minimum-price audit dashboard across all catalog variants
Least-cost sourcing

Every variant routes itself to the cheapest in-stock supplier.

For each live variant the system compares what every supplier charges for the same barcode and rewrites only the SKU to route it to the cheapest in-stock source — barcode, images, and selling price stay put. A still-in-stock variant switches only when the saving is meaningful (≥ 0,50 € and ≥ 2%); a variant whose supplier goes out of stock always moves to the next-cheapest one, and each switch restamps the delivery-time metafield to match the new supplier’s window. The last run found nothing to move — all 7,015 multi-sourced variants already sit on their cheapest in-stock supplier. That zero is the system in steady state, not the system idle.

36,652variants analysed
7,015carried by two or more suppliers
0would switch supplier right now
0flagged for a manual eyeball
≥ 2%saving required to move a live variant
1-14day delivery windows restamped on switch
BC Supply Ops least-cost sourcing dashboard routing each variant to the cheapest in-stock supplier
Price feeds

Custom XML feeds power BestPrice, Skroutz, and Google Merchant.

Every comparison-shopping channel gets its own hand-built product feed, generated out-of-band and served on its own subdomain. Each rebuild walks the full catalog with live stock and pricing on its own cron cadence, so listings stay accurate without touching the operations database directly.

BestPrice.grHealthy

48,659 items

46,572 in stock · rebuilt every 5h · 37.2 MB

Google MerchantHealthy

45,932 items

45,932 in stock · rebuilt every 6h · 64.9 MB

Skroutz.grOn demand

3,900 items

regenerated on demand · 4.4 MB

BC Supply Ops price-comparison feeds health for BestPrice, Google Merchant, and Skroutz

What was actually hard

  • Barcode-first matching across supplier APIs, weekly sheets, Shopify products, variants, testers, refills, and duplicate supplier rows.
  • Stock sync where absence means out of stock, except when the feed is short, because a bad sheet must not zero the store.
  • Supplier dispatch across paid, COD, and bank-transfer orders without double-ordering or buying for cancelled orders.
  • Re-sourcing an order line mid-flight when its supplier sells out, without stranding the rest of the batch.
  • Competitor repricing that protects margin floors and flags suspicious market data instead of blindly inflating prices.
  • LLM enrichment constrained to structured output, reused by normalized product family, and never allowed to invent ingredients.

The page looks like admin software. The engineering is about controlled failure.

Every risky action has a plan, a guard, a ledger, a paced worker, and an audit trail. That is the difference between a dashboard that looks useful and a system you can trust to mutate a live store.

The important detail is that the automation never needs perfect inputs. It has explicit states for review, hold, no cost, too high, below minimum, cancelled, unknown, and manually handled. Messy data becomes an operating queue instead of a silent bug.

Safety as a feature

This system writes to Shopify and can place supplier orders. It is built like that matters.

Dry-run first.

Catalog import, stock sync, supplier dispatch, and repricing all produce reviewable plans before live writes are allowed.

Typed confirmations.

Live actions use explicit confirmation tokens like DISPATCH, SYNC, and PRICE so there is no casual one-click path to spending money.

Double write guards.

Network writes require DRY_RUN=false plus the relevant ALLOW_*_WRITES flag, checked before any Shopify or supplier call.

Feed-health holds.

Short or broken supplier feeds hold removals instead of mass-zeroing inventory, then surface the issue for review.

Paced jobs.

Bulk writes run through background workers with progress polling because synchronous 1,000+ item writes hit Shopify rate limits.

Audit logs and ledgers.

Operator actions, dispatch attempts, publish hashes, and sync state are recorded so interrupted jobs self-heal instead of duplicating work.

Under the hood

The stack, named honestly.

  • Python
  • React + Vite
  • Flask
  • Node.js
  • SQLite
  • PostgreSQL
  • Shopify Admin API
  • ShopifyQL
  • Anthropic Claude API
  • nginx + TLS
  • systemd timers

What this case study should prove.

I can build the unglamorous systems that real commerce teams depend on: the data normalization, reconciliation, rate-limit handling, auditability, and operator UX that make automation reliable enough to run without babysitting.

BC Supply Ops is not a prototype. It is an operating layer for a live Shopify business, built around the idea that speed only matters when safety is already solved.

If you remember one thing

  • Operations platform for a 70,000+ product Shopify store.
  • Seven suppliers unified into one dashboard.
  • Catalog import, imaging, stock sync, ordering, least-cost sourcing, pricing, feeds, analytics, and merchandising.
  • Guarded by dry-run plans, typed confirmations, health checks, paced jobs, and audit logs.

Plan your supplier integration.

Start with the supplier feeds and manual corrections your team handles today. Share your store URL, supplier count and the systems that own stock and pricing so we can discuss a scope grounded in your workflow.

Discuss Shopify supplier automation

Practical guides