August 19, 2026 · CostSentry

From Inbox Chaos to a Price-File Process

Price files arrive as email attachments, from six different people at four suppliers, on no schedule anyone agreed to, in whatever format the sender's system exports. The instinct is to fix the parsing. The parsing is rarely the problem. The problem is that three months later nobody can answer "what did this part cost us in March," and nobody knows whether the file that arrived on the 14th was ever applied.

The four ways it actually fails

Every store that buys wholesale hits the same four failures, in roughly this order:

Notice that only the second one is about spreadsheets. The rest are about records and ownership, which is why buying a better importer doesn't fix them.

Start with the archive, not the automation

The cheapest step is also the one that resolves most of the pain, and it needs a folder rather than software.

The rule: every price file you receive is saved, byte-for-byte unmodified, under a deterministic name, forever. You never open the original to edit it — you copy it and work on the copy. A file you edited in place is no longer evidence of anything.

A naming convention that sorts usefully and carries the two dates that matter:

supplier_effective-date_received-date_originalname.ext

acme_2026-09-01_2026-08-14_pricelist.xlsx
midwest_2026-08-01_2026-08-14_PriceList_Sept_FINAL_v2.xlsx
northline_unknown_2026-08-17_export.csv

Two dates, because they answer different questions. Received tells you when you had the information and therefore when you could have acted. Effective tells you which invoices the price applies to, which is the date your margin history actually cares about. They routinely differ by weeks in both directions: a file dated for September arriving in mid-August, or a "correction" arriving in October that has been in force since the first.

When the file carries no effective date, write unknown rather than guessing, and then ask. It is the smallest possible request to make of a supplier and one of the few they grant immediately — the same class of ask as the file-quality items in negotiating as a small account.

One row per file: the intake log

A single sheet, appended to every time a file lands. It is the answer to "was this applied, by whom, when" and it takes ninety seconds to fill in.

SupplierReceivedEffectiveLinesBasisAppliedNote
Acme2026-08-142026-09-011,240Net, per unit2026-08-159 lines held for price review
Midwest2026-08-142026-08-01318List × 0.622026-08-15Supersedes the 08-02 file
Northline2026-08-17unknown4,902Net, per MEffective date requested
Acme2026-08-022026-08-011,237Net, per unit2026-08-04

The basis column earns its place on its own. A file quoted as list price times a multiplier and a file quoted net look identical until you compare them, and multiplier files change by moving the multiplier while every printed number stays the same — the mechanics are in industrial price books and multipliers. Recording the basis at intake means a later diff can't silently compare two different things.

Normalise before you compare anything

Four normalisations, in this order, before a single line is diffed:

  1. Per selling unit. A per-pack price against a per-unit price is the most common way a price review produces confident nonsense. If the file gives pack quantity, divide. If it doesn't, get it — a pack change with a flat price is a real cost increase that no diff will report.
  2. Cost basis. Apply the multiplier, or the column discount, or the contract tier, so both sides of the comparison are net cost to you.
  3. Unit of measure. Per-M, per-foot, per-hundred, per-each. Wire, fasteners and consumables switch between these more often than anyone expects, and a per-M price read as per-each is off by a factor of a thousand.
  4. Currency. Fix a rate and record which rate you used, so a cost "increase" that is only an exchange-rate move is identifiable as one.

These four cover most of the traps catalogued in reading a supplier price list without getting burned. Getting them wrong doesn't produce an obvious error — it produces plausible numbers, which is worse.

The diff: three questions per line

Once both files are normalised, only three things matter for each line, and everything else is noise:

1. did the cost move?
2. by how much?
3. does the new cost break my floor at the current retail?

   margin           = (price − cost) ÷ price
   price to hold M  = cost ÷ (1 − M)

Question three is the one that decides your afternoon. A file with a hundred and fifty movements is not a hundred and fifty decisions — most increases are absorbed by the margin you already have. A run against a 35% floor, using the Acme file from the log above:

SKURetailOld costNew costChangeMargin beforeMargin afterPrice to hold 35%
A-1140$24.95$13.10$13.1047.5%47.5%
B-2207$39.95$24.00$25.92+8.0%39.9%35.1%$39.88
C-0318$12.50$7.80$8.61+10.4%37.6%31.1%$13.25
D-5561$99.00$61.40$63.86+4.0%38.0%35.5%$98.25
E-8802$54.00$31.00$28.55−7.9%42.6%47.1%
F-1023$18.95$10.20$12.85+26.0%46.2%32.2%$19.77

Read the rows against each other and the point of the third column becomes obvious. B-2207 rose 8% and needs no action at all: the price that would hold 35% is $39.88, below the $39.95 already on the site. D-5561 is the same story at 4%. F-1023 rose 26% and is 2.8 points under the floor, needing $19.77 to recover it. And C-0318 is the row a percentage-based review misses entirely — a 10.4% increase, unremarkable in a list sorted by size of change, that lands 3.9 points under the floor because the line had less margin to give.

Sort by floor breach, not by percentage. The biggest increase in a file is frequently on a line with room to absorb it, and the increase that costs you money is frequently a mid-sized one on a thin line. Where that floor should sit, and why it isn't one number for the whole catalog, is worked through in choosing a margin floor.
Acme file, 2026-09-01 · what the diff produced
Lines in file1,240
Costs changed148
Increases · decreases131 · 17
Below the 35% floor at current retail9
Decisions actually needing a human9

Twelve hundred lines, nine decisions. That ratio is what makes the process fit in an hour, and it only exists if the floor test runs on every line rather than on the ones that caught someone's eye.

Applying: two writes, not one

Costs and prices are separate operations with separate risk profiles, and merging them is how stores end up repricing a catalog by accident.

Then record the applied date in the intake log. This is the step that gets skipped and the one that makes the next month possible — the diff has to know which file is the baseline, and "the last one, probably" is not a baseline.

The unmatched pile is where processes die

Every file contains lines you cannot match to anything in your catalog. Ten to thirty per cent is normal, and the natural response — skip them, deal with it later — is what turns a process back into chaos, because the same lines come back next month and the month after.

Three buckets, three different decisions:

A delta file cannot tell you about the third bucket. If a supplier sends only changed lines, an item that disappeared from their catalog looks exactly like an item whose price didn't move. Ask for full files. If they will only send deltas, get a separate discontinued list, and treat the gap as a known blind spot rather than assuming it away.

Aliases and ignore-decisions have to persist across files. That is the single largest difference between a process that gets easier every month and one that costs the same hour forever.

Making the files arrive predictably

Most of the chaos is upstream and is cheaper to fix there.

An hour a month

StepTimeOutput
Archive and log intake5 minFile saved under the naming rule, one row in the log
Normalise10 minNet cost per selling unit, one currency, one UOM
Diff against the last applied file5 minChanged lines, sorted by floor breach
Review the breaches20 minNew retail decided for each, or an accepted lower margin
Apply costs, then prices10 minCosts written in bulk, prices written line by line
Work the unmatched pile10 minAliases created, ignores recorded, discontinued flagged

An hour per supplier file, and less every month as the alias list fills in. Compare that with the alternative, which is not zero — it's the same work done under pressure once a quarter, on lines someone happened to notice, with no record of what was decided.

The archive is the piece to start with today, because it is the only step you cannot do retroactively. Everything else can be built later on top of a folder of files you kept; nothing can be built on top of files you didn't.

Check the file against your real margins

Drop a supplier price list and your Shopify product export into the free Supplier Price Margin Checker: cost movement per SKU, margin at your current retail, and a suggested price to hold your target — matched by SKU, entirely in your browser.

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