Upload a supplier price sheet

Drop in the price sheet your yard sends — CSV or Excel — see every change, old price beside new, and publish it to your material price list with a record of every price it moved.

The operating system for post-frame and barndominium builders.

Part of The Pricing Engine
What it is

On Settings, Material prices, Upload price sheet takes the file your yard emails you, as it came: a CSV or the first sheet of an .xlsx, up to 5,000 rows. You tell it once which column is the SKU, the description, the unit and your cost, and the map is remembered for that supplier. The preview then shows every matched material with its cost before and after and the % change, the rows that matched nothing — match each to a product or add it as new, remembered next time — and the rows left out, each with the reason. Nothing changes until you publish, and every change lands in the Price change log with the old price, who published it, when, the file and the date the price took effect. Built only for post-frame and barndominium builders, so the list it updates is already in the trade's own products — 2x6 SPF, 29ga AG panel, J-channel, trusses.

Also called: import price list · yard price sheet · bulk price update · price list csv · excel price import · supplier price list upload · lumber price update · update material prices

See it, piece by piece
01

The yard's sheet goes where your prices live

Upload price sheet and Price change log sit at the top of Settings, Material prices, above the list they change — every material with your cost, your sell price, the markup and margin between them, and a History button on each row. There is no import screen to find somewhere else. The prices you set by hand and the prices a sheet sets live in the same list, side by side with the rest of your price book.

Settings — Material prices
Upload price sheetPrice change logCSV or Excel from your yard — you check every change before it is saved.
2x6, panel, truss…
252 of 252 materials · 3 unpriced
All 252Trusses 138Lumber 27Trim 24Steel panel 18Fasteners 16Columns 12Options 11Other 6
MaterialYour costSell priceMarkup MarginHistory
2x6 SPF 12′
priced per Each
8.4
10.92
30.0%23.1%View
2x4 SPF 10′
priced per Each
5.12
6.66
30.1%23.1%View
29ga AG panel 36″
priced per LF
3.89
5.06
30.1%23.1%View
J-channel
priced per Each
17.9
23.27
30.0%23.1%View
1-1/2″ PM metal screws (250)
priced per Each
39.5
51.35
30.0%23.1%View
Upload price sheet and Price change log, above the book: 2x6 SPF 12′ at $8.40 cost, $10.92 sell, before the October sheet. Real screen · sample data.
Without it

The new list arrives from the yard, and the only way to get it into the book is to open the book and start typing.

Why we built it

An office manager updates prices in the place she already looks at prices — a second import screen is one more thing to forget. For the owner, one list means one answer to "what does 2x6 cost us right now".

Sound familiar?“my yard sends a new price list every month”
02

CSV or Excel, as the yard sent it

Name the Supplier and drop the file: a CSV or an Excel .xlsx, first sheet, up to 5,000 rows. It counts the rows and columns before you go further — Menards — Oct price sheet.csv, 12 rows · 4 columns. An older .xls asks to be saved as .xlsx or CSV first, and a sheet with no rows under its header says so instead of pretending to work. Suppliers you have uploaded before sit under the box as one-click names.

Upload a price sheet — Step 1 of 3 · the file
Step 1 of 3 · the file

Upload a price sheet

Upload the price sheet your yard sends — CSV or Excel (.xlsx). You’ll check every change before anything is saved.

Menards
ABC Supply

Column choices are remembered per supplier, so next month’s sheet maps itself.

Menards — Oct price sheet.csv12 rows · 4 columns
Next: columns
Supplier Menards, the October sheet dropped in: 12 rows, 4 columns. Real screen · sample data.
Without it

The software wants its own template, so somebody copies the yard's columns into it by hand — which is the typing you were trying to avoid.

Why we built it

Nobody wants to reformat the yard's file before they can use it. Taking it as it arrives is the whole difference between an upload that saves an evening and one that costs one. For the business, a monthly update that takes minutes actually gets done every month.

03

Tell it once which column is which

Try it

Five fields — SKU / item number, Description, Unit, Price (your cost) and Supplier — each pointed at a column, with the first three values from that column beside it, so a wrong pick is obvious before anything is read. Common headings are picked for you: on the Menards sheet Item #, Description, UOM and Net Price map themselves. Only the price is required, and the window warns when neither a SKU nor a description is mapped, because then no row can find its material. The map is saved by column name for that supplier, so next month's sheet maps itself even if the yard moves a column.

