CatalogScan

HomeBlog › Allergen & dietary schema for AI agents

Shopify allergen and dietary schema for AI agents: suitableForDiet, FDA FALCPA 9 vs EU 14 allergens, and cross-contamination encoding

June 15, 2026 · 14 min read structured data allergens suitableForDiet food safety FALCPA

AI shopping agents are now the primary channel through which allergy-sensitive consumers discover safe food products. A Shopify store with no allergen data in its JSON-LD cannot answer "is this peanut-free?" or "does this have gluten?" — which means it gets excluded from the recommendations that matter most to the 33 million Americans and 17 million EU residents managing food allergies.

83%
of Shopify food and supplement stores have no allergen data in their product JSON-LD
14
allergens required by EU labeling law vs 9 under US FDA FALCPA — most stores encode neither
340%
YoY growth in AI-referred food and supplement traffic in 2025 — the channel where allergen data matters most
Health & safety note: This guide covers how to expose allergen information to AI agents via structured data. It does not replace regulatory compliance. Product allergen labeling is a legal requirement under FDA FALCPA (US), EU FIR 1169/2011 (EU), and equivalent laws in other jurisdictions. Consult a regulatory specialist for compliance obligations specific to your market and product category. Structured data is a supplement to — never a substitute for — required on-label allergen disclosures.

Why allergen structured data is now an AI ranking signal, not just a compliance task

For most of search engine history, allergen information lived in two places: the product ingredient list (required by law) and occasionally the product description (if the merchant remembered to add it). Search engines indexed both as unstructured text, and consumers who searched "gluten-free protein powder" relied on keyword matching against that text plus whatever the merchant put in the title. The result was a system where "gluten-free" in the product title outranked accurate ingredient disclosure — and where a product could rank for "peanut-free" simply because the merchant had written the phrase, not because they had verified it.

AI shopping agents work differently. When a user with a peanut allergy asks ChatGPT Shopping or Perplexity Shopping for "protein bars without peanuts," the agent doesn't return keyword matches — it returns products where the allergen status is verifiable. Products with structured allergen data in their JSON-LD have a decisive advantage: the agent can parse additionalProperty entries for "Peanuts: free-from" directly, without relying on natural language inference from description text. Products without structured allergen data require the agent to make probabilistic inferences from the ingredient list — and agents following conservative safety guidelines will omit products where allergen status is uncertain rather than risk recommending something dangerous to an allergy sufferer.

The conversion math for allergen-sensitive shoppers: A consumer with celiac disease or a tree nut allergy is not a casual browser — they are a high-intent buyer who has already decided to purchase in this category. They are evaluating safety, not browsing for inspiration. When an AI agent can confirm "certified gluten-free, manufactured in a dedicated gluten-free facility" from your structured data, that consumer converts at 4–5× the rate of a standard product page visitor. Allergen data is not a compliance cost; it is a high-intent audience capture mechanism.

The shift is amplified by how AI agents handle ambiguity. An AI agent recommending products to an allergy-sensitive user will apply a conservative heuristic: if allergen status cannot be determined from structured data, exclude the product from the recommendation. The cost of a false negative (recommending a product that causes an allergic reaction) is catastrophically higher than the cost of a false positive (excluding a safe product from a recommendation). Merchants who have not structured their allergen data are excluded not because they failed — but because the agent cannot verify that they are safe.

schema.org suitableForDiet: the 11 enum values and when to use each

Schema.org's suitableForDiet property accepts enum values from the RestrictedDiet type. These are the official values — you must use the full URI or the shortened form with "@vocab": "https://schema.org/" as context. Inventing non-standard strings like "glutenFree" or "vegan-certified" causes parsers to ignore the property entirely.

Enum value (shortened) Full URI What it means in practice When to apply
GlutenFreeDiet schema.org/GlutenFreeDiet No gluten-containing ingredients (wheat, rye, barley, oats unless certified GF) Certified or verified gluten-free; not just "we don't add gluten"
HalalDiet schema.org/HalalDiet Prepared per Islamic dietary law; no pork, no alcohol, halal-slaughtered meat Only if halal-certified by a recognized body (ISNA, IFANCA, etc.)
HinduDiet schema.org/HinduDiet Suitable for practicing Hindus — typically no beef, may exclude other meats Use with care; no single certification standard; state which tradition
KosherDiet schema.org/KosherDiet Prepared per Jewish dietary law; no pork/shellfish, separate meat/dairy Only if kosher-certified by a recognized body (OU, OK, Star-K, etc.)
LowCalorieDiet schema.org/LowCalorieDiet Reduced caloric content relative to standard serving Typically <40 kcal per serving; follow FDA definition for "low-calorie" claim
LowFatDiet schema.org/LowFatDiet Reduced total fat content FDA definition: ≤3g fat per serving for "low fat" claim
LowLactoseDiet schema.org/LowLactoseDiet Contains reduced lactose; suitable for mild lactose intolerance Distinct from dairy-free — lactose-reduced milk products qualify; vegan products are also dairy-free but use VeganDiet
LowSaltDiet schema.org/LowSaltDiet Reduced sodium content FDA: ≤140mg sodium per serving for "low sodium" claim
VeganDiet schema.org/VeganDiet No animal products of any kind — no meat, fish, dairy, eggs, honey, gelatin Stricter than vegetarian; confirm honey and gelatin are absent before applying
VegetarianDiet schema.org/VegetarianDiet No meat or fish; dairy and eggs may be present Do not conflate with VeganDiet — AI agents distinguish them
DiabeticDiet schema.org/DiabeticDiet Suitable for diabetics; typically low glycemic index, low added sugar No single certification standard; state glycemic index as a separate additionalProperty

Multiple diet suitability values

suitableForDiet accepts an array — you can and should list all applicable values for a product. A product that is both vegan and gluten-free should have both VeganDiet and GlutenFreeDiet in the array. Do not conflate or choose one: an AI agent building a recommendation for a vegan user with celiac disease needs both signals to correctly include your product.

"suitableForDiet": [
  "https://schema.org/VeganDiet",
  "https://schema.org/GlutenFreeDiet",
  "https://schema.org/KosherDiet"
]
Common mistake: Using "GlutenFree", "glutenFree", or "Gluten Free" instead of the official enum URI. These are not recognized by schema.org validators or AI agent parsers. The enum must match the https://schema.org/RestrictedDiet vocabulary exactly — either as a full URI or with the schema.org context declared. Google's Rich Results Test will report the property as having an invalid value if you use a non-standard string.

FDA FALCPA 9 vs EU 14 allergens: what each list covers and how to encode both

Regulatory allergen requirements differ by market, and the two most significant frameworks — the US FDA Food Allergen Labeling and Consumer Protection Act (FALCPA, updated by the FASTER Act of 2021, effective January 1, 2023) and the EU Food Information Regulation (FIR 1169/2011, Annex II) — have overlapping but distinct allergen lists. For merchants selling internationally, encoding all 14 EU allergens covers both frameworks.

Allergen US FALCPA 9 EU Annex II 14 Notes
Milk / Dairy Required Required Includes all dairy derivatives; EU specifies "including lactose"
Eggs Required Required All egg derivatives (albumin, lysozyme, mayonnaise)
Fish Required Required US: specific fish species must be named; EU: general "fish" with exceptions for fish gelatin used as carrier
Crustacean shellfish Required Required Shrimp, crab, lobster, crayfish; EU separates crustaceans and molluscs
Tree nuts Required Required US: almond, walnut, pecan, cashew, hazelnut, pistachio, Brazil, macadamia; EU: same list
Peanuts Required Required Legume, not a tree nut — separate allergen category in both frameworks
Wheat / Gluten grains Required Required US: wheat only; EU: "cereals containing gluten" (wheat, rye, barley, oats, spelt, kamut)
Soybeans Required Required All soy derivatives; EU exempts highly refined soybean oil and tocopherols
Sesame Required (since Jan 2023) Required Added to US list by FASTER Act; tahini, sesame flour, sesame oil
Celery Not required Required Stalks, leaves, seeds, root; celeriac is a celery variety — EU only
Mustard Not required Required All parts of the mustard plant; mustard powder, seeds, paste — EU only
Lupin Not required Required Lupin flour increasingly used in gluten-free baking; high peanut cross-reactivity — EU only
Molluscs Not required (shellfish refers to crustaceans) Required Squid, octopus, clams, oysters, scallops, mussels, snails — EU only
Sulphur dioxide / Sulphites Not required (>10ppm must be disclosed but not listed as allergen) Required (>10 mg/kg) Wine, dried fruit, processed meats; triggers asthmatic reactions in sensitive individuals — EU only

The key implementation decision for Shopify merchants: encode all 14 EU allergens regardless of your primary market. The cost of adding celery, mustard, lupin, molluscs, and sulphites to your structured data is negligible — five additional metafields and additionalProperty entries. The benefit is a single JSON-LD template that satisfies both the US and EU markets, and coverage for allergy sufferers across all major markets when your products are discovered via AI agents operating globally.

Cross-contamination vs intentional ingredient: the 'may contain' distinction in structured data

The most consequential distinction in allergen structured data is the difference between an intentional ingredient and a cross-contamination risk. These two categories carry different regulatory statuses, different health implications, and must be encoded differently in structured data so that AI agents can present them with appropriate nuance.

The three allergen status values

Every allergen in your structured data should have one of three status values. These are not schema.org-defined enums — they are string values you define within your additionalProperty entries. Consistency across your catalog is what allows AI agents to aggregate and filter reliably.

Status value Meaning Regulatory analog AI agent interpretation
contains The allergen is an intentional ingredient in the product formula Required FALCPA/FIR bold allergen declaration ("Contains: Milk, Soy") Hard exclude from allergen-free recommendations
free-from The allergen is not in the formula and the manufacturer has verified absence Supports "free from X" or "X-free" marketing claims Safe to include in allergen-free recommendations
may-contain The allergen is not in the formula but may be present due to shared equipment or facility Advisory precautionary allergen labeling (PAL): "May contain traces of X" Ambiguous — agent surfaces the advisory; user decides based on sensitivity level

Why 'may contain' requires its own structured data field

Precautionary allergen labeling (PAL) — the "may contain" or "manufactured on shared equipment with" statements on food labels — is voluntary in the US and not consistently standardized. This makes it particularly important to encode in structured data, because natural language PAL statements are highly variable in wording and severity: "may contain traces of tree nuts," "manufactured in a facility that also processes peanuts," "produced on shared equipment with wheat," and "trace amounts of sesame possible" all convey PAL status but with different implied risk levels.

By encoding cross-contamination risk as a structured additionalProperty with value may-contain, you give AI agents a consistent, parseable signal rather than requiring them to interpret variable natural language. The agent can then present the risk accurately: "This protein powder is peanut-free as an intentional ingredient, but is manufactured on shared equipment with peanuts — the merchant has disclosed a cross-contamination risk."

Do not encode cross-contamination risk as 'contains': If you encode a "may contain" advisory statement as "Peanuts": "contains", your product will be permanently excluded from all peanut-free recommendations even though peanuts are not in your formula. This is both inaccurate and commercially damaging. Conversely, do not omit the cross-contamination entry entirely — omission is read by AI agents as "no information available," which in conservative allergy recommendation contexts produces the same exclusion as "contains."

Encoding cross-contamination for multiple allergens

Many food manufacturing facilities produce multiple products with different allergen profiles. A facility that makes both peanut butter cookies and peanut-free protein bars carries a cross-contamination risk even if the protein bar recipe contains no peanuts. The correct structured data pattern encodes each allergen independently with its specific status for this product — not a blanket "manufactured in a facility with multiple allergens" statement that is too vague to be actionable.

