September 2, 2026 · CostSentry

The Quarterly Price Review: A Checklist for a Whole Catalogue

Checking each price file as it arrives answers one question: what changed in this file. It is the right question and it is not enough, because the failures that cost the most are not events. They are a cost that crept up 2% three times, a retail price nobody has touched in two years, a cost field that was never updated after a purchase, and a floor that was set when shipping was cheaper. None of those trip an alert. All of them show up in a review that looks at the whole catalogue on a fixed date, four times a year.

What the quarter catches that the diff cannot

A per-file diff is a comparison between two editions of one supplier's list. It is blind by construction to anything that is not in a price file: your own retail prices, your cost-to-serve, your floor, your sales mix. It is also blind to accumulation, because each comparison starts fresh.

Take a $18.40 line that moves three times in a year — 2.1%, then 1.8%, then 2.4%. Any sensible alert threshold ignores all three.

Drift on one SKU, retail held at $29.95
Starting cost$18.40
After +2.1%$18.79
After +1.8%$19.12
After +2.4%$19.58
Cumulative increase+6.4%
Margin, start to end38.6% → 34.6%
Retail that restores 38.6%$31.87

Four margin points, in $1.18 of gross profit per unit. On a line selling 90 units a quarter that is $106.20 a quarter and $424.80 a year, from a SKU nobody ever flagged. Forty lines behaving that way is real money and there is no moment at which it was noticeable. The quarterly review exists to make it noticeable, by comparing against a point four files back instead of one.

Before you start: four exports

The review is mostly arithmetic on data you already have, and it collapses if you gather the data as you go. Pull all four first, dated, into one folder:

Keep the export set. Next quarter's review compares against it, and that comparison is where drift becomes visible. A review with no predecessor can only find absolute problems; a review with four predecessors finds trends.

Step 1 — the margin distribution

One table, the whole catalogue, bucketed by current margin at current cost. Not an average: averages hide exactly the shape you are looking for. An illustrative catalogue of 1,240 SKUs against a 30% floor:

Margin bandSKUs% of SKUs% of quarter's revenue
Under 20%383.1%2.1%
20–30%14611.8%11.4%
30–40%52041.9%44.0%
40% and up53643.2%42.5%

184 SKUs sit under the floor — 14.8% of the catalogue and 13.5% of the quarter's revenue. The instinct is to start with the worst 38. The arithmetic says otherwise. On $180,000 of quarterly revenue, the under-20% band carries $3,780; dragging it up to 30% is worth about $680 a quarter. The 20–30% band carries $20,520, and moving it from an average of 25.5% to 30% is worth $923 a quarter — more money, from smaller and far less contentious price moves. Sort the fix list by revenue, not by how bad the number looks.

Two columns make this table useful instead of decorative: revenue in the band, and how the band's SKU count compares with last quarter. A band that grew by thirty lines is a supplier problem or a cost-to-serve problem, not thirty separate pricing problems, and it deserves one investigation rather than thirty price changes.

Step 2 — cumulative drift

The query that pays for the review: for every SKU, cost today against cost at the start of the period, expressed as a percentage, with retail's change over the same period beside it.

drift  = (cost_now − cost_4q_ago) / cost_4q_ago
retail = (price_now − price_4q_ago) / price_4q_ago
gap    = drift − retail

Sort by gap × quarterly revenue descending. That ordering puts the lines where cost outran price by the most money at the top, which is exactly the work list, and it does not care whether the drift arrived in one jump or six. Anything with a gap above two or three points and meaningful volume needs a decision this quarter.

A second pass on the same data, worth running once a year: the lines where gap is strongly negative. Cost fell and you never passed it on, or never noticed. Those are not always errors — a line whose competitors have not moved is fine — but a few of them are usually a supplier who reduced a price quietly, which is worth knowing before the next negotiation.

Step 3 — stale cost fields

Cross the quarter's purchase invoices against the cost field's last-modified date. In the illustrative catalogue, 310 SKUs were purchased during the quarter and the cost field changed on 190 of them. The other 120 were bought at a price the catalogue does not know about.

