Spreadsheet Templates for Importing
Download blank spreadsheets with exactly the columns Sporeline imports, fill them in, then hand them to your AI assistant.
adminSpreadsheet Templates for Importing
If you are starting a new sheet to bring your farm into Sporeline, start from ours. Each template has exactly the columns Sporeline imports, in the right spelling, with one example row you can overwrite or delete. You can get them from Settings → Import under “Download spreadsheet templates”.
There is one workbook, sporeline-import-templates.xlsx, with a “Read me” sheet and then one sheet for each kind of record. If you’d rather work in CSV, each sheet is also its own file: locations.csv, strains.csv, bag-types.csv, recipes.csv, batches.csv, blocks.csv, harvests.csv, lab-items.csv, customers.csv, orders.csv and lots.csv. In the workbook, hover over a column name to see what goes in it, and the columns with a fixed list of answers (a customer’s type, a location’s type, a stage) give you a dropdown.
A few things that hold for every sheet
Keep the header row exactly as it is. The required columns come first, so you can fill those and leave the rest blank when you don’t have them. Dates are written year first, like 2026-10-15. When a cell holds a list, separate the entries with semicolons.
external_ref is your own id for the record in your old system, like a customer number, a lot code or the label on a culture jar. Fill it in whenever you have one. It’s how your assistant’s import recognizes a row it has already brought in, so you can hand it the same sheet again after fixing a few rows and nothing doubles up. When a row has no external_ref, the assistant’s import matches it by name instead, as each sheet below says. The Upload CSV form on Settings → Import doesn’t match rows at all; see the last section.
Fill the sheets in the order they appear in the workbook. A later sheet names records from an earlier one: a recipe names its bag type, a batch names its recipe, a culture names its strain. Those records need to be in Sporeline before the rows that point at them.
Locations
name is required. type is one of the location types in the dropdown (ROOM, RACK, SHELF and so on), capacity is a whole number, and default_stage is the stage blocks usually sit in there. parent is the name or external_ref of the location this one sits inside, and that parent has to be imported first. A row whose name matches a location you already have under the same parent updates it.
Strains
code is required, like PO-BLUE1. Add the species (the binomial, like Pleurotus ostreatus) whenever you know it; a strain without one comes in marked as needing review. aliases is a list of other codes or names you’ve used for the same strain, separated by semicolons. bank_status and section have dropdowns. The code is the match: a row whose code or alias is already in your catalog updates that strain.
Bag types
name, volume, material, filter_patch_micron and thickness_mil are required. volume is a number, or a number with a unit like 5 lb or 2.5 L; the last two are numbers like 0.2 and 2.2. supplier and lot_number are optional. A row whose name matches a bag type you already have updates it.
Recipes
name, species, strain, bag_type, target_wet_weight_g, hydration_pct, supplement_pct and ingredients are required. bag_type is the name of a bag type already in Sporeline. ingredients goes in one cell, one ingredient after another separated by semicolons, each written as name, amount and unit separated by a bar, like Hardwood sawdust | 1800 | g; Soy hull pellets | 450 | g. recipe_type is SUBSTRATE unless you say GRAIN_SPAWN, and strain_code links the recipe to a strain in your catalog. A row whose name matches a recipe you already have updates it.
Batches
batch_name and recipe_name are required, and the recipe has to be in Sporeline already. When every block in the batch is alike, give planned_block_count and the batch comes in with that many blocks, all at current_stage, with the inoculation_date and wet_weight_g you give. When the blocks differ, leave the count blank and list each block in the blocks cell, separated by semicolons, each written as label, entry stage, current stage, wet weight and inoculation date with a bar between them, like B001-001 | SUBSTRATE_PREP | FRUITING | 2480 | 2026-10-15. A part you leave empty takes the batch row’s value. A batch whose name is already in Sporeline is skipped, never added a second time.
Blocks
This sheet adds blocks to a batch that’s already in Sporeline, one you made in the app or imported earlier. batch_name is required and names that batch. Each row also needs a label_code or an external_ref, so the same block is never brought in twice. current_stage is where the block is today; blocks that are COMPLETED, CONTAMINATED or DISCARDED come in as history and don’t count as active.
Harvests
block and weight_g are required. block is the block’s label code, with its batch’s name in batch, or the block’s external_ref from your blocks sheet. weight_g is the fresh weight in grams. flush_number is 1 for the first flush, 2 for the second and so on; leave it out to take the block’s next flush, and then give the row an external_ref. harvested_at is the day it was picked, never later than today, and grade is one of your farm’s grades or blank. The block and flush are the match, so a flush that’s already recorded is skipped, never weighed in twice.
Lab items
kind and name are required, where kind is culture, agar_plate or liquid_culture. A culture names its strain by code or name from your catalog. A plate or liquid culture names its parent_ref, the external_ref of the culture or plate it came from, which has to be in an earlier row or an earlier import, and it needs a media_type. A liquid culture also needs a vessel_type and volume_ml. created_at is the date it was made; leave it blank for today. Give every lab item an external_ref if you can, because without one its name has to be unique.
Customers
name is required. type is one of the customer types in the dropdown. The contact columns are all optional. A row whose name matches a customer you already have updates that customer.
Orders
This sheet brings in open orders, ones that are planned or packed; shipped orders stay in your old system. customer, date and lines are required, and the customer has to be in Sporeline already (the Customers sheet first). Each row also needs an external_ref or an order_number, so the same order is never brought in twice. status is PLANNED or PACKED. lines goes in one cell, one line after another separated by semicolons. A line sold by weight is written species, strain, grade, grams and price per gram with a bar between them, like Pleurotus ostreatus | Blue Oyster | | 2000 | 0.02; leave the grade empty when you don’t grade. Sporeline gives each order its own number; your old number is kept as how a re-sent row is recognized.
Lots
This sheet brings in your lot-tracked batches as they stand today, your opening inventory. lot_code, recipe_name, quantity_on_hand and date are required. lot_code is the code you already print on the lot, and it’s kept exactly as you typed it. A code that’s already used by a lot in Sporeline is refused for that row rather than brought in as a second lot with the same code. date is the day the lot was started. quantity_on_hand is how many units you have today, and quantity_started is how many it started with; leave that blank when they’re the same. When fewer are on hand than were started, the lot comes in with the starting count and one adjustment down to today’s count, noted “imported opening balance”, so the lot’s history adds up.
item_type is one of your item types, like G1, G2 or BLOCK; leave it blank for an ordinary block lot. If your farm requires a generation for that type, fill in generation, the same as when you make the lot in the app. stage is the stage it’s in, in your words for that type, and blank means the type’s first stage. location is the name of a place already in Sporeline. strain is needed only when the recipe is one that takes any strain.
parent_refs is what the lot came from: the external_ref or code of a spawn lot, or the external_ref of a culture, plate or liquid culture, separated by semicolons when there’s more than one. Those have to be in Sporeline already, so this is the last sheet to import. A parent the import can’t find is reported on that row and nothing is written for it. The import never guesses which lot or culture you meant, so fix the ref and send the row again. Bringing a lot in never takes units out of its parents, since that history already happened.
Bringing a filled sheet in
The templates are made for your AI assistant once it’s connected to Sporeline. Attach the file or paste the rows and say what it is, like “This is my recipes sheet, please bring it into Sporeline.” The assistant shows you a preview of what it will add, update or skip before anything is written, and the import only goes ahead when you say so. Migrate your farm with an AI assistant walks through that, including undo.
The Upload CSV form on Settings → Import has its own, shorter list of columns for each kind. The Customers, Bag types and Blocks sheets upload there as they are, though that form ignores external_ref, and on the Blocks sheet batch_name has to be the batch’s name, because that form doesn’t look batches up by their external_ref. The other sheets have columns that form doesn’t read (a recipe’s bag type and ingredients, for one), so bring those in through your assistant. That form also doesn’t check whether a row is already in Sporeline, by external_ref, name or label. Uploading the same sheet there again adds every row again, a second customer or block with the same name, so upload each sheet there only once, and hand your assistant any sheet you expect to send more than once.