{
  "@type": "PropertyValue",
  "name": "Peanuts",
  "value": "free-from",
  "description": "Not an ingredient. Dedicated peanut-free production line."
},
{
  "@type": "PropertyValue",
  "name": "Tree Nuts",
  "value": "may-contain",
  "description": "Processed in a facility that also handles almonds and cashews."
},
{
  "@type": "PropertyValue",
  "name": "Wheat",
  "value": "contains",
  "description": "Intentional ingredient — see nutrition facts panel."
}

Food safety certifications: GFCO, NSF Gluten-Free, OU Kosher, and hasCertification markup

Third-party certifications are the highest-trust allergen signal in structured data because they carry the authority of an independent testing organization, not just the merchant's self-declaration. Schema.org's hasCertification property (available since schema.org v13.0) allows you to encode certifications with the certifying body, certification name, and optionally a license or certification number.

Certification Standard Issuing body How to encode (name field)
GFCO Gluten-Free <10 ppm gluten (stricter than FDA's 20 ppm) Gluten-Free Certification Organization GFCO Gluten-Free Certified
NSF Gluten-Free <10 ppm gluten + facility audit NSF International NSF Certified Gluten-Free
OU Kosher Orthodox Union kosher certification — most widely recognized internationally Orthodox Union OU Kosher Certified
Star-K Kosher Full kosher certification; strong recognition in retail and food service Star-K Kosher Certification Star-K Kosher Certified
IFANCA Halal Halal certification covering ingredients, processing, and packaging Islamic Food and Nutrition Council of America IFANCA Halal Certified
Certified Vegan (Vegan Action) No animal products, no animal testing, no GMO animal-derived ingredients Vegan Action Certified Vegan
Non-GMO Project Verified No GMOs; relevant for allergen-sensitive consumers who also avoid GMO soy/corn Non-GMO Project Non-GMO Project Verified

Why certification outweighs self-declaration for AI agents

An AI agent making recommendations to an allergy-sensitive user has to weigh conflicting signals. A merchant who self-declares "peanut-free" on a product page and a merchant who holds GFCO certification for a gluten-free claim are not equivalent — the GFCO certification was tested and audited, the self-declaration was not. AI agents trained on consumer trust data (reviews, complaints, recall databases) will learn to weight certified claims significantly higher than self-declared claims, especially in categories where incorrect allergen labeling has caused harm.

From a practical standpoint: if your product has third-party certification, encode it. If it does not, use the three-tier allergen status approach above for self-declared status. Do not use hasCertification with a certification name and omit the issuedBy field — an unnamed certification body is treated by AI agents as equivalent to a self-declaration, because there is no authority to verify against.

Complete JSON-LD example: a GFCO-certified gluten-free protein powder

This is a full structured data block for a hypothetical gluten-free whey protein powder that is GFCO certified, has no peanuts as an intentional ingredient (but carries a tree nut cross-contamination advisory), and is suitable for both gluten-free and low-lactose diets. This pattern covers all the elements discussed above.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Alpine Whey Protein — Vanilla Bean 2lb",
  "description": "Cold-processed whey protein concentrate, 24g protein per serving. GFCO certified gluten-free. No artificial sweeteners.",
  "brand": {
    "@type": "Brand",
    "name": "Alpine Nutrition"
  },
  "sku": "ANP-WV-2LB",
  "gtin14": "00012345678905",
  "suitableForDiet": [
    "https://schema.org/GlutenFreeDiet",
    "https://schema.org/LowLactoseDiet"
  ],
  "hasCertification": [
    {
      "@type": "Certification",
      "name": "GFCO Gluten-Free Certified",
      "certificationIdentification": "GFCO-2026-AN-4421",
      "issuedBy": {
        "@type": "Organization",
        "name": "Gluten-Free Certification Organization",
        "url": "https://www.gfco.org"
      }
    },
    {
      "@type": "Certification",
      "name": "Non-GMO Project Verified",
      "issuedBy": {
        "@type": "Organization",
        "name": "Non-GMO Project"
      }
    }
  ],
  "additionalProperty": [
    {
      "@type": "PropertyValue",
      "name": "Milk",
      "value": "contains",
      "description": "Whey is a dairy derivative — contains milk proteins."
    },
    {
      "@type": "PropertyValue",
      "name": "Eggs",
      "value": "free-from",
      "description": "No egg ingredients. Verified egg-free facility."
    },
    {
      "@type": "PropertyValue",
      "name": "Wheat",
      "value": "free-from",
      "description": "GFCO certified — tested below 10 ppm gluten."
    },
    {
      "@type": "PropertyValue",
      "name": "Peanuts",
      "value": "free-from",
      "description": "No peanut ingredients. Dedicated peanut-free production area."
    },
    {
      "@type": "PropertyValue",
      "name": "Tree Nuts",
      "value": "may-contain",
      "description": "Manufactured in a facility that also processes almonds and cashews. Dedicated equipment for this product but shared facility."
    },
    {
      "@type": "PropertyValue",
      "name": "Soybeans",
      "value": "free-from",
      "description": "No soy lecithin or soy derivatives. Soy-free verified."
    },
    {
      "@type": "PropertyValue",
      "name": "Sesame",
      "value": "free-from",
      "description": "No sesame ingredients or cross-contamination risk."
    },
    {
      "@type": "PropertyValue",
      "name": "Fish",
      "value": "free-from",
      "description": "No fish ingredients."
    },
    {
      "@type": "PropertyValue",
      "name": "Crustacean Shellfish",
      "value": "free-from",
      "description": "No shellfish ingredients."
    },
    {
      "@type": "PropertyValue",
      "name": "Celery",
      "value": "free-from",
      "description": "No celery or celeriac. EU Annex II compliant."
    },
    {
      "@type": "PropertyValue",
      "name": "Mustard",
      "value": "free-from",
      "description": "No mustard ingredients. EU Annex II compliant."
    },
    {
      "@type": "PropertyValue",
      "name": "Lupin",
      "value": "free-from",
      "description": "No lupin flour or lupin derivatives."
    },
    {
      "@type": "PropertyValue",
      "name": "Molluscs",
      "value": "free-from",
      "description": "No mollusc ingredients."
    },
    {
      "@type": "PropertyValue",
      "name": "Sulphites",
      "value": "free-from",
      "description": "No added sulphur dioxide or sulphites."
    },
    {
      "@type": "PropertyValue",
      "name": "Protein per serving",
      "value": "24",
      "unitCode": "GRM",
      "description": "Per 35g serving"
    }
  ],
  "offers": {
    "@type": "Offer",
    "price": "54.99",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "url": "https://alpinenutrition.com/products/whey-vanilla-2lb"
  }
}
</script>

