Operating ERPNext with Shopify
The setup playbook gets the sync running. This one is about running the business afterwards: the terminology, and how to use ERPNext as your financial system and your fulfilment system while Shopify keeps doing what it is good at — selling. Written for the finance and operations people who live in ERPNext every day.
Companion to the Shopify → ERPNext setup playbook00 · The division of labour
Shopify and ERPNext overlap on paper — both have "products", "customers", "orders". In practice each owns a different half of the business. Decide the boundary once, write it down, and the team stops asking "where do I do X?".
| Shopify owns (the sales channel) | ERPNext owns (the back office) |
|---|---|
| The storefront, theme, product pages, collections | The general ledger and chart of accounts |
| Cart, checkout, discount codes, shipping rates | Accounts receivable & payable, tax / VAT |
| Taking the payment (Shopify Payments / gateway) | Recording the payment against the books & bank |
| Customer-facing accounts, marketing, email | Inventory truth & valuation (what you really hold, at what cost) |
| The catalogue as customers see it (titles, images, price) | Fulfilment documents (Delivery Notes), COGS |
| Displaying "in stock / sold out" on the channel | Purchasing & replenishment, supplier bills |
| The order as a sales event | The order as a financial & stock event, plus all reporting & statements |
01 · Terminology — the Rosetta Stone
The single biggest source of confusion is that the two systems use different words for the same thing — or the same word for different things. Keep this table handy for the first month.
| In Shopify… | …is, in ERPNext | What it actually means |
|---|---|---|
| Order | Sales Order SO-Shopify-##### | The customer's commitment to buy. The anchor document everything else hangs off. |
| Order marked Paid | Sales Invoice + Payment Entry | The invoice is the revenue/AR document; the payment settles it. Shopify already took the money, so both are created together. |
| Fulfilment | Delivery Note | Goods leaving the warehouse. This is what reduces stock and books cost of goods sold. |
| Refund | Credit Note (a return Sales Invoice) | Reverses revenue, VAT and (if goods come back) stock. A refund is never "just" a Shopify action. |
| Product | Item (a template) | The parent. A product with options becomes a template that owns its variants. |
| Variant | Item (a stockable variant) | The thing you actually count and sell. 10 products with options can be 23 item rows — not duplicates, just one row per sellable variant. |
| SKU | Item Code | The shared key that lets the two systems agree on "which thing". |
| Collection | Item Group | Category. Shopify uses it for merchandising; ERPNext uses it for reporting and default accounts. |
| Customer | Customer | Same word — but guest checkouts often land against a default Walk-in Customer rather than a named record. |
| Location | Warehouse (& Bin) | Where stock physically sits. The Bin holds the live quantity per item per warehouse. |
| Inventory / "available" | Actual Qty / Projected Qty | ERPNext distinguishes what you hold now from what you'll hold after open orders & POs. |
| Payout (Shopify Payments) | Bank deposit reconciled via a clearing account | One bank deposit = many orders, net of fees. The trickiest reconciliation — see §03. |
| Discount | Discount on the SO/Invoice line or total | Carried across so the invoiced amount matches what the customer actually paid. |
| Draft order | Quotation / draft Sales Order | Not yet a committed sale; no financial or stock effect until confirmed. |
02 · The document chain — how one sale flows
A single Shopify order becomes a short chain of linked ERPNext documents. Each step does one job; together they keep the money and the stock honest.
| Step | Trigger from Shopify | Effect in ERPNext |
|---|---|---|
| Sales Order | Order created | Records the demand. No money or stock moves yet. Status To Deliver and Bill. |
| Sales Invoice | Order paid | Books revenue + VAT, raises a receivable. Status moves toward Paid. |
| Payment Entry | Order paid | Settles the receivable; lands the cash in a bank/clearing account. |
| Delivery Note | Order fulfilled | Depletes stock from the warehouse and books cost of goods sold. |
Draft (0) → Submitted (1) → Cancelled (2). Only submitted documents hit the ledger. A Sales Order also carries per_billed and per_delivered percentages — per_billed = 100 means fully invoiced, per_delivered = 100 means fully shipped. That pair tells you at a glance exactly where an order is.
03 · ERPNext as your financial system
This is the half Shopify cannot do. Shopify tells you what sold; ERPNext turns that into double-entry bookkeeping, a tax position, and statements your accountant and SARS will accept.
What a sale posts to the ledger
You rarely touch journals by hand — the documents post them for you. For one paid, delivered order the books move like this:
| Document | Debit | Credit |
|---|---|---|
| Sales Invoice | Debtors (or Shopify clearing) | Sales revenue + VAT Output |
| Payment Entry | Bank / Shopify clearing | Debtors |
| Delivery Note | Cost of Goods Sold | Stock-in-Hand |
Revenue and VAT land on the invoice; cost lands on the delivery. That separation is what lets ERPNext show you a true gross margin per product, not just a sales total.
VAT & tax
Set a sales tax template (South Africa: 15% VAT Output) and apply it as the default on Shopify-sourced invoices so the tax-inclusive Shopify price reconciles to a tax-exclusive base + VAT in ERPNext. The VAT / Tax reports then give you the return figures directly from the ledger — no spreadsheet.
The payout reconciliation — the one that bites everyone
The clean pattern:
- Order payments post to a Shopify Payments Clearing account (a current asset), not directly to Bank.
- When the payout lands, record one transfer: Bank debit, Clearing credit, with the processing fees posted to an expense account for the difference.
- The clearing account should trend back to zero — any residual is fees-in-transit or an unreconciled order. It becomes your daily health check.
Returns & refunds
A Shopify refund must be mirrored as a Credit Note (return Sales Invoice) in ERPNext — that reverses the revenue and VAT, and if the goods physically come back, a return Delivery Note puts the stock back. Refunding only in Shopify leaves your books and VAT overstated.
Month-end close & the reports that matter
- General Ledger — every posting, the source of truth.
- Accounts Receivable Summary — what's still owed (small for prepaid Shopify, but watch it).
- Sales Register — invoice-level sales with tax, reconciled to Shopify's order report.
- Profit & Loss and Balance Sheet — the statements, straight from the ledger.
- VAT / Tax report — the return figures.
- Shopify Payments Clearing back to ≈ zero, bank reconciled, payouts matched.
04 · ERPNext as your fulfilment system
Shopify shows the customer "in stock". ERPNext is what actually knows how many you hold, where, and at what cost — and produces the paperwork when goods leave.
X units of Item … needed in Warehouse. Before the first fulfilment, post opening balances via a Stock Entry → Material Receipt (or Stock Reconciliation) for every item. This is the single most common "why won't it work" on day one.
Where stock lives
A Warehouse is a stock location (e.g. Stores - LL); a Bin is the live quantity for one item in one warehouse. Actual Qty is what you hold now; Projected Qty nets in open sales orders and incoming purchase orders so you can see trouble coming.
The fulfilment flow
- Order syncs in as a Sales Order (status
To Deliver). - Pick & pack against it.
- Raise a Delivery Note from the Sales Order — this depletes stock and books COGS. With the connector's delivery sync on, a Shopify fulfilment creates this automatically.
- Partial shipments are fine: deliver some lines now, the rest later;
per_deliveredtracks progress.
Keeping the channel honest (stock back to Shopify)
Optionally, ERPNext can push stock levels back to Shopify (update_erpnext_stock_levels_to_shopify) so the storefront's "available" reflects real on-hand quantity. With this on, ERPNext is the inventory master and Shopify becomes a display of it — the cleanest model once you trust your stock data.
Replenishment
When stock runs low you buy more — entirely in ERPNext, invisible to Shopify: Material Request → Purchase Order → Purchase Receipt (stock in) → Purchase Invoice (supplier bill). Set reorder levels on items so ERPNext flags or auto-raises requests before you sell out.
Stock reports
- Stock Balance — qty & value on hand by item/warehouse.
- Stock Ledger — every movement, the audit trail behind the balance.
- Stock Projected Qty — what you'll have after open orders & POs.
- Stock Ageing — what's sitting and not selling.
05 · Who does what — and where
The practical cheat-sheet. When in doubt: customer-facing & catalogue → Shopify; money & stock truth → ERPNext.
| Task | Do it in… | Notes |
|---|---|---|
| Add / edit a product, price, image, description | Shopify | Flows to ERPNext on sync. Never edit catalogue in ERPNext. |
| Run a promotion / discount code | Shopify | The discount carries through to the invoice. |
| Take a sale / payment | Shopify | Checkout + gateway. ERPNext records it after. |
| Fulfil / ship an order | Shopify → ERPNext | Mark fulfilled in Shopify; the Delivery Note & stock move post in ERPNext. |
| Process a refund | Shopify + ERPNext | Refund in Shopify and raise a Credit Note in ERPNext — both, every time. |
| Record / reconcile the bank & payouts | ERPNext | Clearing account → bank, fees to expense. |
| File VAT / produce financial statements | ERPNext | Straight from the ledger. |
| Count, value & adjust stock | ERPNext | Stock Reconciliation / Material Receipt. ERPNext is the inventory master. |
| Buy more stock from suppliers | ERPNext | Material Request → PO → Receipt → Bill. |
| Add a B2B / wholesale customer & terms | ERPNext | Off-channel sales live in ERPNext directly. |
06 · Operating rhythm
Daily
- Glance at the sync console — orders flowing, connector enabled, no growing error pile.
- Fulfil the day's paid orders; Delivery Notes post as you go.
- Check the "not synced" list and clear the reason (deleted product, edge case).
Weekly
- Reconcile Shopify payouts → bank; clearing account back toward zero.
- Review low-stock / reorder flags; raise Purchase Orders.
- Spot-check a few orders end-to-end: SO → Invoice → Payment → Delivery.
Monthly
- Reconcile ERPNext Sales Register to Shopify's order report.
- VAT return from the Tax report; bank fully reconciled.
- Stock count / reconciliation; review gross margin by product.
- Close: Profit & Loss and Balance Sheet reviewed.
Gotchas — the expensive lessons
Drawn from live battle-testing on a controlled store. Each one cost time the first time.
| Symptom | Cause & fix |
|---|---|
Delivery Note won't submit: X units needed in Warehouse | Items imported with zero stock. Load opening stock (Material Receipt) before fulfilling. Optionally allow negative stock as a demo safety net — never in production without intent. |
| A burst of orders, some don't create a Sales Order | Many orders arriving in the same second contend on the naming-series counter (Record has changed … tabSeries). Harmless and recoverable — re-run the backfill serially and they land. Real stores rarely hit this; high-volume ones should add a retry. |
| Bank balance never reconciles | Order payments posted straight to Bank instead of a clearing account. One payout ≠ one order. Route via clearing; reconcile the payout with fees to expense. |
| Books / VAT overstated after returns | Refund done only in Shopify. Always mirror with a Credit Note in ERPNext. |
| Orders land against "Walk-in Customer" | Guest checkouts with no account map to the default customer. Expected — segment with customer groups/territories if you need named B2C records. |
| ~A few % of historical orders never sync | Edge cases by design: products deleted in Shopify, malformed/blank line items. The sync console lists exactly which and why — reconcile manually if material. |
| Edited a price in ERPNext, Shopify ignored it | Catalogue is Shopify's to own; the sync is one-way in. Change it in Shopify. |
Sources & further reading
- ERPNext Accounting — docs.frappe.io/erpnext · Accounts
- ERPNext Stock & Inventory — docs.frappe.io/erpnext · Stock
- ERPNext Selling (Sales Order, Delivery Note) — docs.frappe.io/erpnext · Selling
ecommerce_integrationsShopify connector — github.com/frappe/ecommerce_integrations- Free courses — 📚 Learn ERPNext · Setup & sync — Shopify → ERPNext setup playbook