Bulk import products from CSV
Upload a CSV from Shopify, WooCommerce, Magento, or your own spreadsheet. Brainerce's AI maps every column for you, you review, and a hundred products land in seconds. Covers both importers, what each carries over, and what neither brings.
Adding products one at a time is fine for the first few. Past 20 products, or when migrating from another platform, the bulk importer is the right tool. Brainerce uses AI to auto-detect your CSV format and map every column, so you don't need to massage the file or match a template. Upload, review the mapping, hit import.
Quick steps
- Go to Products in the sidebar.
- Click Import (top right, next to Add Product).
- Drop your CSV onto the upload zone.
- Let the AI map the columns, fix any mistakes, click Preview.
- Verify the preview, then click Start import.
Everything the AI import creates arrives as Draft, so nothing goes live on your storefront until you activate it. The detailed walkthrough below covers each step plus what happens to variants, images and categories, and how to recover if something goes wrong.
There are two importers on this screen
This matters more than anything else on the page, because the two behave differently and it is easy to end up on the wrong one.
| AI import (what you get by default) | Use the Brainerce template | |
|---|---|---|
| How you reach it | Just drop your file; this is the default for products | The Use the Brainerce template link at the bottom of the upload screen |
| Meant for | Any file: Shopify, WooCommerce, Magento, your own spreadsheet, and Brainerce exports too | Files whose column names already match Brainerce's export |
| Variants | Yes, child rows are grouped under their parent | No, a variable row imports with zero variants |
| Categories, tags, brands | Yes | No, the columns are read, then ignored |
| Images | Yes, downloaded in the background | No |
| Custom fields | Yes, you choose which columns become custom fields | No |
| Attributes (Size, Color…) | Yes | No |
| Translations | No | No |
| Status of what lands | Always Draft | Whatever the file's status column says, and Active when it is missing |
| Re-uploading the same file | Duplicates every product | Rows matching an existing product are skipped |
| Failed rows | A count on screen | Downloadable as a CSV |
Not sure which one you used? If you saw a Map columns step with confidence badges, you were on the AI import.
Before you start
- File format: CSV, Excel (
.xlsx), or PDF. UTF-8 encoding for non-Latin characters (Hebrew, Arabic, Chinese). If you exported from Excel and see ??? instead of text, re-save as "CSV UTF-8". - File size: Up to 5 MB per upload. Split larger files.
- Source: Any spreadsheet works, with no specific template required. Shopify exports, WooCommerce exports, Magento exports, hand-rolled spreadsheets: the AI figures out the columns.
- Variants: On the AI import, rows with a
variationtype are auto-grouped under their parentvariablerow, because Brainerce detects parent/child relationships from your file structure. The Brainerce-template path does not group variants at all. - Translations do not come across, on either path. See What neither importer carries over.
1. Open the importer
From the products list, click Import at the top right. The button sits next to Add Product: same row, one click away.
2. Upload your CSV file
The importer opens with a 3-step wizard: Upload file → Map columns → Preview. Step 1 is a drop zone. Drag the CSV from your desktop onto the box or click to browse.

