Multi-Branch Inventory

Each shop location has its own spare-part rows and stock numbers. Adding a product requires a specific branch.

Why stock is per branch

A spare part is stored with branch_id / branch_name. When the same catalog item exists in two shops, the second row is a clone of the first (branch_clone_source_id). Qty at PJ and qty at KL are independent.

When a job or invoice uses a part, ExpeDite resolves the catalog row for that job's branch (by id, then by clone source). If no row exists for that branch, stock is left unchanged and a warning is logged for retry — it does not silently take another branch's shelf.

Add stock at a location

  1. Switch to the branch in the location switcher (top bar).
  2. Open Inventory.
  3. Click Add Product or AI Import. If no branch is selected, you will see Select a branch / "Choose a specific branch before adding inventory."

Locked extra branches cannot be used until you subscribe them. Shop includes the first branch. More locations need the Extra Branch add-on (RM90/month each). Free and Solo cannot buy it. See Multi-branch setup.

What this is not

Inventory movements you will see: sale (used on a job), return, adjustment, void_restore (invoice void). There is no separate "transfer stock from Branch A to Branch B" movement. To move goods between shops, adjust (or receive) stock on each branch's own catalog so both histories stay honest.

Staff access Team members restricted to selected branches only see those catalogs. Owners always have all branches. See Roles & permissions.

Last updated: 8 September 2026