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.
- Open the product and go to the Accounting tab.
- On the Nominal Code Overrides card, click Edit.
- 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.
- To fall back to the company default for a field, clear it (use the × in the picker) so it's left blank.
- 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
| Field | Underlying key | What it posts |
|---|---|---|
| Sales | sales_nominal_code_id | Revenue account for this product's sales |
| COGS | cogs_nominal_code_id | Cost of goods sold when the product ships |
| Inventory | inventory_nominal_code_id | On-hand inventory asset account |
| Inventory In Transit | inventory_in_transit_nominal_code_id | Value of stock in transit on inbound movements |
| Accrued Purchases | accrued_purchases_nominal_code_id | Goods-received-not-invoiced accrual |
| Discount | discount_nominal_code_id | Discount / 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
- Open the channel product you want to map (Shopify, Amazon, Faire, TikTok Shop, and others) and open its product-mapping panel.
- Switch the mapping mode to Map as Revenue Line.
- In the Revenue Financial Line Type picker, choose a revenue-classified type. Only revenue types are valid; a cost type is rejected.
- Click Save Revenue Mapping.
- 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.
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
- Set a product's price — the Pricing tab, tax settings, and tier prices.
- Product detail page reference — every tab on the product page.
- Product fields & validation reference — field-level rules, including the accounting foreign keys.
- Product permissions reference — who can edit accounting configuration.
- For how inventory value, FIFO, and COGS are calculated, see the Inventory guide and Browse FIFO layers.
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.