Prices
The selling and buying prices per SKU per domain, fed from PriceShape. They are catalogue prices, not what any order was actually charged.
Prices are the current price points of a SKU on a domain: the selling price in and ex VAT, the cost price and the purchase price. They arrive from PriceShape as a feed per domain and are replaced wholesale on every run.
They are not transaction amounts. What an order was charged is on the order's own lines and does not change when a price feed does. Read this table for what a product costs today, never for what a past order earned.
Where it comes from
app/jobs/feed/getproductprices.php consumes two batch types. feed_getproductprices carries a domain, reads that domain's feed and writes productprices_new with insertmultiple(), because a domain carries tens of thousands of prices. feed_getproductprices_swap runs last and swaps the table in.
Which feed belongs to which domain is pricefeed in config/reference/domains.json. A domain with no feed configured there has no prices, and no other setting supplies one.
The swap is guarded on row count and refuses when the new table has lost a larger share of the live table than ingest.swaptolerance in config/settings.json allows, printing what it counted and the minimum it needed. A truncated feed therefore leaves the previous prices in place instead of half-emptying the catalogue, while a day on which the feeds delist more products than they add still publishes. A clean install has no live table yet, which counts as empty, so the first swap always goes ahead.
feed/getproductpricesreset.php cancels the open batches and re-queues a full reload.
Tables
| Table | Holds |
|---|---|
productprices | One row per SKU per domain: price_to, price_to_exvat, price_costprice, price_purchaseprice |
productprices is one of the tables not defined in install.php: it is created by the job that fills it, so a schema change to it is made there.
Where to look
Prices have no screen of their own. They are read by the downstream tools directly and joined into product views.
Related
- PriceShape
- Products
- Stock, the other per-SKU feed on the same shape
Evidence
Batch types, the bulk insert and the guarded swap from app/jobs/feed/getproductprices.php. Feed names per domain from config/reference/domains.json. Reset behaviour from app/jobs/feed/getproductpricesreset.php. Tables created outside install.php from AGENTS.md, Models and database. Basis: code-checked at 30f5313.
- Type
object - Status
active - Updated
2026-09-15 - Created
2026-09-13