UpChannels
← All guides
Moving over9 min read

Move your stock off spreadsheets without losing serial numbers

Your stock comes across as a CSV. Your customer history does not. Clean the file before you import, run catalog and quantities as two passes, and count on day one.

UpChannels Team · Published

You have a workbook called Inventory. A tab per year, two columns only you understand, and a serial number column where half the cells end in a space because of how they were pasted in. It has worked for six years. Now you are moving to a real system, and the question is not whether the software can hold your stock — it can — but what happens to the six years.

What comes across, and what does not

Decide this first, because it changes how much work the move is.

  • Stock on hand: yes. One row per unit, or one row per product with a quantity.
  • Cost and price: yes, in the same rows.
  • Serial numbers: yes, one per row, and they become the identity of the unit from then on.
  • Open orders, deposits and scheduled deliveries: yes, by hand. Nobody imports these. There will be fewer than you fear; count them before you dread them.
  • Closed sales from previous years: no, and you do not need them. Keep the old workbook read-only on a shared drive. You will open it four times in the first year, then stop.
  • Customers: mostly no. There is no customer CSV importer in UpChannels today. Products and purchase orders both have one; customers do not. Plan around that rather than discovering it in week two.

The cleanup is the hard part, not the import

Importing a clean file takes minutes. Getting the file clean is the job, and almost every problem people blame on an import was already in the spreadsheet. Four passes over your own data, in this order:

  1. Duplicate SKUs. Sort by SKU and conditional-format the duplicates. You will find two kinds: a product typed twice with slightly different names, and the same SKU once per delivery because the sheet was really a receiving log. The first needs merging; the second needs turning into one product with several units. Do it here, where the fix is a delete key.
  2. Blank costs. Filter the cost column for blanks. A blank cost imports as zero, and a zero cost makes every sale of that item look like pure profit for as long as you own it. Put in the real number or your best honest estimate, and write "cost estimated" in the note column so you know which ones to fix when the invoice turns up.
  3. Units that left months ago. The row for the dryer sold in March that nobody deleted. The rule is physical: if you cannot walk over and put a hand on it, it does not go in the file. This is the biggest single source of a day-one count nobody trusts.
  4. Serials with typos and trailing spaces. Run TRIM down the column and paste the values back. Then sort it and read down: transposed digits sit next to their neighbours and jump out. Check length too — most manufacturers use a fixed serial length per model, so the one that is two characters short was typed off the carton, not the plate.

Two mechanical fixes before you export: unmerge every merged cell, which otherwise exports as one value and a pile of blanks, and strip 12 ea and 2 cases out of the quantity column.

The columns that matter

Fewer than you think. The catalog import will not write a product row without six of them — name, sku, model, category, brand and msrp — and names the missing one on the row. The stock import is looser: sku, name, category, costPrice and retailPrice are the ones it insists on, with model, brand and msrp recommended rather than required. Fill all eight anyway. Every filter and margin report you run later is built on the fields you were allowed to skip.

| Column | What it is for | |---|---| | sku | Your code, the key every other row joins to. It never has to match anyone else's. | | name | What you call it on the floor. | | model | The manufacturer's model number — what a customer reads off the plate when they call. | | brand, category | Every filter and report you run later is built on these two. | | msrp | List price. Sets what a discount looks like beside it. | | costPrice | Margin, and the value of stock you own. | | retailPrice | The ticket price. | | serialNumber | One unit, one serial. Serials and barcodes are unique inside your business. | | condition | NEW, USED or REFURBISHED, in capitals. | | quantity | Bulk rows only — things you count rather than track one by one. |

Leave out on day one: photos, long descriptions, dimensions, weights, vendor lead times. Those get added from the product screen on quiet afternoons. Do not hold up a migration for a photo.

Do it in two passes

One pass that does everything is one pass you cannot unwind.

  1. Catalog pass. Products only — no quantities, no serials. Wrong categories, doubled brands and a price column that drifted a decimal are all obvious here, and all cheap to fix.
  2. Stop and read it. Sort by cost, then by price. Anything at 0.00 or 99999 is a bad cell, not a bargain.
  3. Quantity pass. Now the units: one row per physical unit with its serial, or bulk rows with a quantity, against a location.

The order buys you recovery. A mistake in pass one is a product record you edit. A mistake in pass two is stock — a number a sale can already draw against, which has to be corrected rather than retyped.

Count on the day, not next month

An imported number is a claim. A counted number is a fact. Close the gap while you still remember what you did.

  1. Freeze receiving for the afternoon. Nothing comes in the back door.
  2. Import, one location at a time.
  3. Count that location the same day. Count on hand — units physically present. Do not try to count "available"; that is on hand minus what is promised to somebody, and the system works it out.
  4. Post the count. Each variance becomes a recorded adjustment rather than a silent overwrite, so in March you can still see the discrepancy came from the migration and not from a person.
  5. Write down the total variance. That is your honest starting accuracy.

Parallel for a fortnight, or cut over on a Sunday

Both are defensible. Pick one deliberately.

Cutting over means the spreadsheet goes read-only at close on Sunday and Monday runs on the new system. It is uncomfortable for about four days, and the numbers are true from the first hour because there is only one place to put them.

Running parallel means keeping both for two weeks. It feels safer. The honest cost is that it is double entry, and double entry decays — by day five somebody has posted to one and not the other, and you have two sets of numbers that disagree with no way to tell which is right. Parallel only works if one person owns the reconciliation and does it daily.

Under a few hundred units, cut over. Reserve parallel running for a real dependency: a lender, an accountant mid-close, a landlord's inventory clause.

What goes wrong

Importing the same file twice. Serialized rows are refused: the importer looks for that serial or barcode anywhere in your business and skips the row, naming the unit that already exists. Bulk rows have no serial, so a second upload of a bulk file adds the quantity again. Check your order list before re-running anything.

Everything lands at one location. Import per location, or the second store shows zero and the first shows double. Spotting it is easy; unwinding it is a day.

Zero costs everywhere. The symptom is margin reports that look fantastic. Sort cost ascending in week one.

The spreadsheet stays open "just in case." This is the real failure. Both files are authoritative, neither is right, and the argument about which to believe happens in front of a customer. Set a date, make the old file read-only on that date, and hold it.

A serial typed off the carton. Carton and plate disagree more often than you would expect, and when a warranty claim is refused in eighteen months, this is why. Photograph the plate instead.

How UpChannels handles this

There are two importers, matching the two passes above.

The product import creates catalog records only — no stock. Download a sample CSV, fill it, and every row is previewed before anything is written, marked Create, Merge or Skip against what you already have. SKU and barcode matching ignores case, so WD-4410 and wd-4410 are one product rather than quietly two.

The procurement import creates the stock. Two formats: trackable, one row per physical unit, which keeps the serial, condition and grade and forces the quantity to one; and bulk, one row per product with a quantity. It asks for a vendor, a vendor invoice number and a location first, so imported stock arrives as a receipt you can trace rather than a number that appeared — and re-using an invoice number is refused outright. It ships filled-in sample files for thirteen trades — a trackable one and a bulk one each — from appliance and furniture retail to HVAC, plumbing and landscaping, and offers you the pair matching your own, so the example rows already look like your stock. Both importers read CSV only: an .xlsx is rejected with a message rather than parsed into junk, so save as CSV first.

Afterwards, count sessions run per location and post variances as adjustments, and an integrity audit checks stock levels against the movement history, flagging drift, negatives and serial counts that do not match.

The limit, said plainly: there is no customer CSV importer. Most stores start with an empty customer list and let it fill as they ring up sales, because every order captures the customer. Moving thousands of customer records is a conversation to have before you switch, not a self-serve import — the customers page says the same in its own FAQ.

The parts of UpChannels this touches

Read next

All guides

The product moves faster than this page. UpChannels ships updates most weeks, so a description here can lag what is already in the software. Where the two disagree, the running product is the current version — tell us if you find one and we will correct the page.