Upload a price sheet — Step 2 of 3 · columns
Step 2 of 3 · columns

Upload a price sheet

Tell us which column is which. Only Price (your cost) is required; a SKU or a description is how a row finds its material.

SKU / item number
The supplier's code for the item
Item #
lumber.dim.spf.2x6.12 · lumber.dim.spf.2x4.10 · panel.steel.ag.29ga.w36
Description
What the item is — used to match when there is no SKU
Description
2x6 SPF 12' · 2x4 SPF 10' · 29ga AG panel 36" (per foot)
Unit
Each, LF, sq ft, bag…
UOM
EA · EA · LF
Price (your cost) *
What the yard charges you
Net Price
9.48 · 5.12 · 4.11
Supplier
Only if one sheet mixes suppliers
Not in this sheet
BackNext: preview
Item #, Description, UOM and Net Price, each with its first three values. Open a field to point it at another column. Real screen · sample data.
Without it

One shifted column and every material in the book takes its new cost from the unit-of-measure column.

Why we built it

Seeing "9.48 · 5.12 · 4.11" beside Price (your cost) is how you know it's the right column — before a whole list of costs is written into the wrong field. Remembering the map means the builder does this once per yard, not once per month.

Sound familiar?“retyping hundreds of prices”
04

Every change, old beside new, before anything is saved

The preview counts the sheet four ways — 5 price changes, 1 same price, 3 not matched, 3 left out on the October sheet — and lists every change with its cost before and after and the % change: 2x6 SPF 12′, $8.40 → $9.48, +12.9%. A row that matched by name instead of SKU says so. A unit that disagrees is flagged and never blocking: "Sheet says BAG; your book prices this per Each." — the screws, priced by the bag of 250 on the sheet and by the each in your list. Nothing has been written yet.

Upload a price sheet — Step 3 of 3 · check before you publish
Step 3 of 3 · check before you publish

Upload a price sheet

5
Price changes
1
Same price
3
Not matched
3
Left out
Effective date
Oct 1, 2026
Your sell prices
Keep my sell prices as they are
2x6 SPF 12′
Line 2 · lumber.dim.spf.2x6.12 · 2x6 SPF 12'
Cost $8.40 → $9.48
+12.9%
Sell $10.92
29ga AG panel 36″
Line 4 · panel.steel.ag.29ga.w36 · 29ga AG panel 36" (per foot)
Cost $3.89 → $4.11
+5.7%
Sell $5.06
J-channel
Line 5 · trim.j-channel · J-channel
Cost $17.90 → $18.75
+4.7%
Sell $23.27
1-1/2″ PM metal screws (250)
Line 6 · fastener.1-5-pm-metal-screws · 1.5" PM metal screws (250)
Sheet says BAG; your book prices this per Each.
Cost $39.50 → $42.00
+6.3%
Sell $51.35
Galvanized ridge vent 10'
Line 13 · Galvanized ridge vent 10' · matched by name
Cost $19.95 → $21.50
+7.8%
Sell $25.94
BackPublish 5 changes
Five changes, each with its old and new cost and the % — and the BAG-versus-Each warning on the screws. Real screen · sample data.
Without it

A bulk import that just overwrites prices tells you nothing until a quote comes out strange and somebody goes looking.

Why we built it

Old beside new is how a builder spots the one price that jumped 40% while it is still a line on a screen. The unit warning catches the mistake that does the most damage quietly — a bag price landing as an each price — before it is a price anybody relies on.

Sound familiar?“who changed this price and when”
05

The yard's item numbers, matched once and remembered

Try it

A row finds its material by a match you made before for that supplier, by SKU, or by the material's name. The ones that find nothing land under Not matched, each with its price and unit, and three choices: Leave out, Match to a product… — a search across your own products and the catalogue — or Add as a new product. Match MEN-778812 Simpson LUS26 joist hanger to your Joist hanger LUS26 once, and next month's Menards sheet matches that row by itself.

Upload a price sheet — Not matched
Step 3 of 3 · check before you publish

Upload a price sheet

These rows found no material in your book. Leave them out, match each to a product you already have (remembered for this supplier next time), or add it as a new product.

