Acquisition cost and gross product profit

Locking what a product actually cost you, stamping it on the order, and the report that turns both into margin — plus what that report deliberately excludes.

Updated August 2, 2026

Pro closes the loop for a merchant who buys in foreign currency: what the goods cost, at what rate, and what was left after the sale.

Locked acquisition cost

On each product or variation you record three things together:

  • the per-unit acquisition amount;
  • its currency;
  • the acquisition-time conversion rate.

The rate is locked once. Current market rates may prefill an empty first save, but they never rewrite a saved product or a placed order. That is the whole point: your cost is what you actually paid on the day you paid it, not a re-derivation from today’s rate.

Keeping both the authored foreign amount and one locked store-currency amount means the source amount preserves supplier evidence while the store amount feeds the margin floor and comparable reporting. If a later store-currency change makes the two inconsistent, the plugin fails closed rather than silently converting stale cost.

Variations

Variations inherit the parent’s cost by default and can override it individually. That covers the common case — one supplier price for a product, different costs for a few sizes — without forcing you to fill in every row.

Native WooCommerce COGS

Where WooCommerce’s own COGS API exists and is enabled, Pro synchronises only Price Anchor-owned values through that public API and reads legacy or native order costs through public methods. It never touches WooCommerce’s private meta. On WooCommerce 8.x, which has no such API, the complete Price Anchor snapshot and report path still works without the bridge.

Order-line cost stamping

At checkout, the acquisition amount, its currency, the acquisition rate and the resulting unit COGS are stamped onto the exact order line. That evidence is immutable. A rate update, a supplier price change or a later cost edit never rewrites a historic order.

The Sales report

The Sales tab aggregates that evidence into:

  • source-anchored product sales, grouped by pricing basis;
  • actual order revenue in the order currency;
  • refund-adjusted net product revenue, after line discounts and partial refunds;
  • refund-adjusted net COGS;
  • gross product profit and margin.

It is date- and status-filtered, paginated, and reads orders only through WooCommerce CRUD so it works under HPOS.

Two things it deliberately refuses to do

  1. It never calls a source amount “revenue”. Customers are charged in the WooCommerce order currency. A source amount of 30 USD is reported as USD-anchored product sales, alongside the actual order revenue in your store currency. Calling it USD revenue would be a lie that reconciles to nothing.
  2. It never invents a missing number. A line with no recorded cost, or a cost in an unlike currency, is shown as unavailable rather than being given a plausible value. A failed aggregation returns no partial totals at all, because partial data is plausibly wrong rather than visibly absent.

What is outside the report

This is an acquisition-cost bridge, not an accounting ledger. Gateway fees, tax, shipping and fulfilment, advertising, payroll, overhead, landed-cost lots, FIFO/LIFO and inventory valuation are all outside it. It reports gross product profit and does not replace accounting, tax advice or inventory valuation.