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 tabs Lists (your categories and suppliers) and How to use come 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

  1. If SKU is filled in and matches one of your existing items, that item is updated — only its name, stock unit and cost.
  2. If SKU is blank, Kassly matches on Name, exactly, ignoring case.
  3. 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 10 in 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.