# Inventory in the CRM

Products & inventory and the CRM share one set of records. A contact's page shows what they have ordered; a deal carries the products being quoted, with the stock each has right now; an estimate whose lines carry SKUs becomes a sales order in one click, and an order becomes an invoice on the contact's record. Search finds products and orders beside contacts and deals, and a Workiz job can take the parts its technician used out of stock. Every link runs both ways, so you can always get from the order back to the deal, estimate or job it came from.

```mermaid
flowchart LR
  C[Contact page] -->|+ Order| SO[Sales order]
  D[Deal: Products card] -->|Create sales order| SO
  E[Estimate with SKUs] -->|Create sales order| SO
  W[Workiz job] -->|Take parts from stock| SO
  SO -->|reserves, then ships| S[(Stock)]
  SO -->|Create invoice| I[Invoice on the contact]
  SO -->|In your books| B[QuickBooks or Xero]
```

## What you'll need

The CRM surfaces below appear only while the **Products & inventory** module is on for the workspace, and each one checks a key of its own:

| To | Key | Seeded roles |
|---|---|---|
| See the **Sales orders** card on a contact, a deal's **Products** card, orders on the timeline, and a Workiz job's **Parts used** | **View Sales & Purchase Orders** (`inventory:orders:read`) | Viewer, Member, Manager |
| Use **+ Order**, **Create sales order**, **Create invoice** and **Take parts from stock** | **Manage Sales & Purchase Orders** (`inventory:orders:manage`) | Member, Manager |
| Add or edit a deal's products | **Edit Deals** (`crm:deals:edit`) and `inventory:orders:manage` | Member, Manager |
| See the **SKU** column on estimates and invoices, and find products in search | **View Products & Stock** (`inventory:products:read`) | Viewer, Member, Manager |
| Choose whether Workiz jobs take parts on their own | **Manage Inventory Settings, Locations & Stores** (`inventory:config:manage`) | Manager |

A Workiz job page also needs **View Workiz Jobs** (`workiz:jobs:read`), and appears only in a workspace that has connected Workiz.

## A contact's sales orders

Open a contact (**CRM → Records → Contacts** → the contact). Under **Estimates & Invoices** sits the **Sales orders** card:

