Skip to main content

Set a product's accounting & financial line type

A product carries its own accounting configuration that feeds your general ledger. Two independent pieces control this:

  • Nominal-code overrides — per-product ledger accounts (sales, COGS, inventory, and more) that override your company-level defaults when this product posts to the GL. You set these on the product's Accounting tab.
  • Default financial line type — the revenue line type a product's sales collapse into during revenue recognition. This is set from the sales-channel product-mapping flow, not the Accounting tab, and it must be a revenue-classified type.

This page covers both, and how each one reaches the ledger.

Before you begin

  • Editing either piece requires the Update products permission (products.update) and read/write access to the Products scope. See the product permissions reference.
  • The nominal codes you pick from must already exist. They're defined and maintained in the Accounting settings area (each has a code and a name), and are shown in the picker as code - name.
  • Financial line types are also defined separately, in Settings. This page assigns an existing revenue line type to a product; it doesn't create line-type definitions.

Override a product's nominal codes

The Accounting tab has one card, Nominal Code Overrides, holding six ledger-account fields.

  1. Open the product and go to the Accounting tab.
  2. On the Nominal Code Overrides card, click Edit.
  3. For any of the six fields, pick a nominal code from the searchable list. Each field is independent — set only the ones you want to override.
  4. To fall back to the company default for a field, clear it (use the × in the picker) so it's left blank.
  5. Click Save. The card returns to read-only and the codes display as links to each nominal code.

The card shows an inline reminder: Override the company-level default nominal codes for this specific product. Leave blank to use company defaults. A blank field isn't an error — it simply means "use the account-level default at posting time."

The six override fields

FieldUnderlying keyWhat it posts
Salessales_nominal_code_idRevenue account for this product's sales
COGScogs_nominal_code_idCost of goods sold when the product ships
Inventoryinventory_nominal_code_idOn-hand inventory asset account
Inventory In Transitinventory_in_transit_nominal_code_idValue of stock in transit on inbound movements
Accrued Purchasesaccrued_purchases_nominal_code_idGoods-received-not-invoiced accrual
Discountdiscount_nominal_code_idDiscount / contra-revenue account

Each override lives on the product row as its own nullable foreign key. When a value is set, it takes precedence over your account-level default for that leg of the posting; when it's blank, the company default applies.

The edit lock applies here

The Accounting tab respects the shared per-product edit lock. If another user is already editing this product, the Edit button is disabled and its tooltip names who holds the lock. If someone takes over while you are mid-edit, the card drops back to read-only and your unsaved changes are discarded. See Edit a product's details for how the lock behaves.

Set the default financial line type

The default financial line type decides which revenue line a product's sales are reclassified into during revenue recognition. Unlike the nominal-code overrides, it's not edited on the Accounting tab — you set it from the channel product-mapping flow using the Map as Revenue Line mode.

The chosen financial line type must be classified as revenue. Picking a cost-classified type is rejected with the validation error The selected financial line type must be a revenue type. You can also clear the value to leave the product without a default.

Steps

  1. Open the channel product you want to map (Shopify, Amazon, Faire, TikTok Shop, and others) and open its product-mapping panel.
  2. Switch the mapping mode to Map as Revenue Line.
  3. In the Revenue Financial Line Type picker, choose a revenue-classified type. Only revenue types are valid; a cost type is rejected.
  4. Click Save Revenue Mapping.
  5. To revert the product to normal behaviour, reopen the picker and clear the selection, then save again — this sets the default back to none.

If no matching SKU product exists yet, saving a revenue mapping auto-creates a minimal SKU product (inventory tracking disabled) to carry the setting.

What happens under the hood

Saving the mapping calls a dedicated product endpoint, PATCH /products/{product}/default-financial-line-type, which sets the product's default_financial_line_type_id. It requires the Update products permission (products.update) — the same permission that guards the Accounting tab. Passing a cost-classified type returns the revenue-type validation error above; passing an empty value clears the default.

Where the full picker lives

The Revenue Financial Line Type picker and the revenue-conversion wizard are part of the channel product-mapping flow, documented in the Listings guide — coming separately. This page documents the field's meaning and its accounting effects, not the full channel UI.

How these values reach the ledger

A product carries seven accounting foreign keys in total: the six nominal-code overrides above (sales, cogs, inventory, inventory_in_transit, accrued_purchases, discount) plus default_financial_line_type_id. They feed two different parts of accounting.

Nominal-code overrides → GL posting. When this product posts to the general ledger — a sale, a shipment's COGS, an inbound receipt — the posting engine reads the product's override for that leg and uses it in place of the account-level default. Overrides are how you route one product's revenue, COGS, or inventory to a different account than the rest of your catalog.

Default financial line type → revenue recognition. Revenue conversion reads the product's default_financial_line_type_id to reclassify sales. For each eligible sales-order line, it creates an equivalent revenue financial line of that type on the parent order and then deletes the original sales-order line (its deletion cascade cleans up fulfillment, allocations, inventory/FIFO, and cached line financials). If a product has no default financial line type, nothing is converted — the value is required for conversion to run.

A few details worth knowing about conversion:

  • The revenue line's nominal code comes from the financial line type's own nominal code, falling back to the sales channel's sales nominal code — not from the product's Sales override.
  • Lines that have returns or RMAs are held back and never converted, because a return line has no revenue financial line to re-point to. They're surfaced for review instead.
  • Refund/credit lines on a converted line are preserved: they're re-pointed to the new revenue financial line rather than deleted with the original.

Financial line types are deduplicated behind the scenes

Financial line types are unique by name + classification within a tenant. If duplicates ever exist (for example from imports), a reconciliation step keeps the most-referenced row, re-points every reference — including products' default_financial_line_type_id — to the survivor, and drops the duplicates. You don't need to run this manually; it's idempotent and runs as part of maintaining the uniqueness guarantee.

Next steps

Video transcript

The Accounting tab carries a product's nominal-code overrides — the ledger accounts its postings hit. Six are covered: Sales, COGS, Inventory, Inventory In Transit, Accrued Purchases, and Discount. Each is blank here, so this product follows your company-level defaults. Click Edit and every account becomes a searchable picker, listing your nominal codes by code and name. Override only the accounts you need for this product, and leave the rest blank to keep the company default. A blank field is never an error — it just means use the default.

Last verified: