BLOG
Shopify Handbook
Supplier catalogs keep changing. Shopify needs a controlled update process, not another one-off import
How to update products, prices, and inventory from supplier files without recurring manual reconciliation, duplicates, or lost data.
I keep seeing the same operational requirement. A supplier sends a new spreadsheet: prices changed, inventory moved, some products were added or removed, and sometimes the column names changed as well. The store needs those changes reflected in Shopify quickly.
At first, this looks like a file-import task.
The import, however, is only the final action. The real work comes first: determine which supplier row belongs to which Shopify variant, identify the values that actually changed, decide what to do with missing SKUs, and restrict which store data the supplier is allowed to control.
A Shopify Community discussion from September 5–8, 2026 describes this exact workflow. Participants report that importing a file with several thousand items can take minutes while cleanup, matching, and verification take roughly an hour or several hours. In one example from the thread, a 4,000-row supplier file contained about 60 actual changes. That is not a universal benchmark, but it clearly illustrates where the operational cost sits.
At IceStoreGroup, we have encountered similar requirements and built catalog-update mechanisms around the rules of the business. The goal is not merely to automate an upload. It is to remove recurring failure points while keeping human control where a decision genuinely requires review.
A supplier provides data, not the structure of your store
The suppliers in the discussion send Excel or CSV files with price and inventory updates. Those files contain inconsistent column names, duplicate or unmatched SKUs, missing prices, inventory expressed in different formats, and variants that no longer align with the store.
One supplier uses “in stock / low / out”; another provides numbers. A column called “SKU” this week might become “Item code” next week. One file lists every size separately while another groups them. A common template helps, but it does not eliminate the need for source-specific rules.
I would start by separating fact from assumption. It is a fact that the supplier sent a particular SKU and price. It is an assumption that the row belongs to one particular Shopify variant. Until that match is verified, the row should not become a production update.
A supplier SKU and a Shopify identifier are not the same thing
One of the central factual issues in the thread is that suppliers usually key their spreadsheets by SKU, while Shopify product CSV updates rely on the product URL handle. If the handle is missing or wrong, the intended item might not be updated and a new product can be created instead. The duplicates become visible only after import.
Shopify’s documentation confirms that URL handle and title are required for product updates and that overwriting applies to matching handles. It also warns that a blank optional column included in the import can erase the existing value, while an omitted column leaves the stored value unchanged. Shopify’s product CSV rules.
This leads to an important design rule: the update process should not repeatedly guess products by title. We maintain a durable mapping between the supplier and Shopify and reconcile it against fresh store data before each run. Stable Shopify product and variant IDs should be the technical reference; SKU or barcode can serve as a business key after uniqueness checks. A duplicated or missing key is an exception for review, not permission to write.
A spreadsheet can change identifiers before Shopify sees them
The thread describes another real failure mode: simply opening a file in Excel can remove leading zeros from SKUs or display and save a long barcode in scientific notation. The value can look plausible on screen while no longer representing the original identifier.
The source file therefore needs to remain immutable. Processing should read it as data and explicitly type SKUs, barcodes, and supplier codes as text. If someone needs to inspect it manually, they should work from a copy. Any transformation of the source should be traceable.
This is sound advice from the discussion, and we follow it. For a recurring operation, though, “do not open the original” is not enough. Protection belongs in the mechanism itself: length, format, leading-zero, uniqueness, and character checks should run before product matching.
Update the changes, not the whole file
The discussion recommends comparing the supplier file with a fresh Shopify export and sending only the rows in which price or quantity changed. This is a strong practical recommendation.
It reduces write volume and makes the result reviewable: the owner sees a specific change set rather than thousands of source rows. It also exposes format drift. If a normal run changes dozens of items and the next run suddenly marks the entire catalog as different, processing should stop before any write is made.
The comparison still needs field semantics. A blank price might mean “no price,” “do not change,” or “supplier export error.” A zero inventory value and an empty value might also require different treatment. Those rules cannot be assumed across every supplier.
Before automating, we define a field-ownership matrix: which system is authoritative for price, cost, inventory, title, description, images, SEO fields, metafields, and publication status. The supplier normally controls only a limited subset. Everything else is excluded from the write package.
Which recommendations from the thread are worth adopting
The discussion converges on a sensible operating sequence:
- take a fresh Shopify product and inventory export before processing;
- preserve the supplier’s original file and treat identifiers as text;
- match supplier rows to Shopify products and variants before producing an update;
- preview differences and isolate missing, duplicate, and ambiguous records;
- include only the fields that are intentionally being changed;
- test one item or a small sample of 5–10 products first;
- retain a snapshot of affected data and an audit log of every write;
- reconcile price, inventory, variants, and product counts after completion
These are good recommendations. For an occasional update in a small catalog, they can become a strict operating procedure around Shopify’s native files. When supplier changes arrive weekly or daily, however, that procedure becomes a recurring manual job. A mechanism should execute it consistently on every run.
For inventory, Shopify provides a separate export and import under Products → Inventory. The All states format includes On hand (current) and On hand (new). If inventory moved after the export, Shopify rejects the conflicting rows rather than silently overwriting the newer value. That protection is useful and should not be bypassed without a justified reason. Shopify’s inventory CSV guidance.
What a recurring catalog-update mechanism should contain
We design this process as a sequence of controlled stages rather than one large button.
First, the system accepts a file or retrieves data from an external source and preserves the raw version. A supplier-specific adapter then maps column names and values into an internal model. Structural, format, required-field, uniqueness, and range validation follows.
The next layer matches records to Shopify products and variants. Unambiguous matches continue; missing, duplicate, and conflicting records move into an exception queue. The system calculates the difference between the current and proposed states and previews each intended write.
Only after review and approval does it create an update package. For small, infrequent operations, that package may be a correctly prepared Shopify file. For frequent synchronization, multiple suppliers, or a large catalog, a custom application or a Shopify integration with external systems through the Admin API is usually more appropriate.
For inventory updates through the API, Shopify also supports compare-and-set behavior. If the stored quantity no longer matches the expected quantity, the write returns an error instead of overwriting concurrent change. Shopify inventory compare-and-set. The correct response is to surface a reconciliation task, not to retry indefinitely with a new value.
After execution, the mechanism needs reconciliation: how many records matched, changed, were skipped, or failed, and whether the final state corresponds to the approved plan. Without this layer, automation only reaches an unknown outcome faster.
The right implementation is not identical for every store
A smaller catalog with one supplier may need only a normalizer, a reviewable report, and an import-ready file. This can remove most repeated cleanup without creating unnecessary infrastructure.
With multiple suppliers, different pricing rules, frequent inventory changes, or approval requirements, the store needs a scheduled service with an exception queue, roles, and a change log. When inventory or product data comes from an ERP or warehouse system, the better architecture is an integration with an explicit source of truth for every field.
We can implement this as a focused module, an integration service, or a custom Shopify application. The choice depends on update frequency, catalog size, number of sources, data criticality, and restoration requirements—not on the appeal of having another app.
How IceStoreGroup approaches the work
We begin with real supplier files and a fresh store export. We examine catalog structure, variants, SKUs, barcodes, locations, existing applications, and every current path that can change the same fields.
We then define source-of-truth rules, matching keys, permitted updates, treatment of blank values, price rounding, currencies, inventory by location, and how new or discontinued items should behave. We also define stop conditions: the number of missing keys, duplicates, or unusual changes beyond which the process must not continue automatically.
Next, we build a pilot around a limited sample, verify the result field by field, and only then extend it to the catalog. The solution includes a preview, approval, audit log, notifications, a snapshot of affected data, and a clear restoration path. We also test idempotency: running the same file twice must not create duplicates or repeat already synchronized changes.
If the current process already consumes hours or produces discrepancies, start with an IceStoreGroup Shopify diagnostic. It can establish the actual data path, locate the weak point, and determine whether a reliable template is sufficient or a full integration is warranted.
The main conclusion
Regular supplier catalog updates are a normal operational need for a growing store. The issue is not that files arrive. The issue begins when every file requires product mapping from scratch and nobody can show exactly what will change before it reaches production.
A good mechanism does not promise that suppliers will never make mistakes. A supplier can change a format, add duplicates, remove a column, or send contradictory values. The system should detect that before writing, stop the unsafe run, show the exceptions, and retain a way back.
That is the problem IceStoreGroup solves: we turn a repeated import into a controlled catalog-update process. If you need a mechanism designed around your suppliers, files, and operating rules, contact us. We can analyze the current process and propose an architecture that removes manual repetition without removing control.
Bob Saylor
IceStoreGroup