MEN-778812 · Simpson LUS26 joist hanger
Line 7 · $2.89 / EA
Match to a product…
lus26
Your products
MEN-114502 · Owens Corning R-19 batt 15" x 93"
Line 8 · $61.40 / BAG
Leave out
MEN-990001 · Butcher block countertop 8'
Line 9 · $1,289.00 / EA
Add as a new product
BackPublish 6 changes
Line 7 matched to Joist hanger LUS26, line 9 added as a new product, line 8 left out. Try the choices. Real screen · sample data.
Without it

Half the yard's sheet uses its own codes, so half of it either gets ignored or gets matched by guesswork every single month.

Why we built it

Every yard has its own item numbers, and none of them are yours. Deciding once per SKU — and having the decision remembered — means the sheet gets more automatic every month instead of asking the same question forever.

06

Rows left out, with the reason

Some rows should never become a price. A zero is left out, because a blank on a supplier sheet is not free. A word where the price should be — "Call" — is left out. The same SKU twice keeps the first and leaves out the second, and two rows pricing the same material keep one. So do a negative price, a price over $1,000,000 (usually a wrong column) and a row with neither a SKU nor a description. Each one is listed under Left out with its line number and the reason.

Upload a price sheet — Left out
Step 3 of 3 · check before you publish

Upload a price sheet

Line 10 · MEN-000000 · Discontinued item
A zero price — left out (a blank on a supplier sheet is not free).
Line 11 · MEN-555555 · Special order entry door
"Call" isn't a price.
Line 12 · MEN-778812 · Simpson LUS26 joist hanger (dup)
The same SKU is on line 7 — this one is left out.
BackPublish 5 changes
Three rows the October sheet couldn't publish: a zero price, "Call", and a duplicate SKU. Real screen · sample data.
Without it

A "Call for price" or a blank cell gets imported as $0, and a material quietly costs nothing until somebody orders it.

Why we built it

A row left out with its reason is safer than a row guessed at. The office can phone the yard about the special-order door instead of discovering later that it went into the list at $0.

Sound familiar?“the supplier's item numbers don't match mine”
07

Keep your sell price, or keep your markup

Try it

Cost is what the sheet carries; what you sell for is your decision. Your sell prices offers two answers: Keep my sell prices as they are, or Move sell with cost (keep my markup %). Switch it and the Sell column on every row shows what will happen — 2x6 SPF 12′ stays at $10.92, or moves to $12.324 to hold its 30%. Margin on each material is shown in the price book, and the markup on a job is its own setting.

Your sell prices — keep them, or move them with cost
Effective date
Oct 1, 2026
Your sell prices
Keep my sell prices as they are
2x6 SPF 12′
Line 2 · lumber.dim.spf.2x6.12 · 2x6 SPF 12'
Cost $8.40 → $9.48
+12.9%
Sell $10.92
29ga AG panel 36″
Line 4 · panel.steel.ag.29ga.w36 · 29ga AG panel 36" (per foot)
Cost $3.89 → $4.11
+5.7%
Sell $5.06
J-channel
Line 5 · trim.j-channel · J-channel
Cost $17.90 → $18.75
+4.7%
Sell $23.27
Keep my sell prices, or move sell with cost — the Sell column follows. Try it. Real screen · sample data.
Without it

Cost goes up and sell stays put, so the margin on that material shrinks a little every month and nobody decided it should.

Why we built it

An owner who raises costs without raising sell has just cut his own margin, and one who moves both without being asked has repriced his customers. Asking the question, with the answer shown per row, keeps that decision with the person who owns it.

Sound familiar?“lumber went up again and I don't know what moved”
08

Nothing moves until you say Publish

Publish opens a confirm that says the whole change in one sentence: 5 costs change in your price book, 1 matched by hand, 1 new product, the effective date, whether sell prices move, and that every change is logged with its old price. The Effective date is the day the prices start — it is recorded on every change and in each material's history — and it cannot be in the future, because publishing applies the prices now.

Publish these prices?

Publish these prices?

5 costs change in your price book, 1 matched by hand, 1 new product, effective 2026-10-01. Sell prices stay as they are. Every change is logged with its old price.
CancelPublish
The confirm: how many costs change, how many were matched by hand or added, the effective date, what happens to sell. Real screen · sample data.
Without it

One click that rewrites a whole price list is one click too easy, especially on the wrong supplier's file.

Why we built it

The last thing read before hundreds of prices move should be what is about to happen, in plain words. A confirm that counts the changes is the moment a wrong sheet gets caught — and a publish that is never accidental is one the office is not afraid to do.

