Purchasing

Every item can have many suppliers. Purchasing keeps their prices current and compares them fairly. It splits each purchase among them so the firm pays the least in total: goods, freight and minimum orders together.

Back office → Commerce → Purchasing.

Smart buying: the cheapest whole purchase, not the cheapest line

Buying every line from whoever is cheapest for that line pays freight for every small parcel. Smart buying looks at the WHOLE purchase instead.

An example:

  • You need 10 × P, which only supplier B sells, at 5 EUR.
  • You also need 1 × Q: A sells it at 9.50, B at 10.
  • Both charge 6 EUR freight below 50 EUR.
Buy each line where it is cheapest Smart buying
Goods 50 (B) + 9.50 (A) 50 + 10 (both B)
Freight 0 (B) + 6 (A) 0
Total 65.50 EUR 60 EUR

Q goes to B even though A is cheaper per piece. The result explains why: "Alfa is cheaper per piece (9.50) but would add 5.50 to the whole purchase."

Smart buying (Commerce → Purchasing → Smart buying):

  1. Collect what you need. Add items one by one, or load everything that is below its reorder minimum.
  2. Optionally set a delivery date. Suppliers whose lead time misses it are left out.
  3. Find the cheapest split. The result shows each supplier's goods and freight, the total, and the saving against buying each line separately. It also shows why every line went where it went.
  4. Pin a line to a supplier if you want it there for your own reasons. The rest is recalculated around it, and the result shows what the choice costs.
  5. Create purchase orders: one draft order per supplier, priced from that supplier's own price list in its own currency.

What smart buying weighs:

  • Price tiers. "9.50 from 100 pieces" is no offer for 3 pieces.
  • Currencies. Each price is converted to the firm's currency by the current rate, and the rate's date is shown.
  • Pack sizes. A box of 10 is compared per piece.
  • Freight. It falls away from the supplier's free-shipping threshold.
  • Minimum order. A surcharge below a supplier's minimum order counts.
  • Supplier stock. Where the supplier reports stock, a line it cannot cover is split between suppliers.

The automatic reorder (Inventory → reordering rules marked auto) uses the same smart buying. A firm's whole reorder need becomes one draft order per supplier.

For up to 12 candidate suppliers the answer is the proven optimum. Beyond that, the best split found within a time limit is shown, and the result says so.

Comparing suppliers for one item

Compare suppliers ranks every supplier of one item for a given quantity (and optionally a date). The ranking uses what that quantity would cost if ordered from that supplier alone, freight included. Notes explain the position: lead time misses the date, the supplier has too little in stock, a tier starts above the quantity, or the supplier is preferred within the firm's tolerance.

Suppliers and their terms

A partner marked as a supplier appears under Suppliers. On its page you set the terms that smart buying weighs:

  • currency;
  • freight and the free-shipping threshold;
  • minimum order and the surcharge below it;
  • default lead time and payment terms;
  • whether orders may go out without review.

Price lists that keep themselves current

A supplier's prices can arrive three ways. Pick the connector on the supplier's page under Price list:

Connector For What you set
Spreadsheet price list CSV or XLSX at an address, or an uploaded file the column header for each field
XML price list any XML feed; BMEcat with one click (preset) the item element (e.g. ARTICLE) and a path per field: ARTICLE_DETAILS/EAN, an attribute as price/@currency
Supplier API (JSON) a supplier's API, page by page the address (with {page} for paging, or a path to the next page), the path to the item list (data.products) and a dotted path per field (price.amount). With a lookup address (…/{code}) comparisons also get the supplier's live price and stock.

For any connector, connect a supplier's price list once:

  • the address where the supplier publishes it (CSV or XLSX), or upload the file;
  • the column mapping: which column holds the price, the supplier's code, the manufacturer code or EAN, the quantity tier, pack size, lead time and stock;
  • optional credentials: user:password, a header (X-Api-Key: …) or a token. They are stored encrypted and never shown again.
  • the schedule: every N hours, or 0 to import only by hand.

Each import produces a report:

Section Meaning
Price jumps beyond the threshold changed by more than the firm's limit (default 15 %), applied and flagged
Changed / New applied
No longer offered the new list does not carry it: kept and dated, never deleted, no longer used in comparisons
Not matched to an item no item of the firm has that code: match it once and the supplier's code is remembered
Fits several items not applied until you decide

Notes on matching and repeat imports:

  • Rows match by the supplier's own code, our item code (SKU, order code) or EAN, ignoring case, spaces and dashes.
  • Prices typed by hand are never touched by an import.
  • Importing the same list twice changes nothing.
  • A price list is applied as one change for the shop: the web's kept pages are refreshed once when the import ends, not once per price. (A 39 000-row wholesaler list refreshed them per row on 2026-10-20 and slowed every firm's web until it was stopped.)
  • A file the connector reads whole may be at most 80 MB. A bigger catalogue — Schrack's is 178 MB — is streamed by its import script with the same connection, the same mapping and the same report (see Products › Wholesaler catalogue: Schrack).

