Made-to-order & curated Shopify brands on ERPNext
How a design-led brand that sells on Shopify — some products held in stock, some built bespoke to order, much of it sourced from specialist makers — should set ERPNext up so finance, operations and the warehouse all read from one truth.
Two demand models, one business
A stocked line and a bespoke line behave differently at every step. ERPNext has to tell them apart — flag each item's model, and let each order line route down the right path (a single order can contain both).
| Dimension | Stocked · make-to-stock | Bespoke · make-to-order |
|---|---|---|
| Sold on Shopify as | In stock — ships from the shelf | Made to order — lead time / preorder |
| Triggers production | Reorder level / min-max / forecast | The customer's Sales Order |
| Payment | Full at checkout | Deposit up front, balance on delivery |
| Revenue recognised | At sale / dispatch | On delivery (balance invoice) |
| Where value sits | Finished-goods inventory (asset) | Work-in-progress until delivered |
| Shopify inventory | Two-way sync — live available qty pushed back | Not stock-tracked |
| Key ERPNext levers | Item (stock) · Reorder Level · Production Plan | Sales Order · BOM · Work Order |
Sourcing from multiple specialist makers
Many of these brands don't make everything themselves — they curate. One catalogue might be filled by a soft-furnishings maker, a lighting maker and a furniture maker, plus a long tail of smaller suppliers. This is a second axis on top of stock-vs-bespoke: who makes it — you, or a supplier.
Worked example — three makers, one catalogue
| Maker (Supplier) | Supplier Group | Category (Item Group) | Typical buy mode |
|---|---|---|---|
| Soft-furnishings workshop | Soft furnishings | Shades & Bedding | Stock the fast lines · make-to-order the custom sizes |
| Lighting maker | Lighting | Lamps & Lights | Stock the bestsellers · dropship or to-order the rest |
| Furniture maker | Furniture | Tables & Case goods | Mostly made-to-order (lead time) · a few display lines stocked |
The setup that makes it work
- Suppliers grouped by discipline — one
Supplierper maker, inSupplier Groups(Lighting, Soft furnishings, Furniture), each with its lead time and payment terms. - Item Groups by category · default supplier per item — so reporting rolls up by product line and a purchase suggests the right maker automatically.
- Buy for stock —
Purchase Order→Purchase Receiptinto the finished-goods warehouse → available on Shopify; replenish on reorder level. - Buy to order — the customer's
Sales Orderraises aPurchase Order(orSubcontracting Order) to the maker; receive it, then deliver to the customer. - Dropship — for bulky or slow lines, flag the item so the maker ships direct to the customer and no stock touches your warehouse.
- Landed cost — a
Landed Cost Voucheradds freight, import and handling to item cost, so margin isn't overstated.
Purchase Order → Purchase Receipt → Purchase Invoice, and you track each supplier's on-time delivery like your own floor.Finance — set the ledger up to answer questions, not just file returns
The chart of accounts you design in week one decides which questions you can answer in year one.
- Split revenue — and matching cost of sales — by product line. The single biggest lever. If every sale lands in one
Product Salesaccount you can never see margin per line; give each line its own income and COGS account, or use aCost Center/Accounting Dimension. Decide the lines up front. - Book deposits as a liability; recognise revenue on delivery. Post customer deposits to a
Customer Deposits Receivedliability, not to income. Recognise revenue and its COGS when the product is delivered and the balance is invoiced, so they land in the same month. - Carry finished-goods stock as an asset; recognise at sale. Stocked catalogue items are inventory you own until sold — on the balance sheet at cost, with revenue and COGS landing together at dispatch, no deposit, no deferral.
- Treat the undelivered order book as the forward view. Open Sales Orders not yet delivered are future revenue and WIP — report the backlog and how much is already cash-secured by deposits.
- Reconcile to the accounts off the GL, not raw invoices. Invoice documents include proformas, credit notes and intercompany lines and read far above recognised revenue; the
GL Entryincome accounts are the truth. - Load budgets so a forward-looking P&L compares against a real plan.
Operations — the order is a promise; production keeps it
Most failures here aren't software — they're a step someone stopped doing in ERPNext. (This covers what you make in-house; sourced products go via the makers above.)
- One Sales Order per customer order — the contract. It carries items, price, promised delivery date and deposit; everything downstream hangs off it.
- Open and close every Work Order. The discipline that matters most: mark work started on the floor and completed when it comes off. Un-closed work orders make WIP inflate forever and on-time-delivery meaningless.
- A costed BOM per product drives material requirements, planned cost and — with actuals — real margin per job.
- Build to the shelf as well as to the order. Stocked lines are produced ahead of demand via
Production Planand reorder points — run those replenishment work orders on the same start/close discipline. - Measure on-time delivery against the promised date, per order line — the best pulse of whether ops keeps the storefront's promises.
Warehouse & stock — keep the system equal to the shelf
Every dashboard upstream is only as good as whether system stock matches what's physically there.
- Discipline the item master and category every item. Consistent codes; each item tagged finished good / raw material / consumable, and within finished goods, its product line. No category means no product-line reporting anywhere.
- Model your real spaces as warehouses / bins — raw store, WIP, finished goods, dispatch — so counts and WIP valuation match reality.
- Post movements as they happen, not in weekly batches — issue to production, receive finished goods, dispatch on delivery, in ERPNext, at the moment it happens.
- Finished-goods stock is your shop window. For stocked lines the shelf quantity is the quantity the website offers — count often and keep the two-way Shopify sync honest.
- Reorder levels on raw materials raise a
Material Requestbefore a build stalls on a missing part. - The Delivery Note is the handoff to finance — it moves stock out and triggers cost of sales, keeping dispatch and revenue recognition in step.
Shopify ↔ ERPNext — who owns what
Shopify is the shop window; ERPNext is the system of record. Keep the storefront simple and let ERPNext own production, stock and finance.
| Job | Where it lives |
|---|---|
| Selling, storefront, checkout, marketing | Shopify |
| Orders & customers → Sales Orders / Invoices | Sync in to ERPNext |
| Finished-stock levels of stocked lines | Sync out to Shopify (don't oversell) |
| Production, stock, purchasing, the ledger | ERPNext |
| SKU ↔ Item code | Mapped 1:1, exactly and consistently |
Go-live checklist, by role
| Owner | In place before go-live | Why it matters |
|---|---|---|
| Finance | Revenue + COGS accounts split by product line | Margin by line becomes possible |
| Finance | Deposit liability account & recognition-on-delivery rule | P&L reflects earnings, not cash timing |
| Finance | Reconciliation to management accounts via GL | ERPNext ties to the accountant's number |
| Operations | Costed BOM per product line | Material needs + real margin per job |
| Operations | Work-order start/close routine agreed with the floor | Honest WIP & on-time delivery |
| Warehouse | Item master coded, every item categorised | Product-line reporting end to end |
| Warehouse | Warehouses/bins model the real spaces | Counts & WIP match reality |
| Supply | Suppliers grouped; default supplier + lead time per item | Purchasing routes to the right maker |
| All | Every item flagged stocked vs made-to-order | Right fulfilment path; no overselling |
| All | Shopify SKU ↔ Item code mapping verified | The integration stays reliable |
The most common ways it goes wrong
- One revenue account. Everything in
Product Sales→ no margin by product line, ever. - Deposits booked as revenue. The P&L swings on when cash lands, not when product is earned.
- Work orders never closed. WIP inflates indefinitely; on-time-delivery becomes noise.
- Item codes drift from Shopify SKUs. The integration mis-maps and stock/orders silently diverge.
- Stock posted in weekly batches. System stock stops matching the shelf; every downstream report is suspect.
- Reconciling to accounts off raw invoices. Invoice documents read far above recognised revenue — reconcile on the GL.
- Two entities summed together. Intercompany value counted twice; group revenue looks several times reality.
- Items with no category. No product-line dimension exists, so no product-line reporting can.
- Stocked and bespoke not distinguished. The same item sold both ways — oversell shelf stock, or carry phantom made-to-order “inventory”.
- No default supplier or landed cost. Purchases route to the wrong maker and freight/duty never hits item cost — COGS understated, margin flattered.