Sound familiar?“an import overwrote my prices with garbage”
09

One sentence says what changed

When the publish is done the window says it back: 6 prices changed, 1 new product added, 5 rows left out, and that every change is in the log with the old and new price, who published it and the file. See the change log opens that upload's changes directly. Publishing with nothing to change says that too — and still saves the column map for next time.

Upload a price sheet — Published
Price book

Upload a price sheet

Published

6 prices changed, 1 new product added, 5 rows left out. Every change is in the price change log with the old and new price, who published it and this file.

See the change logDone
Published: six prices changed (the five, plus the joist hanger matched by hand), one new product, five rows left out. Real screen · sample data.
Without it

After a bulk update nobody can say what actually changed, so nobody trusts the list afterwards.

Why we built it

A result the office can repeat back is a result the owner trusts. "Six prices moved, one new product, five rows we left out" is a sentence somebody can say in a Monday meeting.

10

Every change on record: who, when, which file

Try it

The Price change log keeps every price a sheet changed: old and new cost, old and new sell, the % change, who published it, when, the supplier and its SKU, the file and the date the price took effect. Pick one upload to see only its changes, with a line saying who published it, when, and how many rows changed, were added or left out — or every upload together, newest first. Prices you type by hand are in each material's own history instead.

Price change log
Price book

Price change log

Every price a supplier sheet changed, with the price before it, who published it and the file it came from. Hand edits are in each material’s own history.

2026-10-01 · Menards · Menards — Oct price sheet.csv
Menards · Menards — Oct price sheet.csv · published Oct 1, 2026, 9:14 AM by Dana Whitfield · effective 2026-10-01 · 6 changed, 1 new, 5 left out · sell prices kept
Butcher block countertop 8' · new product
Oct 1, 2026, 9:14 AM · Dana Whitfield · Menards MEN-990001 · Menards — Oct price sheet.csv
Cost — → $1,289.00
Sell —
from 2026-10-01
Galvanized ridge vent 10'
Oct 1, 2026, 9:14 AM · Dana Whitfield · Menards · Menards — Oct price sheet.csv
Cost $19.95 → $21.50+7.8%
Sell $25.94
from 2026-10-01
Joist hanger LUS26
Oct 1, 2026, 9:14 AM · Dana Whitfield · Menards MEN-778812 · Menards — Oct price sheet.csv
Cost $2.79 → $2.89+3.6%
Sell $3.63
from 2026-10-01
1-1/2″ PM metal screws (250)
Oct 1, 2026, 9:14 AM · Dana Whitfield · Menards fastener.1-5-pm-metal-screws · Menards — Oct price sheet.csv
Cost $39.50 → $42.00+6.3%
Sell $51.35
from 2026-10-01
J-channel
Oct 1, 2026, 9:14 AM · Dana Whitfield · Menards trim.j-channel · Menards — Oct price sheet.csv
Cost $17.90 → $18.75+4.7%
Sell $23.27
from 2026-10-01
29ga AG panel 36″
Oct 1, 2026, 9:14 AM · Dana Whitfield · Menards panel.steel.ag.29ga.w36 · Menards — Oct price sheet.csv
Cost $3.89 → $4.11+5.7%
Sell $5.06
from 2026-10-01
2x6 SPF 12′
Oct 1, 2026, 9:14 AM · Dana Whitfield · Menards lumber.dim.spf.2x6.12 · Menards — Oct price sheet.csv
Cost $8.40 → $9.48+12.9%
Sell $10.92
from 2026-10-01
Menards, the October sheet: each change with its old and new cost and sell, who published it and when. Switch to every upload. Real screen · sample data.
Without it

A price is wrong and nobody knows whether it came from the yard, a typo or last month's sheet.

Why we built it

A price list with a history is a list people are not afraid to update. When a number looks wrong, the owner can see the sheet it came from and who published it in seconds — and the office never has to defend a price from memory.

Sound familiar?“the price sheet says call for price”
11

One material's whole price story

Every row in Material prices has a History: every cost and sell price that material has had, newest first, each with what it was before and who changed it. 2x6 SPF 12′ shows the October sheet at $9.48, was $8.40, a hand edit in August before it, and the price it started at. The list is written automatically, so a price cannot change anywhere — a sheet, a hand edit — without appearing here.

