# Items, products and services

> Xero treats items as a convenience most invoices ignore. QuickBooks makes them the required mechanism for sales lines. NetSuite makes them a costing subsystem with a dozen record types.

Source: https://lopifi.com/apis/items
Part of: Lopifi — US GAAP books on autopilot, reviewed by a CPA (https://lopifi.com)

---

**Is an item optional, required, or a subsystem?** The line editor's item field is nullable and its requiredness is a source capability — never a hardcoded prop.

## Divergences between Xero, QuickBooks Online and NetSuite

### Writing an invoice to QuickBooks may mean creating items

If your source model carries accounts and not items, every QBO invoice write needs an item that points at the intended income account. Created on the fly, one per account, those items accumulate in the customer's product list and appear in their own reports.

**Handling:** Provision a small, clearly named set of integration items up front, map account to item explicitly, and show the mapping in the connection settings rather than hiding it in the adapter.

### Inventory valuation is not comparable across the three

Xero is average cost, QBO is FIFO, NetSuite is configurable per item and per location. The quantity on hand is comparable; the value is not, and neither is the cost of goods sold that flows from it.

**Handling:** Never present an inventory value as a cross-source aggregate without stating the costing method per source. Quantities may be summed; values may not.

## Canonical shape

```ts
type Item = {
  id: string;
  code?: string;
  name: string;
  kind: "service" | "inventory" | "non_inventory" | "bundle" | "category";
  sales?: { unitPrice?: Money; accountId?: string; taxCode?: string };
  purchase?: { unitCost?: Money; accountId?: string };
  inventory?: { assetAccountId?: string; quantityOnHand?: string; costingMethod?: string };
  active: boolean;
  source: SourceRef;
};
```