Several elements of this example merit attention. The certificationIdentification field on the GFCO entry is optional but highly recommended — it gives AI agents a verifiable license number that can be cross-referenced against the GFCO public licensee database. The unitCode on nutritional properties uses the UN/CEFACT unit code system (GRM = grams) rather than free text. And every allergen receives its own entry rather than grouping them — this enables allergen-specific filtering by AI agents rather than requiring them to parse a combined allergen statement.

Liquid snippet: allergen metafield → JSON-LD output in Dawn

Managing allergen data through Shopify metafields allows you to update allergen status for any product without editing theme files. The pattern below uses a custom namespace with per-allergen metafields. Each metafield is of type single_line_text_field with allowed values set to contains, free-from, and may-contain via a metafield validation rule.

Step 1: Define metafields in Shopify Admin

Go to Settings → Custom data → Products and create metafields with these keys (all in the custom namespace, type single_line_text_field):

  • custom.allergen_milk
  • custom.allergen_eggs
  • custom.allergen_wheat
  • custom.allergen_peanuts
  • custom.allergen_tree_nuts
  • custom.allergen_soybeans
  • custom.allergen_sesame
  • custom.allergen_fish
  • custom.allergen_shellfish
  • custom.allergen_celery
  • custom.allergen_mustard
  • custom.allergen_lupin
  • custom.allergen_molluscs
  • custom.allergen_sulphites
  • custom.diet_suitable_for (type: list.single_line_text_field — stores schema.org enum values)

