Import Formats
The exact spreadsheet layout for every bulk import Kassly accepts, column by column.
11 min read · Updated 27 Sep 2026
On this page
Kassly accepts four bulk imports, all of them Excel spreadsheets. This page is the column-by-column reference for each.
| Import | Where | What it does |
|---|---|---|
| Products | Products page → Import | Adds and updates sellable products, with opening stock and a preferred supplier |
| Ingredients | Ingredients page → Import | Adds and updates raw materials, with opening stock |
| Bulk Stock-In | Inventory → Bulk Stock-In → Import from Excel | Adds quantity to products you already have |
| Recipes | Compositions page → Import | Builds recipes and their ingredient lines |
Read this before you build a spreadsheet
Three rules apply to all four imports, and ignoring any of them will cost you an afternoon.
Always start from the template Kassly gives you. Every import has a Download template button that produces an .xlsx pre-filled with your own data. Fill that in and upload it back.
Kassly reads columns by position, not by heading. The heading row is there for you to read; the importer skips it and takes column A as column A. So:
- Do not insert, delete, or reorder columns. A sheet with the right headings in the wrong order imports the wrong data into the wrong fields, without complaining.
- Renaming a heading is harmless.
- Adding columns to the right of the last one is harmless.
Everything is all-or-nothing. One bad row rejects the whole file with a list of what to fix, and nothing is saved. You never end up with half a catalogue and no idea which half. (One exception, on the products sheet: a Supplier name that matches no supplier is reported after the import instead of rejecting the file.)
File rules, identical for all four:
| Format | .xlsx or .xls — not .csv |
| Maximum size | 5 MB |
| Data starts on | Row 2 |
| Who can import | Owner or Manager only |
Products
Adds and updates the things you sell.
- Template:
products-template.xlsx, pre-filled with your existing sellable products. The Export button on the Products page downloads the same file. - Sheet name:
Products. Helper tabsLists(your categories and suppliers) andHow to usecome with it. - Matching: by SKU, then by name when the SKU is blank. A blank cell on an existing product leaves that field as it is.
| Col | Heading | Required | Notes |
|---|---|---|---|
| A | Name | Yes | What the item is called on the menu or shelf. |
| B | SKU | No | Blank generates one. Keep it to update the product on a re-upload. |
| C | Barcode | No | Scanned at the counter. |
| D | Category | On a new product | A category that doesn't exist yet is created, so watch the spelling. |
| E | Cost Price | No | Blank on a new product means 0. |
| F | Selling Price | On a new product | What the customer pays. |
| G | VAT | No | Vatable, VAT Exempt or Zero Rated. Defaults to Vatable. |
| H | Track Stock | No | Yes or No. |
| I | Stock Unit | No | One of the stock units, e.g. pc, kg, L. Only matters when Track Stock is Yes. |
| J | Opening Qty | No | Stock to add at the branch you pick. Needs Track Stock set to Yes. |
| K | Reorder Point | No | Warn when stock falls to this level. Only saved if you pick a branch. |
| L | Show in POS | No | Yes or No. |
| M | Active | No | Yes or No. |
| N | Description | No | Shown on the online store and receipts. |
| O | Sold By | No | Per piece (default) or By weight/volume/length. |
| P | Supplier | No | The preferred supplier. Must match a name on your Suppliers page; capitals don't matter. |
| Q | Supplier SKU | No | The supplier's own code for the item. Up to 100 characters. |
Supplier (P) is matched against your Suppliers page by name and never creates a supplier. An unknown or ambiguous name imports the rest of the row and leaves the supplier as it was, with a note after the import. A sheet from before columns P and Q existed still imports.
Ingredients
Adds and updates the raw materials you cook or build with — flour, cooking oil, shampoo, brake fluid.
- Template:
ingredients-template.xlsx, pre-filled with your existing ingredients plus 50 blank rows - Sheet name read:
Ingredients, falling back to whichever sheet is active - Row limit: 2,000 rows. Rows past that are silently ignored — split a larger catalogue into several files.
- Add-on: none. Available on the Free plan.
| Col | Heading | Required | Format and notes |
|---|---|---|---|
| A | Name |
Yes | What you call the raw material, e.g. Pasta Sauce |
| B | SKU |
No | Leave blank and Kassly generates one prefixed ING. Keep the existing SKU to update rather than duplicate. |
| C | Stock Unit |
No | One of pc, g, kg, ml, L. Case-sensitive — L is valid, l is not. Blank means pc. The template gives you a dropdown. |
| D | Cost per Unit |
Yes | A number, 0 or more. What one stock unit costs — cost per gram, not the price of the sack. Rice at ₱45/kg tracked in grams is 0.045. |
| E | Opening Qty |
No | A number, 0 or more. Stock to add at the chosen branch. |
| F | Reorder Point |
No | A number, 0 or more. Only saved if you pick a branch. |
| G | Notes |
No | Free text, recorded against the opening-stock movement |
How rows are matched
- If SKU is filled in and matches one of your existing items, that item is updated — only its name, stock unit and cost.
- If SKU is blank, Kassly matches on Name, exactly, ignoring case.
- No match either way, and a new ingredient is created: stock-tracked, hidden from the POS, priced at zero.
Rows that will be rejected:
- The same SKU twice in one file.
- A SKU that already belongs to something that is not an ingredient.
- Two rows with the same name and no SKU.
Opening quantities
If any row has an Opening Qty above zero, you must pick a branch in the import dialog. Stock has to land somewhere.
Blank out Opening Qty before you re-upload. The template leaves it blank on existing rows for exactly this reason. Opening Qty adds stock; uploading the same file twice adds it twice.
Plan limits
New ingredients count against your plan's product limit — 50 on the Free plan. If the file would take you over, Kassly refuses the whole upload and tells you how many places are left. Any active add-on lifts the limit entirely.
Bulk Stock-In
Adds quantity to products you already have, with optional cost, batch and expiry. Use it for a big delivery, or to load your opening stock at go-live.
- Template:
bulk-stock-in-template.xlsx— you must choose a branch to download it - Sheet read: whichever sheet is active
- Row limit: none
- Add-on: none. Available on the Free plan.
This import only works with a template you downloaded yourself. Columns A and B hold Kassly's internal product IDs, and they are how a row is matched. They are hidden in the template. A sheet you built by hand, or one another store downloaded, will fail on every row with Product not found.
| Col | Heading | Read? | Required | Notes |
|---|---|---|---|---|
| A | product_id |
Yes | Yes | Kassly's product ID. Hidden. Never edit or clear it. |
| B | variant_id |
Yes | No | Kassly's variant ID. Hidden. |
| C | Product Name |
No | — | For you to read. Editing it does nothing. |
| D | SKU |
No | — | For you to read |
| E | Variant |
No | — | For you to read; — when there is no variant |
| F | Current Qty |
No | — | The branch's quantity when you downloaded the template |
| G | Quantity to Add |
Yes | Yes | At least 0.01. Blank or 0 skips the row entirely — that is how you ignore products you are not receiving. |
| H | Cost Price |
Yes | No | Cost per unit for this delivery |
| I | Batch Number |
Yes | No | Needs batch tracking to be useful |
| J | Expiry Date (YYYY-MM-DD) |
Yes | No | Exactly that format, e.g. 2027-03-15 |
| K | Notes |
Yes | No | Free text |
The workflow is: download the template for the branch, delete nothing, type quantities into column G only on the lines you actually received, and upload.
Quantity to Add adds. It does not set. A product at 40 with
10in column G ends up at 50, not 10. Upload the same file twice and you have added twice. To correct a wrong quantity, use a stock adjustment instead — see Stock adjustments.
There is no Unit column. Everything is in the product's own stock unit.
Recipes
Builds recipes — which ingredients, how much of each, and how much waste. One row per ingredient line, so a recipe with six ingredients is six rows that repeat the same menu item and composition name.
- Template:
compositions-template.xlsx, pre-filled with your existing recipes in the same layout - Sheet name read:
Compositions, falling back to whichever sheet is active - Row limit: 5,000 rows. Rows past that are silently ignored.
- Add-on: needs the Recipe Costing add-on (₱350 per branch each month), or any bundle that includes it.
| Col | Heading | Required | Notes |
|---|---|---|---|
| A | Menu Item SKU |
One of A or B | Tried first, matched ignoring case |
| B | Menu Item |
One of A or B | Exact name, ignoring case. Also the fallback if the SKU in A matches nothing. |
| C | Variant |
No | Must be the name of an existing variant of that item |
| D | Composition Name |
Yes | What this recipe is called, e.g. Regular, Large |
| E | Yield |
No | How many servings one batch makes. Greater than 0; blank means 1. Put it on every row of the recipe. |
| F | Ingredient SKU |
One of F or G | Tried first |
| G | Ingredient |
One of F or G | Exact name, ignoring case |
| H | Quantity |
Yes | How much of the ingredient, greater than 0, in the unit in column I |
| I | Unit |
No | Blank falls back to the ingredient's own stock unit |
| J | Waste % |
No | 0 to 99.99. Blank means 0. |
| K | Producible (commissary) |
No | yes, y, true or 1 for yes. Anything else, blank included, is no. The template writes yes / no. |
What gets rejected
- A menu item or ingredient Kassly cannot find. Ingredients must already exist — import them first.
- An ingredient that does not have stock tracking switched on. It would sit in the recipe and never actually deduct, so Kassly refuses it rather than let you believe it works.
- A variant name that item does not have.
- The same ingredient listed twice in one recipe.
Create versus update
A recipe is matched on menu item + variant + composition name, ignoring case.
- New combination → a new recipe.
- Existing combination → the recipe's yield and commissary flag are updated, and all its ingredient lines are replaced by the ones in your sheet.
- Not in your sheet at all → left completely alone. A partial upload is never a mass delete.
That means an existing recipe must be listed in full. Uploading a file with one line of a six-ingredient recipe leaves you with a one-ingredient recipe.
Note that Kassly is forgiving in one place: if the SKU in column A or F matches nothing, it quietly falls back to the name in the neighbouring column. So a typo'd SKU with a correct name still imports.
Imports Kassly does not have
Be straight about this, because older documentation claimed otherwise:
- There is no customer import.
- There is no staff or employee import.
- There is no stock count import.
- CSV is not accepted anywhere. If you have a CSV, open it in Excel or Google Sheets, paste the values into the Kassly template, and save as .xlsx.
If you are working from a "CSV Import Format" appendix with columns like
name,sku,barcode,price,cost_price,stock— that came from a previous version of this manual and describes an importer that does not exist. Nothing reads those columns. The four formats above are the complete list.
When an import fails
The error list names the row number and the problem, one line per bad row. Fix them in your spreadsheet and upload the same file again — nothing was saved, so there is nothing to undo.
The exception is Bulk Stock-In, which reports the failure but shows less detail per row. If it will not go through, the cause is almost always an edited or missing column A.