Some of those 120 are genuinely unchanged costs. The rest are the most dangerous category in the whole review, because every margin number for them is confidently wrong in the direction that makes things look fine. The fix is mechanical rather than analytical — reconcile invoice line to cost field, then push the corrections in one bulk update — but it has to happen before Step 1's table can be trusted, which is why the honest ordering is to run this first and Step 1 twice.

Empty cost fields are worse than wrong ones. A variant with no cost typically reports as pure profit or as excluded, depending on the report, and either way it does not appear in the under-floor list. Count them explicitly every quarter and drive the number to zero; a catalogue where the count keeps creeping back up has a process problem in how new products get created, not a data problem.

Step 4 — how old is the retail price

List every SKU by the date its price last changed, oldest first, with quarterly revenue beside it. There is no correct answer for how old is too old — some prices should never move — but a high-revenue line that has not been repriced in two years while its cost drifted is the single most common finding in a first review, and it is invisible in every other view because nothing about it ever changed.

Pair this with a second, cheaper check: the lines where price is a suspiciously round number. Prices that end in 9.00 or 5.00 and have never moved are often a number someone typed once, not a number anyone calculated.

Step 5 — refresh the inputs, not just the outputs

Margin is computed from cost and price, but the floor is computed from cost-to-serve, and cost-to-serve moves quietly. Once a quarter, recompute the three inputs from actuals rather than from what you assumed last time:

These feed the per-order margin stack and, through it, the floor itself. A floor that has not been recalculated in a year is a number from a cost structure that no longer exists, and every line you passed as "above floor" this quarter was passed against it.

Step 6 — supplier-level, not SKU-level

Roll the drift from Step 2 up by supplier, weighted by what you actually bought from each. One supplier at +7% across the board is a different problem from seventy scattered increases, and it has a different response: a conversation, a second source, or an origin question if the timing lines up with a duty measure — see how tariffs reach a store that does not import for how to decode that from the price change alone.

While the numbers are open, update the rest of the supplier scorecard: fill rate, lead time, data quality, terms. The quarterly review is the only moment in the year when all the data needed for it is already on the desk, and doing it separately means it does not get done.

Step 7 — decide, in four buckets

Every line on the work list gets exactly one of four outcomes, recorded with a one-line reason. The reason matters more than it looks: next quarter's review reads it and either confirms the call or shows it did not work.

BucketWhenWhat gets written down
RaiseBelow floor, price not tested recently, no MAP or contract constraintNew price, effective date, the margin it restores
HoldBelow floor but deliberately — traffic driver, attach line, contractThe reason, and the margin you are accepting
RenegotiateDrift concentrated in one supplier or one product groupThe ask, the evidence, who is asking, by when
ExitBelow floor, low volume, no attach value, price cannot moveSell-down plan and the date the line comes off

The exit bucket is the one people avoid, and it is usually the largest source of recovered margin in a catalogue that has never been reviewed — the arithmetic for that decision is worth having settled before the meeting rather than argued during it. Hold is a legitimate answer; "we'll look at it next time" is not, because it is the answer that produced the current state.

Write the closing state, not just the changes. One row per quarter: SKU count, count under floor, revenue under floor, average margin, count with empty cost, blended label, current floor. Seven numbers. After a year that row is the only view you will have of whether any of this worked, and it takes two minutes to record and cannot be reconstructed afterwards.

Time budget and cadence

An afternoon, roughly: half an hour to pull the four exports, an hour on Steps 1–4 once the queries exist, half an hour on Step 5, and the rest on decisions — which is the only part that should take long. It compresses sharply after the first pass, because the first pass is where the backlog of never-reviewed lines gets cleared.

Quarterly is the right interval for the catalogue-wide pass because it is long enough for drift to accumulate into a visible number and short enough that a mistake costs one quarter. It does not replace checking files as they arrive; those are different jobs. The intake process catches events, in days. The quarterly review catches accumulation, in months. A store running only the first is fast at responding to increases it can see, and slowly losing points to the ones it cannot.

Run Step 1 in two minutes

Paste your costs and retail prices, get every line under your floor and the price that restores it — sorted so the money is at the top. Free, no account.

Open the free checker ↗
Runs in your browser. Nothing uploaded, no account.