An allergen matrix is a grid with your products down the side and the major food allergens across the top, with a mark wherever a product contains one. In the US that's FDA's nine: milk, eggs, fish, Crustacean shellfish, tree nuts, peanuts, wheat, soybeans and sesame. The reliable way to build one is from the bottom up: mark the allergens in each ingredient, list the ingredients in each recipe, and let the product rows work themselves out, so changing an ingredient changes every product that uses it. Below is how, a filled-in matrix for five products, and a free Excel template that does the working out.
The short version
- Start with ingredients, not products. Take each one's allergens from the supplier's label or spec sheet.
- List every ingredient in every recipe, sub-recipes and seasonings included.
- A product contains an allergen if any of its ingredients does. Let the spreadsheet do that part.
- Check the matrix against your labels, and again whenever a supplier or a recipe changes.
- The matrix covers what's in the recipe. Cross-contact on shared equipment is a separate question.
- TaroStack keeps the recipes, the deliveries and the batches the matrix depends on honest. More below.
The nine major allergens
The Food Allergen Labeling and Consumer Protection Act of 2004 named eight major food allergens, and the FASTER Act made sesame the ninth from January 1, 2023 (FDA, Food Allergies). In January 2025, FDA's revised guidance changed two things a small producer will notice: milk and eggs now include milk from goats and sheep and eggs from birds other than chickens, and several foods, including coconut, are no longer on the tree nut list (FDA, allergen labeling FAQ). That's why the template has no coconut column, and why an older matrix that marks coconut milk as a tree nut is out of date.
What the label has to say
A matrix earns its keep at the label. The law requires the food source of every major allergen to be named at least once, either in parentheses after the ingredient, such as "flour (wheat)", or in a "Contains" statement next to the ingredient list, such as "Contains wheat, milk, and soy." Tree nuts must be named by type (macadamia, not "tree nuts"), and fish and Crustacean shellfish by species (FDA, Food Allergies).
"May contain" statements aren't required by law. FDA says they must be truthful and not misleading and can't stand in for good manufacturing practice. This is general information, not legal advice; FDA's current requirements and your food safety plan have the last word.
The matrix, filled in
Windward Roots, the made-up taro business I use in these examples, makes five products. The ingredient rows, with a Y for each allergen, are the only thing anyone types by hand:
| Ingredient | Allergens |
|---|---|
| Bread flour | Wheat |
| Butter | Milk |
| Eggs | Eggs |
| Macadamia nuts | Tree nuts |
| Sesame seeds | Sesame |
| Soy sauce | Soybeans, wheat |
| Bonito flakes | Fish |
| Taro, coconut milk, coconut oil, sugars, yeast, salt, nori | None of the nine |
Each product's recipe is listed underneath, and the matrix reads the recipes:
| Product | Milk | Eggs | Fish | Tree nuts | Wheat | Soy | Sesame | Contains |
|---|---|---|---|---|---|---|---|---|
| Taro sweet bread | Y | Y | Milk, Wheat | |||||
| Kūlolo | None of the nine | |||||||
| Taro chips | None of the nine | |||||||
| Macadamia taro cookies | Y | Y | Y | Y | Milk, Eggs, Tree nuts, Wheat | |||
| Furikake taro chips | Y | Y | Y | Y | Fish, Wheat, Soybeans, Sesame |
(Crustacean shellfish and peanuts are in the template too; none of these products has them.)
The furikake chips show why seasonings matter. The chips themselves are taro, oil and salt; the seasoning brings four allergens with it, and the wheat comes from the soy sauce, which is easy to miss: most soy sauce is brewed with wheat. If Windward Roots switched to a wheat-free soy sauce, it would change the soy sauce's row, and the chips would lose the wheat by themselves. That's the point of building from ingredients: one fact, typed once.
The plain taro chips are the other lesson. On paper they contain none of the nine. If they're tossed in the same drum as the furikake chips, they can pick up sesame, soy, wheat and fish on the way. The matrix can't see that; your cleaning between runs, and your food safety plan, have to.
Get the template
Download the allergen matrix template. It has the Ingredients tab with the nine allergens, the Recipes tab that fills itself in, and the Matrix tab with a "Contains" list to check your labels against. A misspelled ingredient shows as "?" rather than silently counting as allergen-free. It's an ordinary Excel file with no macros, and it works in Google Sheets, LibreOffice and Numbers.
Recipes tab =IF(INDEX(Ingredients!C:C, MATCH($B2, Ingredients!$A:$A, 0))="Y", "Y", "")
Matrix tab =IF(COUNTIFS(Recipes!$A:$A, $A2, Recipes!C:C, "Y")>0, "Y", "")
Where this stops working
A matrix is only as current as the last time someone updated it, and it goes out of date in three quiet ways. A recipe changes in the kitchen and not in the spreadsheet. A supplier substitutes a product: say you'd switched to a wheat-free soy sauce and relabeled, and one week the wholesaler is out of it and sends a regular one. Same shelf, same color, and your label is wrong from that delivery on. Or a supplier's own ingredient turns out to contain something it didn't declare, and the question becomes which of your batches used that lot and who bought them. None of those show up in the matrix. They show up in the recipes, the receiving and the batch records.
How TaroStack does it
TaroStack doesn't work out allergens and doesn't print allergen statements or labels; a matrix like this one does that. What it does is keep honest the three things your matrix depends on.
The recipes: recipes in TaroStack are versioned, with their sub-recipes, so a change in the kitchen is a new version with the old one kept, and that's your cue to update the matrix. The deliveries: a receipt can carry your own checklist field, "label matches our spec, allergens unchanged", answered at the door, and a delivery can be held for inspection so the substituted soy sauce doesn't reach a batch before someone reads its label. The batches: recording a batch notes which ingredient lots went in, so if a supplier announces an undeclared allergen in one lot, the recall report shows every batch it went into and every customer who received them, and a batch record's checklist can carry the changeover check between the furikake run and the plain chips, with initials.
Receiving, lots and recalls are on every plan, from $49 a month; recipes and batch records are on Standard at $99. The first 30 days are free, and your recipes and items import from a spreadsheet. If you'd like a hand setting up, ask, and we'll do it with you.
More on the receiving check in the food receiving log, on following an ingredient lot into batches in track ingredients by lot, and on what to do when it goes wrong in the recall plan example.
