Skip to content

Landed cost — extras allocated by weight

When a delivery shows up, the per-unit price you paid the supplier isn’t the per-unit price the books should care about — freight, customs, port handling, and any other charge to get the goods to your shelf are part of the cost of those goods. Landed cost is the per-unit number after those extras are folded in. Fexl Lite calculates it for every PO line automatically, then writes the FIFO ingress at landed cost when you receive the PO. This is the only flow that does this — ad-hoc restocks don’t carry extras.

Updated 5 May 2026·For v2.2.0·5 min read

Why landed cost matters

Two scenarios where ignoring extras silently breaks reports:

  • You import a single product line at $100/unit, pay $200 freight, sell at $130. Without landed cost, COGS reads $100 and gross margin reads 30% — looks great on the P&L. With landed cost (say 20 units), COGS reads $110/unit and the real margin is closer to 18%.
  • Mixed shipment of cheap and expensive lines. $100 of freight on a container with a $50 t-shirt and a $1,000 generator should not load $50 of freight onto each — it should load proportionally. Otherwise the t-shirt’s cost doubles and the generator’s cost barely moves. Either you under-cost the generator (you’ll over-report margin) or you over-cost the t-shirt (you’ll lose money on it without knowing).

FIFO costing only stays honest if every layer is opened at the right cost. Landed cost is what makes that possible for the formal PO flow.

How extras allocate

Every PO line carries a weight column. When you add a line, weight defaults to 100 / lines.length so extras split evenly across all lines. Edit a line’s weight to give it a bigger or smaller share — the column accepts any positive number; only the ratios between lines matter.

For each extra cost on the PO:

allocated[i] = extra.amount × (line[i].weight / Σ line.weight)

Each line’s landed unit cost is then:

landed_cost[i] = base_unit_cost[i] + (Σ allocated[i] / line[i].quantity)

The PO editor recalculates Allocated and Landed columns live as you edit lines, weights, and extras — you can see the answer before you commit.

Picking the weight strategy

Three ways most shops weight lines, in increasing order of effort:

  • Even split — leave weights at the default 100 / lines.length. Right when every line has roughly the same shipping footprint.
  • By unit value — set weight equal to (or proportional to) quantity × unitCost for each line. This gives expensive lines a proportionally larger share of the freight and customs cost. Right for general merchandise where freight cost roughly correlates with declared value (customs duties especially).
  • By physical weight — set weight equal to the line’s actual kilograms or volume. Right for shipments where freight is genuinely volumetric — heavy machinery, bulky low-value goods.

You don’t have to pick one strategy and stick to it. The weight column is just a number; type whatever ratio reflects how the freight really should split.

suppliers · PO editor · extras + allocated + landed columns

Adding extras to a PO

1

Add the line items first

Build the PO normally — supplier, products, quantities, unit costs. The lines need to exist before extras can split across them.

2

Click Add Extra Cost

Below the line table. A row appears with a Name field and an Amount field. Type a descriptive name — “Freight”, “Customs duty”, “Customs broker fee”, “Port handling” — and the amount.

3

Set the weight column on each line

Decide which strategy fits. For “by unit value”, a quick formula: type each line’s qty × unitCost into its weight cell. For “even split”, leave the defaults.

4

Sanity-check the Landed column

Look at the landed unit cost for each line. Does it make sense — base cost plus a sensible fraction of the freight pool? If a line’s landed cost barely moved when you added a $500 freight charge, its weight is too low; if it spiked, too high.

5

Save as draft, or receive

Saving as draft preserves the extras and weights. Receiving (when the goods arrive) is the moment landed cost gets baked into FIFO — see Receive a PO.

What happens at receive

Confirming Receive writes one inventory_transactions ingress per line, with cost = landed_cost[i] (not the base unit cost). qty_remaining opens at the line quantity. The product’s WAC is updated via updateProductCost to reflect the landed cost. The journal entry posts inventory at landed cost too: DR 1200 Inventory for the landed total of every line, CR 2010 AP (or 1010-xxx if paid).

The extras themselves never get a separate ledger account — they’re absorbed into the line items they belong to. Freight on this PO is part of these specific units’ cost; if those units never sell, the freight stays capitalised on the balance sheet inside their inventory value, which is what GAAP asks for.

Common gotchas

”I added the extra after the lines were saved and nothing recalculated”

Did you press Save after adding the extra? The Allocated and Landed columns recalculate on edit, but the PO row itself only persists on save. Hit Save before receiving.

”One line’s landed cost is huge”

Its weight is wildly higher than the other lines’ weights. Reset all weights to 100 / lines.length (the default) and re-do the strategy from scratch.

”The freight charge arrived weeks after I received the PO”

You can’t retro-apply extras to a received PO. Two options: void the PO (only works if every unit is still on hand — see Purchase orders), recreate it with the extras, and receive again. Or post the freight as a separate owed entry on the supplier ledger and let it land on the supplier balance without re-costing the layer. The first path is correct for FIFO; the second is the pragmatic compromise when stock has already sold.