Skip to content
All work

Case study 03 / 06

Bonjout Beauty

Beauty · E-commerce

From spreadsheets to an MRP platform

  • Data engineering
  • Software engineering
  • Cloud & infrastructure
bonjoutbeauty.com
Bonjout MRPDemo data
Bonjout MRP operations dashboard

Key figures

From Shopify order to the MRP
Minutes
Weeks of stock projection
12 to 52
Backdated COGS restatement
2 years
Sales data landed in BigQuery
Daily

The brief

  • The challenge

    A fast-growing DTC and wholesale beauty brand running on gigantic Excel files, then on a patchwork of tools: stock spread across warehouses, filling labs and partners, and no single answer to what it owns, what it really cost, and when it will run out.

  • What we built

    First, daily analytics: the brand's sales data lands in BigQuery every day (today through DataSync) and feeds its dashboards. Then a full MRP platform (purchasing, lot-level inventory, stock projection, production planning, landed-cost COGS and Shopify sync) and its integration with a new API-only 3PL.

  • Outcome

    One system of record for purchasing, stock, production, sales and COGS, in place of the spreadsheets: Shopify orders applied within minutes, every unit traceable to its lot, and purchased stock to its actual landed cost.

Related services: Full-stack developmentData collection and analysisPlatform integrations

Expertise

What it took.

  • Data engineering

    • Event-sourced inventory on the app's append-only stock-movement ledger: business-dated movements, oldest-lot-first depletion, physical-count replay and as-of reconstruction of any past day.
    • A landed-cost COGS engine (PO price × daily ECB rate plus freight, frozen per lot) rolled into a daily weighted-average ledger that restates history when a backdated event lands.
    • Shopify ingestion with exactly-once effects: HMAC-verified webhooks drained every 5 minutes, a 15-minute reconcile job and a full historical backfill.
    • DataSync pipelines that land Shopify data in BigQuery every day for dashboards and accounting exports.
  • Software engineering

    • A Flask API and a React 19 app: Recharts dashboards, drag-and-drop production and arrival planning.
    • Automated tests: unit, integration against a real Postgres, and frontend.
    • A defensive, tested client for a 3PL API with no webhooks and no updates: ambiguous writes are never retried and implausible receipts are held.
    • Wholesale orders rebuilt natively from a legacy app: retailer POs from PDFs and emails parsed by an LLM, then invoices, packing lists and stock reservations in the MRP.
  • Cloud & infrastructure

    • Cloud Run services plus a Cloud Run Job for long Shopify syncs.
    • A Cloud Build pipeline that runs database migrations before each API deploy, so a failing migration stops the release.
    • OIDC-secured Cloud Scheduler jobs managed from inside the app, and separate DEV and PROD environments with their own databases and stores.

Project 01

Bonjout MRP

Flask · React 19 · PostgreSQL · Cloud Run

The brand's operational system of record: purchase orders through shipments and freight to lot-level receipts; an append-only stock ledger across warehouses and labs; 12-to-52-week stock projections with what-if arrivals; lab production planning and versioned BOMs; wholesale orders parsed from retailers' POs; and actual landed-cost COGS. It is built on, and extends, the database of the brand's previous internal app.

Goal
Answer, at any time, what the brand owns, where, what it really cost, and when it will run out.
Highlights
  • Weekly projection per location: 21-day velocity, BOM-driven component demand, safety stock and reorder-by week
  • Replenishment suggestions that convert into purchase orders
  • Daily COGS ledger with backdated restatement up to two years
  • In-app API reference and a help guide with flow diagrams
Stack
  • Python
  • Flask
  • SQLAlchemy
  • React 19
  • Recharts
  • PostgreSQL
  • Cloud Run
Bonjout MRPDemo data
Bonjout MRP dashboard
(full size, opens in a new tab)
Operations dashboard: purchasing, stock, sales and margins from one data model.
Bonjout MRPDemo data
Weekly stock projection grid
(full size, opens in a new tab)
Weekly stock projection per SKU, with incoming shipments, retail orders and projected stockouts.
Bonjout MRPDemo data
COGS detail with cost layers
(full size, opens in a new tab)
Landed cost of a kit: lot layers, freight and the daily weighted-average COGS.
Bonjout MRPDemo data
Purchase orders list
(full size, opens in a new tab)
Purchase orders by vendor, with milestones and totals.
Bonjout MRPDemo data
Cloud Scheduler job cards
(full size, opens in a new tab)
Scheduled jobs managed from the app, each secured with OIDC.
Diagram of the MRP data flows
(full size, opens in a new tab)
How Shopify, freight bills and FX rates feed the ledger and the planning engines, and where the new 3PL integration plugs in.

Project 02

3PL integration

3PL API · Shopify GraphQL · Cloud Scheduler

Moving fulfilment to Capacity, an API-only 3PL with no webhooks and no update endpoints, meant the MRP had to drive everything: send the orders Shopify routes to the warehouse, announce each inbound shipment as a receiving order, in whole cases where the case pack allows, book receipts from six daily batch windows, write tracking back to Shopify and reconcile stock against the warehouse's nightly count.

Goal
Switch 3PLs without double-shipping, double-counting or losing stock accuracy.
Highlights
  • Tested end to end from a Shopify development store against the 3PL's sandbox, with its UAT test plan automated
  • Receipts at twice the announced quantity are held, never booked
  • A nightly count that would zero most SKUs is refused
  • Readiness checklist, request log and per-shipment panels for operators
Stack
  • Python
  • Flask
  • Shopify GraphQL
  • Cloud Scheduler
  • REST APIs
Bonjout MRPDemo data
3PL integration console
(full size, opens in a new tab)
3PL console: go-live checklist, scheduled pulls and nightly inventory reconciliation.
Bonjout MRPDemo data
Shipment page with the 3PL receiving panel
(full size, opens in a new tab)
An inbound shipment with its receiving order, and a receipt held for review.
Bonjout MRPDemo data
3PL request log
(full size, opens in a new tab)
Every call to the 3PL logged, retries included.

Project 03

Analytics on DataSync

DataSync · BigQuery · Looker Studio

Before the MRP, DataGem replaced the spreadsheets with daily dashboards on BigQuery; those feeds now run on DataSync, its ingestion platform: Shopify data is exported, staged and merged into BigQuery on a daily schedule with no human step, and the same warehouse now feeds the MRP's accounting exports.

Goal
Daily, accurate business metrics without anyone touching a spreadsheet.
Highlights
  • Shopify bulk exports streamed into BigQuery in date windows
  • Staging tables merged into history by key, so re-runs don't duplicate rows
Stack
  • DataSync
  • BigQuery
  • Cloud Run Jobs
  • Cloud Scheduler
  • Looker Studio
DataSync consoleDemo data
DataSync run history with execution logs
(full size, opens in a new tab)
DataSync (demo tenant): a Shopify sync run with its live execution log.
Diagram of the DataSync architecture
(full size, opens in a new tab)
DataSync: one ingestion platform, each client in its own cloud.

The dashboard created by Datagem Consulting has been a game-changer for our start-up. Pierre has demonstrated an excellent understanding of our needs, delivering a customized solution tailored specifically to our business requirements.

We now have immediate access to all our data with 100% accuracy, presented exactly how we want to see our business – all in one place, automatically updated daily without any human intervention.

Our needs continue to evolve, and over time, we have requested additional custom analysis and data tracking. Pierre has always responded promptly, day or night 😊, listening carefully, with patience.

He has been the perfect partner in this project. We have made many people envious of our Dashboard, and I certainly don’t miss our gigantic Excel files!

Aude EstampesCFO, Bonjout Beauty

Your project next.