Material prices — one material's history
2x6 SPF 12′

Every price this material has had, newest first. Written automatically — a price cannot change anywhere without appearing here.

FromCostSellWho
2026-10-01$9.48was $8.40$10.92was $10.92Dana Whitfield
2026-08-14$8.40was $7.95$10.92was $10.35Dana Whitfield
2026-05-04$7.95$10.35Dana Whitfield
Close
2x6 SPF 12′: the October sheet's change on top, an August hand edit beneath it. Real screen · sample data.
Without it

You can see today's price for 2x6 but not how it got there, so every question about last spring's numbers is a guess.

Why we built it

"When did 2x6 go up?" should take one click, not a search through emails from the yard. For the owner it is the long view: how a material has moved over a season, and whether the sell price kept up.

How it works
  1. 1Open Settings, Material prices and press Upload price sheet
  2. 2Name the Supplier — Menards, say — and drop the CSV or Excel file the yard sent
  3. 3Check the columns: SKU / item number, Description, Unit and Price (your cost), each shown with its first three values. Common headings are picked for you, and the supplier's next sheet maps itself
  4. 4Read the preview: Price changes, Not matched, Left out and Same price, with a count on each
  5. 5Match an unmatched row to a product you have, add it as a new product, or leave it out — a match is remembered for that supplier
  6. 6Pick the Effective date and whether your sell prices stay put or move with cost to keep your markup
  7. 7Publish behind a confirm that says exactly what will change
  8. 8Open the Price change log to see every price the sheet moved, or a material's own History to see every price it has had
Why we built it

Lumber and steel move every month, and the yard's answer is a spreadsheet: hundreds of lines, their item numbers, their units. Typing that into a price list is an evening, and the evening is where a price goes wrong — a 2x6 keyed as 94.80 instead of 9.48, a bag of screws priced as one screw. A one-step import is worse: one shifted column rewrites the whole list and nobody can say what it used to be. So the sheet is read and matched first, every change is shown old beside new, rows that can't be trusted are left out with the reason, and only an explicit publish moves a price — with the old one kept on record.

The problem
  • Updating a whole material price list by hand
  • Bulk imports that overwrite prices with no record
  • Supplier SKUs that never line up with your own list
  • A wrong column or a blank cell written into the list as a real price
  • No answer to when a price changed, from which sheet, and who published it
What you get
A month's price changes in a few clicks instead of an evening of typing
Every change seen old beside new, with the % change, before anything is saved
The yard's item numbers matched once and remembered for that supplier
Zero prices, "Call" and duplicate SKUs left out with the reason, never written in
Keep your sell prices, or move them with cost so your markup holds
A record of every price a sheet moved: old and new, who, when, which file
One system for the whole post-frame business — the yard's sheet, your price list and your jobs in one place, not five tools taped together
PRICE BOOK

See upload a supplier price sheet
on one of your own jobs.

Twenty minutes, your building, your numbers. Bring the job where “my yard sends a new price list every month” — we will show you exactly where that stops.

leads2build.com
A completed post-frame building
Upload a price sheet — Step 3 of 3 · check before you publish
Step 3 of 3 · check before you publish

Upload a price sheet

5
Price changes
1
Same price
3
Not matched
3
Left out
Effective date
Oct 1, 2026
Your sell prices
Keep my sell prices as they are
2x6 SPF 12′
Line 2 · lumber.dim.spf.2x6.12 · 2x6 SPF 12'
Cost $8.40 → $9.48
+12.9%
Sell $10.92
29ga AG panel 36″
Line 4 · panel.steel.ag.29ga.w36 · 29ga AG panel 36" (per foot)
Cost $3.89 → $4.11
+5.7%
Sell $5.06
J-channel
Line 5 · trim.j-channel · J-channel
Cost $17.90 → $18.75
+4.7%
Sell $23.27
1-1/2″ PM metal screws (250)
Line 6 · fastener.1-5-pm-metal-screws · 1.5" PM metal screws (250)
Sheet says BAG; your book prices this per Each.
Cost $39.50 → $42.00
+6.3%
Sell $51.35
Galvanized ridge vent 10'
Line 13 · Galvanized ridge vent 10' · matched by name
Cost $19.95 → $21.50
+7.8%
Sell $25.94
BackPublish 5 changes
Upload a supplier price sheet — Leads2Build