ERPNext Africa · operations playbook

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 playbook
The one idea to hold onto Shopify is the shop — the storefront, the checkout, the card swipe. ERPNext is the back office — the ledger, the stockroom, the tax return. The connector copies sales one way, Shopify → ERPNext. So the rule of thumb is: anything a customer sees, you change in Shopify; anything about money or stock-on-hand, you trust in ERPNext. Get that split right and the two systems never fight.

00 · 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, collectionsThe general ledger and chart of accounts
Cart, checkout, discount codes, shipping ratesAccounts receivable & payable, tax / VAT
Taking the payment (Shopify Payments / gateway)Recording the payment against the books & bank
Customer-facing accounts, marketing, emailInventory 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 channelPurchasing & replenishment, supplier bills
The order as a sales eventThe order as a financial & stock event, plus all reporting & statements
Where it goes wrong Editing a product title or price in ERPNext: pointless — Shopify won't see it, and the next sync may overwrite it. Processing a refund only in Shopify: the customer is happy but your books and VAT are now wrong. Keep each task on its owning side (see §05).

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 ERPNextWhat it actually means
OrderSales Order SO-Shopify-#####The customer's commitment to buy. The anchor document everything else hangs off.
Order marked PaidSales Invoice + Payment EntryThe invoice is the revenue/AR document; the payment settles it. Shopify already took the money, so both are created together.
FulfilmentDelivery NoteGoods leaving the warehouse. This is what reduces stock and books cost of goods sold.
RefundCredit Note (a return Sales Invoice)Reverses revenue, VAT and (if goods come back) stock. A refund is never "just" a Shopify action.
ProductItem (a template)The parent. A product with options becomes a template that owns its variants.
VariantItem (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.
SKUItem CodeThe shared key that lets the two systems agree on "which thing".
CollectionItem GroupCategory. Shopify uses it for merchandising; ERPNext uses it for reporting and default accounts.
CustomerCustomerSame word — but guest checkouts often land against a default Walk-in Customer rather than a named record.
LocationWarehouse (& Bin)Where stock physically sits. The Bin holds the live quantity per item per warehouse.
Inventory / "available"Actual Qty / Projected QtyERPNext distinguishes what you hold now from what you'll hold after open orders & POs.
Payout (Shopify Payments)Bank deposit reconciled via a clearing accountOne bank deposit = many orders, net of fees. The trickiest reconciliation — see §03.
DiscountDiscount on the SO/Invoice line or totalCarried across so the invoiced amount matches what the customer actually paid.
Draft orderQuotation / draft Sales OrderNot 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.

Shopify order  →  Sales Order  →  Sales Invoice  →  Payment Entry  →  Delivery Note
StepTrigger from ShopifyEffect in ERPNext
Sales OrderOrder createdRecords the demand. No money or stock moves yet. Status To Deliver and Bill.
Sales InvoiceOrder paidBooks revenue + VAT, raises a receivable. Status moves toward Paid.
Payment EntryOrder paidSettles the receivable; lands the cash in a bank/clearing account.
Delivery NoteOrder fulfilledDepletes stock from the warehouse and books cost of goods sold.
Read the status fields, not your memory Every document has a docstatus: 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.
Cancellations run backwards You cannot cancel a Sales Order that already has a submitted Invoice or Delivery Note hanging off it — ERPNext protects the ledger. To unwind, cancel down the chain first: Delivery Note, then Invoice (or raise a Credit Note), then the Sales Order. This is why a cancelled-in-Shopify order that was already paid won't simply vanish from ERPNext.

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:

DocumentDebitCredit
Sales InvoiceDebtors (or Shopify clearing)Sales revenue  +  VAT Output
Payment EntryBank / Shopify clearingDebtors
Delivery NoteCost of Goods SoldStock-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

One bank deposit ≠ one order Shopify Payments batches a day or two of orders into a single payout to your bank, net of fees. So R10,000 of orders might arrive as one R9,750 deposit. If each order's payment posts straight to "Bank", your bank line will never reconcile.

The clean pattern:

  1. Order payments post to a Shopify Payments Clearing account (a current asset), not directly to Bank.
  2. When the payout lands, record one transfer: Bank debit, Clearing credit, with the processing fees posted to an expense account for the difference.
  3. 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.

Do this first, or nothing ships: load opening stock Imported products arrive with zero quantity. A Delivery Note cannot submit against stock you don't hold — ERPNext refuses with 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

  1. Order syncs in as a Sales Order (status To Deliver).
  2. Pick & pack against it.
  3. 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.
  4. Partial shipments are fine: deliver some lines now, the rest later; per_delivered tracks 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.

TaskDo it in…Notes
Add / edit a product, price, image, descriptionShopifyFlows to ERPNext on sync. Never edit catalogue in ERPNext.
Run a promotion / discount codeShopifyThe discount carries through to the invoice.
Take a sale / paymentShopifyCheckout + gateway. ERPNext records it after.
Fulfil / ship an orderShopifyERPNextMark fulfilled in Shopify; the Delivery Note & stock move post in ERPNext.
Process a refundShopify + ERPNextRefund in Shopify and raise a Credit Note in ERPNext — both, every time.
Record / reconcile the bank & payoutsERPNextClearing account → bank, fees to expense.
File VAT / produce financial statementsERPNextStraight from the ledger.
Count, value & adjust stockERPNextStock Reconciliation / Material Receipt. ERPNext is the inventory master.
Buy more stock from suppliersERPNextMaterial Request → PO → Receipt → Bill.
Add a B2B / wholesale customer & termsERPNextOff-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.

SymptomCause & fix
Delivery Note won't submit: X units needed in WarehouseItems 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 OrderMany 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 reconcilesOrder 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 returnsRefund 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 syncEdge 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 itCatalogue is Shopify's to own; the sync is one-way in. Change it in Shopify.

Sources & further reading