What an item costs us

The Purchasing settings decide how an item's cost follows purchasing:

Rule Cost becomes
Typed by hand (default) whatever someone typed: nothing automatic
Average cost of stock received the moving average of receipts
Last purchase price the price of the last purchase order received
Preferred supplier's price the price of the supplier preferred for the item
Cheapest current supplier price the lowest current price, in the firm's currency

The selling-price floor never lets an item sell below its cost or the minimum margin. When the cost rises under an unchanged selling price, the new cost is saved, because it is the truth about what we pay. The item is listed for repricing, and nothing is repriced automatically.

A purchase order that knows what happened to it

Open a purchase order and choose Supplier and delivery at the top. That page follows the order from your side to the supplier and back.

  • Receiving warehouse: chosen while the order is a draft. When the order is confirmed, its receipt is created in that warehouse rather than in the first one.
  • Minimum order and free shipping: a draft shows how much it is short of the supplier's minimum order and of free shipping. It also proposes this supplier's other items that are below or near their reorder point, each added with one click.
  • Send to the supplier: a confirmed order goes through the supplier's connector when the connector takes orders. Otherwise it goes by e-mail from your mailbox, with the PDF for a person and a CSV of the lines for the supplier's system. A failure is kept on the order with its reason; send again once it is fixed.
  • Send automatically: when a supplier's terms say so, a confirmed order leaves on its own and the person who confirmed it gets a notification. Drafts made by reordering are confirmed and sent too, unless an approval rule stops them for a person to decide.
  • The supplier's confirmation: type how many pieces the supplier confirms per line, and by when. The expected arrival moves to the latest date, and the order shows partly confirmed or confirmed.
  • Progress per line: ordered, confirmed, received and invoiced, with what is still open and anything delivered over the order. Received comes from the receipts and is never typed by hand.

Three-way match

A supplier invoice is compared line by line with its order and receipt.

  • It may not bill more pieces than were received.
  • It may not bill a higher price than was ordered.

Small differences pass within the tolerances in Purchasing settings. The result is shown on the invoice under Three-way match.

Posting a mismatched invoice is refused only when the firm turns it on in Purchasing settings ("Refuse posting a supplier invoice that does not match…"). It is off by default, so a bill can still be posted before the goods arrive, as before. Once it is on, a person with the override permission can still post a mismatched invoice. They have to give a reason, which is kept with the invoice.

Competition: what others ask for the same product

Every product (and every item of it) has a Competition tab in the back office. It lists the competing firms with their prices next to ours, ranked from the cheapest:

  • our rank and how far above the cheapest we are, in money and per cent;
  • the lowest, highest and average price of the competition;
  • per competitor: price (converted to our currency when it is quoted in another one), the address of the offer, stock and when the price was seen.

Competitors are ordinary partners — firms from the contacts — marked with the competitor flag, just as suppliers carry the supplier flag. A firm can have as many competitors as it likes.

Prices get there two ways:

  • typed by hand on the Competition tab (competitor, price, currency, offer address, stock);
  • imported from the competitor's feed: on the partner's purchasing page connect a spreadsheet, XML or API source and choose Competitor prices. The import matches rows by code or EAN exactly as a supplier price list does and runs on the same schedule.

Commerce → Purchasing → Competition shows the whole firm at once: every item where a competitor is cheaper than we are, the biggest gap first, plus which competitor is the cheapest most often. All watched items shows the rest too.

Price history and charts

Every price change is kept: our own selling price, each competitor's price and each supplier's price. Nothing is overwritten without a trace — an unchanged price adds no point, a changed one adds a new point with its date and source (typed, imported). The Competition tab draws the history as a chart per item: our price as a bold line, every competitor as its own line, so you see who moved first and how the gap developed.

For the assistant

Claudia can do all of this in the firm open in the toolbar, with the Manage purchasing permission:

  • purchasing_suppliers, purchasing_supplier_save
  • purchasing_connection_save, …_test, …_delete
  • purchasing_import_run, purchasing_imports, purchasing_import_match
  • purchasing_compare, purchasing_split, purchasing_split_to_orders
  • purchasing_settings, …_save, purchasing_cost_lock, purchasing_reprice
  • competition_prices, competition_price_save, competition_price_delete, competition_overview
  • purchasing_order, purchasing_order_warehouse, purchasing_order_send, purchasing_order_confirmation, purchasing_order_shipped
  • purchasing_order_gaps, purchasing_order_top_up, purchasing_invoice_match, purchasing_match_override

Coming next

  • live price and stock from a supplier's own API.
Теги
erppurchasingsuppliers