Solavel Solavel Docs

Products & Services

docs/solavel-finance/products-services.md

Who can use this: Owner, Manager, Accountant. URL / Route: /finance/inventory/items (finance.inventory.items.index). Detail pages: finance.inventory.items.show, edit, create, store, update, destroy. Search endpoint: finance.inventory.items.search. Price resolver: finance.inventory.items.resolve-price. Plan / feature gate: feature:tracker.manage_items (default: enabled). Permissions: inventory.items.view, inventory.items.manage. Categories use inventory.categories.view / inventory.categories.manage. Units use inventory.units.view / inventory.units.manage. All four require the org-level inventory_enabled flag (see Inventory).

Purpose

The Items list is where you define everything you sell or buy: services (a fixed-price hour of consulting), stocked products (something you keep on a shelf), and non-stocked products (something you buy on demand and pass through). Quotes, invoices, sales orders, bills, expenses, and purchase orders all line-pick from this list.

Step by step

Browse items

  1. Open /finance/inventory/items. Each row shows item code (SKU), name, type (Service / Stocked / Non-stocked), category, unit, sales price, purchase price, on-hand quantity (stocked only), and status.
  2. Search by code or name; filter by type, category, status.

Create an item

Route: finance.inventory.items.create / finance.inventory.items.store. Permission: inventory.items.manage.

  1. Click New item.
  2. Pick Type:
    • Service — no stock, no on-hand quantity, no COGS. Use for billable hours, subscriptions, fees.
    • Stocked — Solabooks tracks on-hand quantity and posts COGS when sold.
    • Non-stocked — a physical good you buy as needed; no stock tracking, but COGS is still posted from the purchase price.
  3. Enter Code (SKU), Name, optional Description.
  4. Pick Category (finance.inventory.categories.*) and Unit (finance.inventory.units.*).
  5. Set Sales price and Purchase price in your base currency.
  6. Map Sales account and Purchase / Expense account — these are the GL accounts used when this item appears on a document.
  7. Stocked items only: set Inventory account, COGS account, and Reorder point if inventory.reorder_point is on.
  8. Pick Sales tax and Purchase tax defaults.
  9. Save.

Edit an item

Route: finance.inventory.items.edit / update. Permission: inventory.items.manage.

You can change name, description, prices, accounts, and category. Once an item has stock activity, you cannot change the Type.

View an item

Route: finance.inventory.items.show. Permission: inventory.items.view.

Shows current sales price, purchase price, current stock (if stocked), recent transactions, and a sales history chart.

Resolve a price

Route: finance.inventory.items.resolve-price (GET). Used by other forms (invoices, sales orders) to ask "what is the actual price for this item, given this customer / quantity / price list?". Returns the price after applying the customer price list, customer-group rules, quantity tiers, and pricing rules.

Delete an item

Route: finance.inventory.items.destroy. Permission: inventory.items.manage. Allowed only when the item has zero references on any document and zero stock.

Service vs Stocked vs Non-stocked

Setting Service Stocked Non-stocked
Tracks quantity on hand? No Yes No
Has reorder point? No Yes (if inventory.reorder_point on) No
Posts COGS when sold? No Yes Yes
Available when inventory_enabled = false? Yes No No
Where it shows up on the P&L Income only Income + COGS Income + COGS

If your organization has the inventory_enabled flag turned off, only Service-type items can be created.

Pricing add-ons

If your plan includes them and the matching feature flag is on:

  • Price lists (price_lists): a named list of overrides. Assign per customer or pick at line entry.
  • Multiple price lists (multiple_price_lists): more than one list per organization.
  • Customer-group pricing (customer_group_pricing): a discount tier shared by all customers in a group.
  • Pricing rules (pricing_rules) and advanced pricing rules (advanced_pricing_rules): condition-based rules ("if customer is in group A, this item is 10% off").
  • Quantity pricing (quantity_pricing): tiered prices that activate above a quantity threshold.

These are configured under Settings. The Resolve price endpoint composes all of them in the right order.

Common mistakes

  • Wrong type at creation. Type is locked once stock activity exists. If you picked Service but the item should be Stocked, you'll need a new item — archive the old one to keep history.
  • No COGS when selling. The item is Service or Non-stocked. Switch to Stocked if you want full inventory tracking — only possible before any transaction.
  • Item missing from picker on invoices. The item is archived — un-archive from its Edit page, or check the type matches the document (Service items don't appear on stock-only pickers).
  • Default tax doesn't apply. Tax defaults flow into new document lines but every line is still editable. If your accountant overrode the tax on one line, that's a per-line decision, not an item-default bug.
  • Stocked item shows on documents but on-hand never changes. The line was entered as an Account line, not an Item line. Pick the item from the dropdown — not just type the description.

Tips

  • The SKU field is searchable via Global search — handy for warehouse / barcode-style workflows.
  • The item's Transactions tab is the fastest audit trail for "where did this price come from?" questions.
  • Use the Sales price and Purchase price to default the entire line — both are editable per-document.

Behaviour and rules

  • The Item type is locked after first stock movement; the Sales/COGS account choice can still change but won't backfill existing postings.
  • An item without a Sales account cannot appear on an invoice; without a Purchase account it cannot appear on a bill.
  • Sales tax / Purchase tax defaults flow into new lines but every line remains editable.
  • Stocked items respect the global Inventory accounting method (FIFO or weighted-average, set per organization).

Permissions / restrictions

  • View list and detail: inventory.items.view.
  • Create / edit / delete: inventory.items.manage.
  • Categories and Units have their own permissions (inventory.categories.*, inventory.units.*).
  • All of the above also require the org-level inventory_enabled feature, except that Service-type items still work when inventory_enabled = false.

Related

Source: docs/solavel-finance/products-services.md ← All documentation