- One line that says what they have bought: *4 orders · CA$1,240.00 · 1 open · last ordered 3 days ago*. Totals stay per currency — two currencies read as two figures joined with *+*, never one sum. Cancelled and draft orders are left out of the count and the totals.
- Their latest five orders, each with its number (and the store's number for a store order), status, where it came from, when, and its total. Click a number to open the order.
- **See all N orders →** when there are more: it opens **Sales orders** filtered to the contact, with a **Customer:** chip at the top; click its **×** to show every customer again.

To start an order for them, click **+ Order** in the card's header. **New sales order** opens with the contact already picked; add the lines and click **Create order**. The full form is described in [Sales and Purchase Orders](/help/inventory/orders).

<!-- SCREENSHOT: inventory/crm-contact-sales-orders.png — A Demo contact's page scrolled to the Estimates & Invoices card and, below it, the Sales orders card: the summary line with an order count, a total and "last ordered …", three order rows with status chips, and the + Order button in the card header -->

## Products on a deal

Open a deal (**CRM → Records → Deals** → the deal). The **Products** card lists catalog items with a quantity and a price, the stock each has right now, and their total.

### Add or change the lines

1. Click **Add** (or **Edit** once the deal has lines).
2. Type a **SKU or barcode** and leave the field. The product's name appears under the line; a code the catalog does not know reads *No product has SKU or barcode …*.
3. Set the quantity. Leave **Price (auto)** blank to use the price this deal's contact would be quoted — their price list or a volume tier, else the catalog price — or type a price. **% off** takes a discount.
4. **+ Add line** for more; the bin removes one.
5. Click **Save**.

Each line then reads *SKU · quantity × price · N available*. The available figure is across all your locations, and turns amber when it is less than the quantity on the line. Lines on a deal hold no stock; the sales order does.

### The total and the deal's value

The card's total is the lines' total. The deal's own value never changes on its own: when the two differ, **Use as deal value** copies the total into the deal's value. It needs `crm:deals:edit`, and shows only when the lines and the deal are in the same currency.

### Turn the deal into an order

Click **Create sales order** (`inventory:orders:manage`). An order is made for the deal's contact with these lines at these prices, *Pending*, linked to the deal both ways; the contact's address, when they have one, becomes its ship-to. The card then shows *Order SO-… <status>*, and the order's **Linked records** shows the deal.

A deal has one order while it stands, so the button is replaced by the order. If that order is cancelled, the card says so, and **Create sales order** returns to start a new one.

<!-- SCREENSHOT: inventory/crm-deal-products.png — A deal page's Products card with two lines (one showing "N available" in amber because it is short), the Total, the "Use as deal value" link, and the Create sales order button -->

## Catalog lines on estimates and invoices

The **Estimates & Invoices** card on a contact, lead, company or deal page links its lines to the catalog.

**A SKU on a line.** In **+ Estimate** or **+ Invoice** (or **Edit**), the line items have a **SKU** column. Type a SKU and leave the field: a catalog match fills the description and unit price when they are blank, and the field's border turns green (*A catalog product*). A SKU the catalog does not know stays on the line as typed. Saved lines show their SKU beside the description.

**An estimate becomes a sales order.** An estimate that is not declined or expired, and has no order yet, shows **Create sales order** (`inventory:orders:manage`). Clicking it:

1. Checks every line names a catalog product. A line without a SKU blocks the order, and the message names it: *These estimate lines are not catalog products, so they cannot become order lines: … Give each a SKU on the estimate (or remove it), then try again.*
2. Makes a *Pending* order at the estimate's prices, for the estimate's contact (shipping to their address, when they have one), linked to the estimate and its deal.
3. Marks a draft or sent estimate *accepted*, and opens the new order.

The estimate then shows **Became a sales order**, linking to it, in place of the button: an estimate makes one order.

**An order becomes an invoice.** An order with a CRM contact, no invoice yet, and not from an online store shows **Create invoice** in its panel. It makes a draft invoice on the contact's record, numbered like the order, with the order's lines and shipping. The invoice shows **From sales order**; the order's **Linked records** shows the invoice. Each order has one invoice. To post the order to QuickBooks or Xero instead, see [Accounting and Shipping Partners](/help/inventory/accounting-and-shipping).

<!-- SCREENSHOT: inventory/crm-estimate-to-order.png — The Estimates & Invoices card on a Demo contact: one estimate row with its expanded lines showing SKUs beside the descriptions and the "Create sales order" link, and one invoice row showing "From sales order" -->

## Find products and orders in search

Open search from the top bar (or press **⌘K** / **Ctrl+K**), type, and click **See all results for "…" →**. On the results page, the **Products & orders** filter narrows to:

- **Products**, matched by name, or by a variant's SKU or barcode. Needs `inventory:products:read`.
- **Sales orders**, matched by order number, the store's order number, or the customer's name or email. Each result shows the customer, the total in its own currency and the status. Needs `inventory:orders:read`.

## Orders on the timeline

The **Activity Timeline** on a contact, lead or company page has an **Order** row for each sales order the record's contacts placed — a company's timeline includes its contacts' orders. A row reads *Order SO-… (store number)* with the items, the total in its own currency, badges for the status, how far it has shipped and where it came from, and **Open order**. **Order** rows show under **All** and **Activity**, and need `inventory:orders:read`.

## Parts used on Workiz jobs

When Workiz is connected, a job's line items can take parts out of stock: once the job is done, the line items that are catalog products leave stock on a **Workiz** sales order linked to the job, so a van's or a warehouse's count follows the work without anyone keying it in.

### Which line items count

A Workiz line item counts when its name, as typed in Workiz, is:

- a SKU or barcode in your catalog, or
- the exact name (case aside) of a product that has one variant.

Anything else — labour, a service call, a product with several variants named only by its product name — is left out, and named: the job page lists it under *Not counted*, and the order carries a notice saying what was left out and why. A job with no catalog line at all makes no order; that is a labour-only job, not a missing match.

### Choose when parts leave stock

**Inventory → Setup → Inventory Settings**, the **Workiz jobs** section:

- **Take parts from stock** — *Only when someone presses Take parts from stock on the job* (the default) or *Automatically when a job is marked Done*.
- **From location** — the location the parts leave; *The default location* when blank.

Click **Save**. With the automatic choice, a job's parts leave stock when a Workiz update — its webhook, or the regular Workiz sync — brings the job in as done.

### On the job page

Open a job (**CRM → Daily work → Workiz Jobs** → the job). The **Parts used** section lists the job's catalog parts (*2 × name · SKU*) and what was *Not counted*, then either:

- *Taken from stock on SO-…* with the order's status, once parts have left; or
- what will happen — *These leave stock automatically when the job is marked Done*, *This job is Done; its parts leave stock with the next Workiz update*, or *Parts leave stock only when someone takes them* — and **Take parts from stock** (`inventory:orders:manage`), which takes them now whatever the setting says.

<!-- SCREENSHOT: inventory/workiz-job-parts-used.png — A Workiz job page's Parts used section listing two catalog parts with SKUs, a "Not counted (not catalog products): Labour" line, the sentence about automatic consumption being off, and the Take parts from stock button -->

### The Workiz order

The order is made already shipped, from the **From location**: the parts were used on the job. It reads *Workiz* as its source and *Job #…* as its store number, and its customer is the job's client by name. Whether the job is paid is Workiz's business, since Workiz invoices the job, so accounting pushes leave Workiz orders out unless you include them.

Each job makes one order, ever: a repeated Workiz update finds the one already made. If the job's line items change after the parts left stock, the order is not rewritten — its shipment is the stock record — and a notice says what the job now names: *Record a return for parts that came back, or edit the order for parts added.* If stock could not be taken, the order says so, and you ship it by hand once the stock is right.

## Troubleshooting

- **No Sales orders card, Products card or Parts used section.** The module is off for the workspace, or your role lacks `inventory:orders:read`. A tenant admin checks **Settings (the gear icon) → Workspace → Modules**.
- **Saving a deal's products fails.** Editing them needs both `crm:deals:edit` and `inventory:orders:manage`.
- **Create sales order on an estimate says lines are not catalog products.** Give each named line a SKU in the estimate (or remove it), save, and try again.
- **A Workiz job's parts did not leave stock.** The setting is *Only when someone presses…* (the default), or the line items are not SKUs, barcodes or single-variant product names. The **Parts used** section says which.
- **No Create invoice on an order.** The order has no CRM contact, already has its invoice, or came from an online store.

## Next steps

- [Sales and Purchase Orders](/help/inventory/orders) — what an order does to stock, shipping and returns.
- [Accounting and Shipping Partners](/help/inventory/accounting-and-shipping) — orders as invoices in QuickBooks or Xero.
- [Connecting an Online Store](/help/inventory/shopify-woocommerce) — store customers matched to contacts.
- [CRM Overview](/help/crm/overview) — contacts, deals and the records these cards sit on.