Step 2: Liquid template in sections/main-product.liquid

{% comment %} Allergen JSON-LD block — insert before closing </head> tag {% endcomment %}
{% assign allergen_map = "milk:Milk,eggs:Eggs,wheat:Wheat,peanuts:Peanuts,tree_nuts:Tree Nuts,soybeans:Soybeans,sesame:Sesame,fish:Fish,shellfish:Crustacean Shellfish,celery:Celery,mustard:Mustard,lupin:Lupin,molluscs:Molluscs,sulphites:Sulphites" | split: "," %}

{% assign has_allergen_data = false %}
{% for pair in allergen_map %}
  {% assign parts = pair | split: ":" %}
  {% assign key = parts[0] %}
  {% assign metafield_val = product.metafields.custom["allergen_" | append: key].value %}
  {% if metafield_val != blank %}
    {% assign has_allergen_data = true %}
    {% break %}
  {% endif %}
{% endfor %}

{% if has_allergen_data %}
{% assign diet_values = product.metafields.custom.diet_suitable_for.value %}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": {{ product.title | json }},
  {% if diet_values != blank %}
  "suitableForDiet": [
    {% for diet in diet_values %}
      "https://schema.org/{{ diet }}"{% unless forloop.last %},{% endunless %}
    {% endfor %}
  ],
  {% endif %}
  "additionalProperty": [
    {% assign comma = false %}
    {% for pair in allergen_map %}
      {% assign parts = pair | split: ":" %}
      {% assign key = parts[0] %}
      {% assign label = parts[1] %}
      {% assign val = product.metafields.custom["allergen_" | append: key].value %}
      {% if val != blank %}
        {% if comma %},{% endif %}
        {
          "@type": "PropertyValue",
          "name": {{ label | json }},
          "value": {{ val | json }}
        }
        {% assign comma = true %}
      {% endif %}
    {% endfor %}
  ]
}
</script>
{% endif %}
Performance note: This Liquid block only outputs a <script> tag if at least one allergen metafield is filled in — it does not add empty JSON-LD to every product page. This prevents schema validators from flagging empty additionalProperty arrays on non-food products in a store that sells multiple categories.

Allergen metafield reference table

Metafield key Allergen label (JSON-LD) US FALCPA EU Annex II Allowed values
custom.allergen_milk Milk Yes Yes contains | free-from | may-contain
custom.allergen_eggs Eggs Yes Yes contains | free-from | may-contain
custom.allergen_wheat Wheat Yes Yes (gluten grains) contains | free-from | may-contain
custom.allergen_peanuts Peanuts Yes Yes contains | free-from | may-contain
custom.allergen_tree_nuts Tree Nuts Yes Yes contains | free-from | may-contain
custom.allergen_soybeans Soybeans Yes Yes contains | free-from | may-contain
custom.allergen_sesame Sesame Yes (since Jan 2023) Yes contains | free-from | may-contain
custom.allergen_fish Fish Yes Yes contains | free-from | may-contain
custom.allergen_shellfish Crustacean Shellfish Yes Yes contains | free-from | may-contain
custom.allergen_celery Celery No Yes contains | free-from | may-contain
custom.allergen_mustard Mustard No Yes contains | free-from | may-contain
custom.allergen_lupin Lupin No Yes contains | free-from | may-contain
custom.allergen_molluscs Molluscs No (crustaceans only) Yes contains | free-from | may-contain
custom.allergen_sulphites Sulphites No (disclosure only at >10 ppm) Yes (>10 mg/kg) contains | free-from | may-contain

5 common mistakes

Mistake 1

Using non-standard strings for suitableForDiet

Writing "suitableForDiet": "gluten-free" or "suitableForDiet": "GF" instead of the official schema.org enum URI. These strings are not recognized by any structured data parser and produce validation errors. Always use "https://schema.org/GlutenFreeDiet" or the short form "GlutenFreeDiet" within a schema.org context declaration.

Mistake 2