For everything (Shopify, WooCommerce, Magento, custom spreadsheets, and Brainerce's own export files) just drop the file and let the AI take over. It is the better path for all of them, because it is the only one that brings variants, categories, tags, brands, images and custom fields with it.
Restoring a Brainerce backup file ("Use the Brainerce template")
At the bottom of the upload screen sits a link: Have a Brainerce backup file? Use the Brainerce template. It skips the AI mapping because the column names already match, but it is a much thinner import, and it is not a full restore of a backup.
This path imports scalar product fields only: name, slug, SKU, description, base price, cost price, sale price, status, type and GTIN. It does not restore variants, categories, tags, brands, images, custom fields or translations, even though your export file contains those columns. A row marked
VARIABLEcreates a variable product with zero variants under it.
No CSV import can create a kit, on this path or the AI one. A kit is defined by the list of products inside it, and no import file carries that list. A row marked
KITdoes not become a kit and does not fail either: it lands as an ordinary simple product, at whatever price the price column holds, with nothing inside it and no sign in your catalogue that it was ever meant to be a kit. The same happens to a WooCommerce "grouped" product. Import the individual products, then build the kit by hand on the product page. See Kits.
Stock quantities restore, but check three cases. The
stock_totalcolumn from your export is now read back as the product's stock, so a simple product restored into an empty store comes back with the quantity it had, tracked as before. Three exceptions still need a manual check on the Inventory page:
- Re-importing over products that already exist. When a row matches a product already in your store, this path updates the text fields and prices only; it never changes stock. Your existing quantities stay as they are; the numbers in the file are ignored.
- Products you had set to "don't track stock". They export with a quantity of 0 and come back with stock tracking switched on at 0, which makes them unbuyable. Switch tracking back off, or enter a real quantity, for those products.
- Variable products. They restore with no variants at all (see above), so there is nothing to hold stock and nothing a shopper can add to the basket. Rebuild the variants and their quantities by hand, or use the AI import instead.
To move a full catalogue between Brainerce stores, drop the export file onto the AI import instead, or use the API.
3. AI maps the columns
The moment you upload, the AI analyzes your file's headers and inferred values, then matches each one to a Brainerce field. Within a few seconds you land on Step 2, Map columns. Brainerce shows you the detected mapping as a side-by-side table:

- Left column: every header from your CSV, with a few sample values underneath so you can sanity-check what the column actually contains.
- Right column: the Brainerce field it'll be imported into, with a confidence badge (High / Medium / Low) so you know where to focus your review.
The counter at the top is the most reassuring number on the screen: "44 Rows • 17 Products • 27 Variants". It confirms the AI correctly grouped your variant rows under their parent products before you commit to anything.
This step exists only on the AI import; the Brainerce-template path goes straight from upload to preview.
Fix what the AI got wrong, in plain English
Below the mapping table is a text box: "Describe a correction, e.g. 'the price column is sale price, not base price'". Anything you tell it in natural language updates the mapping immediately. No need to find the right dropdown and click through options: just type the fix.
Common ones we've seen:
- "The price column is the sale price, regular price is the base price."
- "The first image column is the main image, the rest go into the gallery."
- "Categories use
/for hierarchy, not>." - "Stock is in the 'inventory' column, not 'quantity'."
You can also click any Map to dropdown directly to pick the right field manually. The AI's suggestion is a starting point, not a lock.
Columns Brainerce doesn't recognise become custom fields
A column that matches no Brainerce field ("Warranty", "Supplier", "הערות") is not thrown away. It drops into an Unrecognised columns section below the mapping table, each row with a type selector (Text / Number / Date / Yes-No). Leave it there and its values are saved on every product as a custom field; you will find them on the product page under Custom fields.
Two things worth knowing:
- You can drop one. Set a column to Don't import and it moves to the Ignored section, out of the import entirely. Nothing in the Unrecognised section is optional by accident: if it is listed there, it is being saved.
- You can send it to a custom field you already made. If your store already has a custom field for that data, pick it from the Map to dropdown under "Custom fields" and the values go into that one instead of creating a new one.
4. Preview the products before anything is written
When the mapping is correct, click Preview. Step 3 shows you exactly how the imported rows will look in your catalog (product name, SKU, images, base price, category, description, status) before any data is written.

Scroll the table to spot-check products at random. Hot things to check:
- Images loaded. Every row should have a real thumbnail, not a placeholder. If thumbnails are missing, the image URLs in your CSV are 404 or behind auth.
- Prices look right. A
9,99that became999means the AI parsed a European decimal as a comma-thousands separator. Go back and tell itprices use comma as decimal separator. - Categories nest properly.
Electronics > Camerasshould appear in the Category column as a path, not flattened to one of the two parts. - Variants grouped under parents. Click the
▶next to a row that hasN Variantsto expand and verify the children look right.
If something's off, click Back to mapping and re-run with corrections. Nothing is written to your catalog until you press Start import.
Read the counts before you confirm
Above the table, this step states what the run will actually do: how many products are in the file, how many will be created, how many will be updated, how many will be skipped, and how many rows carry no SKU. The default is Create only, so on a first import the "will be updated" count is 0.
Those numbers are worth a glance even when you are only adding products. A file you expected to be all-new showing "38 will be skipped" means Brainerce found those SKUs in your store already; a big without a SKU count usually means the SKU column was mapped to the wrong field. Either is easier to fix now than after the import.
If some products are already in your store, expand N products are already in the store, see which to read the list before deciding what happens to them. Set the run to Update only or Create and update to change them, and see Updating products from a file.
When everything looks good, click Start import.
5. Watch the import run and check the results
A progress bar tracks the import. For a 44-row file with images to download, this takes 20 to 60 seconds. You can close the modal and keep working, because the import runs in the background.
On the AI import, the panel shows running counts: products created out of the total, variants created, and a number of errors. It does not list which rows failed. If the whole run fails you get up to three error messages, and that is all. There is no per-row error CSV to download on this path, so note the error count and compare your catalogue against your file to find what is missing.
On the Brainerce-template path, the completed screen breaks the run into created / updated / skipped and offers a Download errors button producing an import-errors-….csv listing a row number, field and reason for each failure, so you can fix those rows and re-upload only them.
Your imported products are Drafts, and that's why you can't find them
Everything the AI import creates arrives with status Draft. Draft products are saved in your catalogue but invisible on your storefront: they will not appear in listings, in search, or at checkout until you activate them.
This is the most common "the import didn't work" report we get, and the import worked fine. To publish them:
- Open Products and filter the list to Draft.
- Select all the rows you just imported.
- Bulk Edit → Status → Active.
Check the products are right before you activate, because fixing a price while it is still a draft is cheaper than fixing it live.
The Brainerce-template path behaves differently here: it takes the status column from your file, and treats a row with no status as Active, so those go live immediately.
Re-importing the same file
Products you already have are never duplicated. Before you confirm, the preview tells you how many of the products in your file are already in your store and lets you see exactly which ones. What happens to them is your choice: leave them alone (the default) or update them.
The default is Create only: an existing product is skipped, meaning nothing happens to it: same price, same stock, same name, same images. If you fixed a price in your spreadsheet and re-uploaded on this setting, the fix did not reach your store.
To make the fix land, pick Update only or Create and update in the preview step and tick the fields you want written. See Updating products from a file below. Brainerce never decides this for you: a run that would change existing products is one you chose explicitly.
Brainerce also recognises the file itself. Upload the same file twice and the preview says so, with the date of the previous import and how many products it created, before you click anything.
How Brainerce decides a product is "already in your store"
By SKU, and only by SKU. The product-level SKU in your file is compared against the SKUs in your store, ignoring upper/lower case. Names and URL slugs are deliberately never used to match, because two genuinely different products can share a name, and matching on it would skip a product you meant to add.
Two consequences worth knowing before you upload:
- No SKU column means no matching. A file whose products carry no SKU has nothing to compare, so every row is created, and re-uploading such a file does give you a second copy of everything. The preview says how many products fall into this bucket. Add a SKU column if you plan to re-upload.
- Repeated SKUs inside one file create the product once. The first row wins; later rows carrying the same SKU are skipped and listed with the rest.
Updating products from a file
Upload a price list or a stock sheet and apply it to products you already have. The choice sits in the preview step, next to the counts, and you make it before anything is written:
| Setting | What it does |
|---|---|
| Create only | The default. Adds products your store does not have. Existing ones are left completely untouched. |
| Update only | Changes products already in your store. A row that matches nothing is skipped, never created. |
| Create and update | Adds what is new and updates what is already there. |
Matching is by SKU, exactly as described above, never by name. Renaming a product in your spreadsheet does not break the match, and a row with no SKU is skipped rather than matched by guesswork.
Tick the fields you want changed
On either update setting you choose which fields the file may write. Anything you leave unticked is not written, even if your file has a column for it. The default is price and stock only, because a price list often carries a shortened product name that would otherwise replace the name you wrote.
Available: price, sale price, stock, name, description, categories, brands, images, variants.
An empty cell does not erase anything
By default a blank cell means "this file has nothing to say about that field", not "clear it". A price sheet with an empty description column will not wipe your descriptions. If you genuinely want blanks to erase, tick Let empty cells clear existing values; it is off unless you turn it on.
What an update never does
- It never removes images. Images in the file are added to what the product already has. A file listing two pictures does not delete the other six.
- It never removes variants. Variants are matched by SKU and updated; ones the file does not mention are left alone. A variant in the file that your product does not have is added.
- It never removes categories, brands or tags. Those are added too.
- It never creates anything on "Update only". Rows that match nothing are listed in the result so you can see whether the file used the wrong SKU column.
To remove images, variants or categories, edit the product in the dashboard, because an import cannot do it.
Other ways to change products in bulk
| What you want to change | Where to do it |
|---|---|
| A few products | Edit them in the products table: click a cell and type. |
| Prices, status or names in bulk | Select the rows and use Bulk Edit. |
| Stock levels only | The Inventory page has its own importer taking just SKU and Stock. |
The Use the Brainerce template path does not offer these settings: a row whose slug or SKU already exists is skipped, and the existing product is never updated. Updating from a file is the AI importer only.
If you have duplicates from an import you ran before this behaviour existed, select the extra rows in the products table and delete them. There is no automatic de-duplication of what is already there.
What neither importer carries over
Some things you may expect to migrate simply do not, on either path. Plan to set them up after the import rather than waiting for them to appear:
- Translations. Per-language versions of your product names and descriptions are never read from the file, whichever importer you use, not even from a Brainerce export that contains them. After importing, use Translate on the products table (one row or many) to generate them. See Manage products.
- Customer reviews, order history and stock movement history. The importer creates products; it does not bring a product's past with it.
- Everything the Brainerce-template path drops: variants, categories, tags, brands, images and custom fields. The AI import does bring all of those.
Common errors and how to fix them
| Error message | What it means | Fix |
|---|---|---|
Missing required column: Name | The AI couldn't find a column that looks like a product name. | Use the correction box: "the 'Title' column is the product name." |
Invalid price: "9,99" | Comma vs. period decimal mismatch from a European Excel export. | Tell the AI: "prices use comma as decimal separator." |
Image download failed (404) | An image URL is broken, behind auth, or has expired. | Re-upload the image to a public URL, or import without images and add later. |
Variant has no parent row | A variation row sits orphaned without a variable parent above it. | Sort the CSV so each variable row precedes its variations. |
Duplicate SKU | The same SKU appears twice in the file. | SKUs must be unique. Rename one or merge the rows. |
Encoding error: non-UTF8 bytes | The file is in a Windows codepage (CP-1255 for Hebrew, CP-1252 for Western Europe). | Open in Excel and re-save as "CSV UTF-8 (Comma delimited) (*.csv)". |
| A row fails after you've imported the same file several times | Ten products already share that URL slug, so an eleventh can't be created. | Rename the product in your file, or delete the duplicates you already have. |
What's next?
- Activate what you imported. Everything from the AI import is a Draft. Filter Products to Draft, select all, then Bulk Edit → Status → Active.
- Connect to a sales channel. Make all imported products visible on Shopify, TikTok, or your headless storefront. See Sales channels.
- Add modifier groups for toppings, customizations, and add-ons that apply across many imported products at once. See Modifier groups.
- Take a test order to verify that imported products check out correctly end-to-end. See Take a test order.
Customer reviews and review photos
Let customers rate your products and attach photos, decide whether photos wait for your approval, and take down a single bad picture without losing the review.
Stock & inventory
Monitor stock across all products and SKUs, make instant adjustments from the inventory list, and understand how Available differs from total stock.