Importing Products, with Recipes and Bundles
If you have a lot of products to add, a CSV import is faster than adding them one at a time — and if a product is made from other products, its recipe or bundle can be set up in the same file.
Before you start
You'll need a CSV file with at least sku and name columns. Everything else is optional, including the recipe and bundle columns covered below. Download Iraca's template first if you don't have a file ready — it includes a plain product, a recipe, and a bundle, already filled in as working examples.
Only workspace owners and admins can import products.
The basics: one row per product
- Go to Inventory → Products
- Click Import CSV
- Click Template to download
products-import-template.csv - Fill in your data, then drag the file into the upload area (or click to browse) and click Import
Iraca matches rows to existing products by SKU: a SKU that already exists in your catalog is updated, and a new one is created (up to your plan's product limit). A blank cell on an update never erases a value — it just means "leave this field as it is."
See the in-app column list for the full set of plain-product columns (brand, barcode, category, unit cost, dimensions, and so on). brand exports as well as imports, so an export edited in a spreadsheet and re-imported keeps its brands.
Linking a supplier
preferred_supplier_name records who you usually buy a product from, and it exports as well as imports — so an export, edited in a spreadsheet and re-imported, keeps its suppliers rather than losing them.
The name has to match a contact you already have; Iraca will not create one from a spreadsheet. A name it can't match to exactly one contact leaves the product imported without a supplier and lists the name in the import summary. The rules are the same as for supplies — see Importing Supplies for the detail.
Shelf life and storage
Two columns sit at the end of the file for products you make fresh (meal prep, deli, bakery):
| Column | Meaning |
|---|---|
shelf_life_days | A whole number of days from 1 to 3650: how long the product keeps after it is made. A production run that finishes on the 3rd with a shelf life of 5 gets a use-by date of the 8th. |
storage_instructions | Free text for the label, such as "Keep refrigerated. Reheat 2 minutes." |
A blank cell leaves the current value alone, and a value that isn't a whole number of days is skipped and listed in the import summary. They export too, so an exported file keeps them when you re-import it.
Product images
Put a link to the picture in the image_url column and Iraca downloads it and saves it as the product's image.
- The link must be public: an
http://orhttps://address anyone on the internet could open. Links to your own computer or office network (localhost,192.168…,10.…addresses) are refused. That keeps the import from being used to reach places it shouldn't. - It must be a JPEG, PNG, WebP or GIF of 5 MB or less. A link to a web page rather than the picture itself (a shop's product page, say) won't work: right-click the image and copy the image's own address.
- Up to 3 redirects are followed, and the whole download has 15 seconds.
If a picture can't be downloaded, the product still imports without it, and the import summary lists a warning saying why. A blank image_url leaves an existing image alone.
Adding a recipe
A recipe has a variable number of ingredients, which doesn't fit naturally into one row of a spreadsheet. Iraca handles this the way accounting software handles a multi-line invoice in CSV: the product's SKU repeats on one row per ingredient.
| Column | Meaning |
|---|---|
recipe_output_quantity | How many finished units one batch yields. Defaults to 1. |
ingredient_sku | The SKU of an ingredient — must already exist, either earlier in your catalog or elsewhere in this same file. |
ingredient_quantity | Required whenever ingredient_sku is filled in. |
ingredient_unit | Optional. Blank means the ingredient's own unit. Any other unit must convert to it (oz for an ingredient in lb), or the row is refused. |
A sandwich made from bread and turkey:
sku,name,...,recipe_output_quantity,ingredient_sku,ingredient_quantity,ingredient_unit
SAND-01,Turkey Sandwich,...,1,BREAD-01,2,unit
SAND-01,,...,,TURKEY-01,120,gOnly the first row needs the product's other fields (name, unit of measure, and so on) — the second row leaves them blank, meaning "same product, another ingredient." Repeating them on every row works too, if that's easier to build in your spreadsheet tool.
The ingredient has to exist somewhere. Either it's already a product in your catalog, or you give it its own row elsewhere in the same file (in any order — a finished good's ingredient rows can come before or after the ingredient's own product row). Iraca reads the whole file before creating anything, specifically so the order doesn't matter.
Importing the same file again updates the recipe's ingredient list rather than duplicating it — safe to re-run if you're refining a file.
Adding a bundle
Bundles use the identical pattern, with component_ columns instead of ingredient_ ones:
| Column | Meaning |
|---|---|
is_bundle | 1 to mark the product as a bundle. |
bundle_type | kit or prepackaged. Defaults to kit. |
component_sku | The SKU of a component — same existence rule as ingredient_sku above. |
component_quantity | Required whenever component_sku is filled in. |
sku,name,...,is_bundle,bundle_type,component_sku,component_quantity
KIT-01,Gift Basket,...,1,kit,BREAD-01,1
KIT-01,,...,,,TURKEY-01,2If you fill in component_sku rows but leave is_bundle blank, Iraca marks the product as a bundle automatically — that's reported back as a note, not an error, so you'll see it in the results but the import still succeeds.
See Composite Products and Bundles for what kit and prepackaged mean for fulfillment.
Exporting part of your catalog
Export CSV on the Products page writes the same file format the import reads. With no search or filter applied it exports your whole catalog. If you've searched, or picked a product type or the bundle filter, Iraca asks which you want:
- Only these results — just the products in your list, in the order they're sorted on screen.
- All products — your whole catalog, as if nothing were filtered.
Exporting your results is handy for editing a slice of the catalog — say, every raw material — in a spreadsheet and importing it back. Products missing from the file are left alone on import, so a partial file never removes anything.
What the import won't do
- Won't guess at an ingredient or component. If a SKU can't be found anywhere in your catalog or the file, that one line is skipped and reported as an error — the rest of the file still imports.
- Won't nest bundles. A component that is itself a bundle is rejected, same as building a bundle by hand.
- Won't let a product be both. A product can't have
ingredient_skurows andcomponent_skurows at the same time — pick a recipe or a bundle for that SKU. - Won't remove an ingredient or component that's missing from a later import. Re-importing adds and updates lines; it never deletes one just because this file doesn't mention it.
Reading the results
After the import, Iraca shows how many products were created and updated, how many recipes were created, and any row-level problems — grouped as errors (that row was skipped) and warnings (it imported, but worth a look, like the automatic bundle flip above).