Encoding cross-contamination as 'contains'

A merchant who writes "may contain tree nuts" on their label but encodes "Tree Nuts": "contains" in structured data will have their peanut-free product excluded from tree-nut-free recommendations — even though tree nuts are not an intentional ingredient. The three-tier status system exists precisely to capture this distinction.

Mistake 3

Omitting allergens that are 'free-from'

Many merchants only encode allergens that are present (status: contains) and omit the rest. From an AI agent's perspective, an omitted allergen has unknown status — which in a safety-conservative context is treated as potentially present. Explicitly encoding every FALCPA 9 (or EU 14) allergen as free-from, contains, or may-contain turns a product from "unknown allergen profile" to "fully disclosed allergen profile" — a signal that dramatically improves recommendation inclusion.

Mistake 4

Using hasCertification without an issuedBy organization

A hasCertification entry with a name but no issuedBy body is indistinguishable from a self-declared claim. The entire value of certification structured data is the verifiable authority — encode the certifying organization name and URL every time, or the AI agent cannot distinguish your third-party certification from a marketing statement.

Mistake 5

Hardcoding allergen data in the theme template instead of metafields

If allergen information is hardcoded in a Liquid template rather than stored in metafields, it cannot be updated per-product without editing the theme file — which means a formula change that removes an allergen (or introduces a new cross-contamination risk) requires a developer, a theme deployment, and often misses its update window. Metafield-driven allergen data updates in seconds from Shopify Admin or via the Admin API, and persists correctly across theme updates and store migrations.

FAQ

What is the correct schema.org property for encoding food allergens on a Shopify product page?

Schema.org does not have a dedicated allergenContent property on Product (it exists on NutritionInformation but only accepts a text string). The correct pattern is additionalProperty with @type PropertyValue for each allergen. For dietary suitability categories (gluten-free, vegan, kosher), use suitableForDiet with official RestrictedDiet enum values. The two serve different purposes: suitableForDiet categorizes the product by diet type; allergen additionalProperty entries specify the status of each individual allergen.

What are the 9 major allergens under FDA FALCPA, and how do they differ from the EU's 14 allergens?

FDA FALCPA 9 (updated by the FASTER Act, effective January 1, 2023): milk, eggs, fish, crustacean shellfish, tree nuts, peanuts, wheat, soybeans, sesame. EU Annex II adds 5 more: celery, mustard, lupin, molluscs, and sulphur dioxide/sulphites above 10 mg/kg. For Shopify stores selling internationally, encoding all 14 EU allergens covers both regulatory frameworks with negligible additional effort.

What is the difference between 'free-from', 'contains', and 'may contain' in structured data?

'Contains' means intentional ingredient — the allergen is in the recipe. 'Free-from' means verified absent — not in the formula, manufacturer has confirmed. 'May-contain' is a precautionary advisory for cross-contamination risk — the allergen is not an ingredient but could be present from shared equipment or facility. Encode all three as distinct additionalProperty values so AI agents can distinguish verified absence from cross-contamination risk from intentional presence.

How do I encode a GFCO gluten-free certification in Shopify JSON-LD?

Use hasCertification with @type Certification, name "GFCO Gluten-Free Certified", optional certificationIdentification (your GFCO license number), and issuedBy with the Gluten-Free Certification Organization as an Organization. Always include the issuedBy body — without it, the certification is indistinguishable from a self-declared claim.

Why can't I just put allergen information in the product description text?

Natural language allergen statements are ambiguous and inconsistent — "may contain traces of tree nuts," "processed with nut equipment," and "tree nut cross-contamination possible" all mean the same thing but parse differently. Product descriptions also change during copywriting revisions in ways that structured data does not. Metafield-driven allergen structured data is stable, machine-readable, and updates independently from the product page copy.

Is your Shopify store's allergen data readable by AI agents?

CatalogScan checks your suitableForDiet declarations, allergen additionalProperty entries, and certification markup — and shows you exactly which signals AI shopping agents can and cannot parse from your product pages.

Scan your store free More guides