Update Existing WooCommerce Products
Most WooCommerce catalogues are imported once, then updated from supplier feeds (price, stock, images, categories). Getting unique identifiers and permissions right prevents duplicates and the common error:
Not enough permissions to create record.
Not enough permissions to update record.
No Unique fields present.
Table of Contents
How Import WP decides insert vs update
On the Permissions step you choose a unique identifier. For each row Import WP looks up an existing product with that identifier:
| Lookup result | Create enabled | Update enabled | Result |
|---|---|---|---|
| No match | Yes | — | Insert new product |
| No match | No | — | Error / skip — often “Not enough permissions to create record” |
| Match found | — | Yes | Update existing product |
| Match found | — | No | Error / skip — “Not enough permissions to update record” |
The unique identifier search includes items in trash. Changing the identifier type or values between imports can create duplicates or appear to “lose” matches.
See also the core Permissions documentation.
Recommended unique identifiers
| Identifier | When to use | Template field |
|---|---|---|
| Product SKU | Best default for most feeds | Inventory → Product SKU |
| GTIN, UPC, EAN, or ISBN | Supplier feeds keyed by barcode | Inventory → GTIN, UPC, EAN, or ISBN |
| Product ID | Updating from an export that includes WordPress IDs | Use ID carefully; not always ideal for supplier feeds |
| Slug | Stable slugs in the feed | Product Fields → Slug |
| Custom identifier | Combine columns when no single SKU exists | Permissions → custom identifier from file |
SKU setup
- Map Inventory → Product SKU.
- On Permissions, choose Product SKU as the unique identifier.
- Ensure every row that should update has a stable, unique SKU.
- Variation rows need their own SKUs (different from the parent).
GTIN setup
- Map Inventory → GTIN, UPC, EAN, or ISBN.
- On Permissions, choose GTIN, UPC, EAN, or ISBN as the unique identifier.
- Values must be unique per product (and per variation if used on variations).
SKU and GTIN only appear as unique-identifier options when those fields are mapped in the template.
Permissions step
Typical settings:
First import (create catalogue)
- Unique identifier: Product SKU (optional but recommended)
- Create enabled
- Update optional
- Delete usually off
Ongoing feed sync
- Unique identifier: Product SKU or GTIN (must match the first import)
- Create enabled if new products should be added
- Update enabled
- Optionally enable delete-missing-records only if you understand the impact on products and media
Update-only imports (stock / price sync)
When you only want to refresh stock or prices on products that already exist:
- Map SKU (unique identifier) plus the fields to change (Stock quantity, Regular Price, Sale Price, etc.).
- Permissions:
- Create = disabled
- Update = enabled
- Optionally restrict update to Only the following fields (e.g. inventory / price fields)
If a SKU in the file does not exist on the site, the row will fail with a create-permissions error — expected for update-only mode.
Create new products and update existing ones
- Unique identifier = SKU (or GTIN).
- Enable Create and Update.
- Keep SKUs stable forever for products you want to update.
Skip existing products
To import only new products and never change existing ones:
- Enable Create
- Disable Update
Rows that match an existing unique identifier will not update.
Field-level update restrictions
Under Update permissions you can choose:
| Option | Meaning |
|---|---|
| All Fields | No field restrictions |
| Only the following fields | Allow-list of fields/patterns that may change |
| None of the following fields | Block-list of fields that must not change |
Useful WooCommerce field groups include pricing, inventory, product attributes, product gallery, and related products. This is how you update stock without overwriting descriptions or images.
Examples of why restrictions matter:
- Feed sends empty image columns → without restrictions you might clear galleries
- Feed sends partial attributes → without “keep existing attributes” or field limits you might wipe attributes
Common mistakes
| Mistake | Result |
|---|---|
| No unique identifier mapped | “No Unique fields present” / duplicates |
| SKU mapped but Permissions still use a different ID | Products never match; duplicates or create errors |
| Create disabled on a feed that includes new SKUs | “Not enough permissions to create record” |
| Update disabled when you intended to sync | “Not enough permissions to update record” |
| Changed unique identifier after first import | Duplicates or no matches |
| Parent and variation share the same SKU | Conflicts / unpredictable matching |
| Update by product name | Fragile — names change; prefer SKU/GTIN |
| Empty SKU on some rows | Those rows cannot match reliably |