Optimization Guide

Shopify Cosmetics & Beauty Product Schema — INCI Ingredients, Skin Type & Certifications JSON-LD

AI shopping agents filtering "fragrance-free hyaluronic acid serum for sensitive skin," "cruelty-free SPF 50 tinted moisturizer," or "vegan lipstick warm nude" need machine-readable ingredient, certification, skin type, and shade data — none of which Shopify's default Product JSON-LD outputs. Beauty is one of the highest-velocity AI shopping query categories and the worst-served by default structured data.

TL;DR There is no schema.org CosmeticProduct type. Use Product with additionalProperty arrays for skin type, shade, finish, SPF, and INCI ingredients; hasCertification for cruelty-free/vegan/clean credentials; suggestedAudience for skin concern targeting; and legalDisclaimer for sunscreen drug facts. Store beauty attributes in a beauty.* metafield namespace and inject via Liquid. Consistent additionalProperty values across your catalog are critical — AI agents match by value, not free text.

Why Beauty Brands Are Invisible to AI Shopping Queries

Beauty AI queries are structurally multi-dimensional. A single product search — "SPF 30 moisturizer for oily skin fragrance-free" — contains four simultaneous filter criteria: SPF value, skin type compatibility, fragrance status, and product category. Answering it requires machine-readable data for all four dimensions simultaneously. Shopify's default JSON-LD outputs only name, price, availability, and brand — none of the beauty-specific signals.

The result is systematic exclusion. When ChatGPT Shopping, Perplexity Shopping, or Google AI Mode filters by skin type or certification, every beauty product without structured skin type data is eliminated from consideration regardless of how well the product would actually match. The exclusion is not because your product doesn't qualify — it's because the AI agent has no machine-readable signal to include it.

Schema.org has no dedicated beauty product type (unlike DietarySupplement for supplements or Vehicle for auto). The solution is a disciplined additionalProperty architecture on the standard Product type — using consistent, predictable property IDs and values that map to the dimensions AI beauty queries use for filtering.

Beauty AI query dimensions requiring structured data

Query dimension Example AI query Required additionalProperty Without schema
Skin type "moisturizer for oily skin" skinType: "Oily" Product not matched in skin-type filter
Skin concern "serum for hyperpigmentation" skinConcern: "Hyperpigmentation" Agent cannot match concern-specific query
Key ingredient "niacinamide serum 10%" activeIngredient: "Niacinamide 10%" Ingredient/concentration match fails
Certification "cruelty-free Leaping Bunny foundation" hasCertification Leaping Bunny Certified product excluded from cert filter
Fragrance status "fragrance-free moisturizer sensitive skin" fragranceFree: "Yes" Fragrance-free status undetectable
SPF value "SPF 50 daily moisturizer" spf: QuantitativeValue(50) SPF filter cannot apply numeric threshold
Shade / color "warm nude lipstick for medium skin" shadeFamily, undertone Shade match relies on title text only
Formula type "water-based foundation" formulaType: "Water-based" Formula not machine-readable

Beauty additionalProperty Architecture

Use additionalProperty arrays on the Product block to encode every beauty-specific signal. Each entry is a PropertyValue object with a consistent propertyID (the machine-readable key AI agents use for filtering) and a name / value pair for human-readable display.

Core additionalProperty values for skincare

propertyID name Example values AI query type matched
skinType Skin Type Oily, Dry, Combination, Normal, Sensitive, All Skin Types "moisturizer for combination skin"
skinConcern Skin Concern Acne, Aging, Hyperpigmentation, Redness, Dullness, Dryness, Pores "serum for acne-prone oily skin"
activeIngredient Key Ingredient Hyaluronic Acid 2%, Niacinamide 10%, Retinol 0.3%, Vitamin C 15% "niacinamide 10% serum for pores"
ingredientList Full INCI Ingredient List Full INCI string: "Aqua, Glycerin, Niacinamide..." "paraben-free hyaluronic serum"
formulaType Formula Type Water-based, Oil-based, Gel, Cream, Serum, Balm "water-based moisturizer for layering"
fragranceFree Fragrance Free Yes / No "fragrance-free sensitive skin moisturizer"
alcoholFree Alcohol Free Yes / No "alcohol-free toner for dry skin"
parabenFree Paraben Free Yes / No "paraben-free vitamin C serum"
siliconeFree Silicone Free Yes / No "silicone-free moisturizer for acne"
spf SPF QuantitativeValue: 15, 30, 50, 50+ "SPF 50 daily moisturizer"
uvProtection UV Protection Broad Spectrum, UVA, UVB "broad spectrum sunscreen"
productFinish Finish Matte, Dewy, Satin, Natural "matte finish moisturizer for oily skin"

Core additionalProperty values for colour cosmetics (makeup)

propertyID name Example values AI query type matched
shadeFamily Shade Family Red, Nude, Pink, Berry, Coral, Brown, Orange "nude lipstick warm undertone"
shadeHex Shade Hex Color #C97D6E, #D4A0A0 Color-picker filtered queries
undertone Undertone Warm, Cool, Neutral "lipstick for warm undertone"
coverageLevel Coverage Sheer, Light, Medium, Full "full coverage foundation"
formulaType Formula Liquid, Powder, Cream, Stick, Mousse "powder foundation for oily skin"
finishType Finish Matte, Luminous, Satin, Radiant, Natural "matte liquid foundation"

Complete JSON-LD Example: Niacinamide Serum (Skincare)

This example shows a fully marked-up skincare product — a niacinamide serum — with INCI ingredients, key active ingredients, skin type/concern targeting, and cruelty-free certification.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "10% Niacinamide + 1% Zinc Pore Minimizing Serum — 30ml",
  "description": "High-strength niacinamide serum with zinc for visibly reduced pores, balanced sebum production, and smoother skin texture. Fragrance-free, vegan, Leaping Bunny certified.",
  "url": "https://example.com/products/niacinamide-serum",
  "sku": "SKIN-NIA-30",
  "gtin13": "1234567890123",
  "image": [
    "https://example.com/cdn/shop/products/niacinamide-serum-front.jpg",
    "https://example.com/cdn/shop/products/niacinamide-serum-texture.jpg"
  ],
  "brand": { "@type": "Brand", "name": "ClearLab Skincare" },
  "offers": {
    "@type": "Offer",
    "price": "24.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "url": "https://example.com/products/niacinamide-serum"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "1284",
    "bestRating": "5"
  },
  "hasCertification": [
    {
      "@type": "Certification",
      "name": "Leaping Bunny Certified",
      "certificationIdentification": "LB-2025-08843",
      "issuedBy": {
        "@type": "Organization",
        "name": "Cruelty Free International",
        "url": "https://www.crueltyfreeinternational.org"
      },
      "certificationStatus": "CertificationActive"
    },
    {
      "@type": "Certification",
      "name": "Certified Vegan",
      "issuedBy": {
        "@type": "Organization",
        "name": "Vegan Action",
        "url": "https://vegan.org"
      },
      "certificationStatus": "CertificationActive"
    }
  ],
  "additionalProperty": [
    {
      "@type": "PropertyValue",
      "propertyID": "skinType",
      "name": "Skin Type",
      "value": "Oily, Combination, Normal"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "skinConcern",
      "name": "Skin Concern",
      "value": "Pores, Excess Sebum, Uneven Texture, Hyperpigmentation"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "activeIngredient",
      "name": "Key Ingredient",
      "value": "Niacinamide 10%"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "activeIngredient",
      "name": "Key Ingredient",
      "value": "Zinc PCA 1%"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "ingredientList",
      "name": "Full Ingredients (INCI)",
      "value": "Aqua, Niacinamide, Zinc PCA, Dimethyl Isosorbide, Tamarindus Indica Seed Gum, Xanthan Gum, Isoceteth-20, Pentylene Glycol, Sodium Hydroxide, Ethylhexylglycerin, Phenoxyethanol"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "formulaType",
      "name": "Formula Type",
      "value": "Water-based serum"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "fragranceFree",
      "name": "Fragrance Free",
      "value": "Yes"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "alcoholFree",
      "name": "Alcohol Free",
      "value": "Yes"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "parabenFree",
      "name": "Paraben Free",
      "value": "Yes"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "certificationStatus",
      "name": "Ethical Credentials",
      "value": "Cruelty-Free, Vegan"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "productSize",
      "name": "Size",
      "value": "30ml / 1 fl oz"
    }
  ]
}
</script>

Complete JSON-LD Example: Tinted SPF Moisturizer (Skincare + Makeup)

SPF products sold in the US that make sun protection claims are regulated as drugs by the FDA. This affects schema: add legalDisclaimer with the required drug facts notice, and use additionalProperty for SPF value with a QuantitativeValue.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Tinted Moisturizer SPF 40 — Shade 3N (Medium Neutral) — 40ml",
  "description": "Lightweight tinted moisturizer with SPF 40 broad-spectrum protection, buildable light coverage, and a natural satin finish. Mineral UV filters. Fragrance-free. Reef-safe formula.",
  "url": "https://example.com/products/tinted-moisturizer-spf40-3n",
  "sku": "TM-SPF40-3N",
  "color": "Medium Neutral",
  "brand": { "@type": "Brand", "name": "BareSun Beauty" },
  "offers": {
    "@type": "Offer",
    "price": "38.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  },
  "legalDisclaimer": "Drug Facts: Active ingredient: Zinc Oxide 15% (Sunscreen). Uses: Helps prevent sunburn. If used as directed with other sun protection measures, decreases the risk of skin cancer and early skin aging caused by the sun. Warnings: For external use only. When using this product keep out of eyes. Stop use and ask a doctor if rash occurs. Keep out of reach of children.",
  "additionalProperty": [
    {
      "@type": "PropertyValue",
      "propertyID": "spf",
      "name": "SPF",
      "value": {
        "@type": "QuantitativeValue",
        "value": 40,
        "unitCode": "P1",
        "unitText": "SPF"
      }
    },
    {
      "@type": "PropertyValue",
      "propertyID": "uvProtection",
      "name": "UV Protection",
      "value": "Broad Spectrum UVA/UVB"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "sunscreenType",
      "name": "Sunscreen Type",
      "value": "Mineral (Zinc Oxide)"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "reefSafe",
      "name": "Reef Safe",
      "value": "Yes — no oxybenzone or octinoxate"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "skinType",
      "name": "Skin Type",
      "value": "All Skin Types"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "coverageLevel",
      "name": "Coverage",
      "value": "Light to Medium (buildable)"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "finishType",
      "name": "Finish",
      "value": "Natural Satin"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "shadeFamily",
      "name": "Shade Family",
      "value": "Neutral"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "undertone",
      "name": "Undertone",
      "value": "Neutral"
    },
    {
      "@type": "PropertyValue",
      "propertyID": "fragranceFree",
      "name": "Fragrance Free",
      "value": "Yes"
    }
  ]
}
</script>

Beauty Certifications in Structured Data

Certifications are primary filters in beauty AI queries. Use hasCertification for the three most query-frequent beauty credential types:

Certification Issuing Organization AI queries matched additionalProperty fallback value
Leaping Bunny Cruelty Free International "cruelty-free moisturizer", "Leaping Bunny certified foundation" Cruelty-Free
PETA Beauty Without Bunnies PETA "PETA certified skincare", "cruelty-free lipstick" Cruelty-Free
Certified Vegan (Vegan Action) Vegan Action "vegan serum", "plant-based foundation" Vegan
The Vegan Society The Vegan Society "vegan lipstick UK", "vegan mascara" Vegan
COSMOS Organic (Ecocert) ECOCERT Greenlife "organic certified moisturizer", "COSMOS skincare" COSMOS Organic Certified
USDA Organic (personal care) USDA "USDA organic body lotion", "certified organic serum" USDA Organic Certified
Clean at Sephora Sephora "clean beauty serum Sephora" Clean Beauty
EWG Verified Environmental Working Group "EWG verified sunscreen", "clean SPF moisturizer" EWG Verified
Missing certifications
{
  "@type": "Product",
  "name": "Vegan Serum",
  "description": "Certified vegan
    and cruelty-free serum."
  // No hasCertification
  // No additionalProperty
  // AI: cannot verify claim
}
Full certification markup
{
  "@type": "Product",
  "hasCertification": [{
    "@type": "Certification",
    "name": "Leaping Bunny Certified",
    "issuedBy": {
      "name": "Cruelty Free International"
    }
  },{
    "@type": "Certification",
    "name": "Certified Vegan",
    "issuedBy": { "name": "Vegan Action" }
  }]
}

Shopify Metafield Architecture for Beauty

Store beauty-specific data in a beauty metafield namespace. Create these in Shopify Admin → Settings → Custom data → Products before building the Liquid snippet. The architecture below covers both skincare and colour cosmetics.

Metafield key Type Maps to Example value
beauty.skin_type Single-line text additionalProperty skinType Oily, Combination
beauty.skin_concern Single-line text additionalProperty skinConcern Pores, Acne, Hyperpigmentation
beauty.active_ingredients Multi-line text additionalProperty activeIngredient (one per line) Niacinamide 10% Zinc PCA 1%
beauty.inci_list Multi-line text additionalProperty ingredientList Full INCI string
beauty.fragrance_free Boolean additionalProperty fragranceFree true
beauty.spf Integer additionalProperty spf QuantitativeValue 40
beauty.certifications JSON hasCertification array [{"name":"Leaping Bunny Certified","id":"LB-2025-08843","issuer":"Cruelty Free International"}]
beauty.shade_family Single-line text additionalProperty shadeFamily Nude
beauty.undertone Single-line text additionalProperty undertone Warm
beauty.coverage_level Single-line text additionalProperty coverageLevel Full
beauty.finish_type Single-line text additionalProperty finishType Matte
beauty.legal_disclaimer Multi-line text legalDisclaimer FDA Drug Facts for SPF products

Shopify Liquid Snippet

This snippet outputs the full beauty-schema Product JSON-LD block from beauty.* metafields. Gate it on the product type to avoid outputting beauty-specific properties on non-beauty products.

{% comment %} beauty-schema.liquid — outputs beauty additionalProperty JSON-LD {% endcomment %}
{% assign is_beauty = false %}
{% if product.type == 'Skincare' or product.type == 'Makeup' or product.type == 'Sunscreen'
    or product.type == 'Foundation' or product.type == 'Serum' or product.type == 'Moisturizer' %}
  {% assign is_beauty = true %}
{% endif %}
{% if product.metafields.beauty.skin_type != blank %}
  {% assign is_beauty = true %}
{% endif %}

{% if is_beauty %}
{% assign b_skin_type   = product.metafields.beauty.skin_type %}
{% assign b_skin_concern = product.metafields.beauty.skin_concern %}
{% assign b_inci        = product.metafields.beauty.inci_list %}
{% assign b_spf         = product.metafields.beauty.spf %}
{% assign b_ff          = product.metafields.beauty.fragrance_free %}
{% assign b_disclaimer  = product.metafields.beauty.legal_disclaimer %}
{% assign b_certs_json  = product.metafields.beauty.certifications %}
{% assign b_shade_fam   = product.metafields.beauty.shade_family %}
{% assign b_undertone   = product.metafields.beauty.undertone %}
{% assign b_coverage    = product.metafields.beauty.coverage_level %}
{% assign b_finish      = product.metafields.beauty.finish_type %}
{% assign b_actives_raw = product.metafields.beauty.active_ingredients %}


{% endif %}

Save as snippets/beauty-schema.liquid and render from your product template: {% raw %}{% render 'beauty-schema' %}{% endraw %}.

Common Beauty Schema Mistakes

# Mistake Impact Fix
1 No additionalProperty blocks — only name and price Product excluded from all ingredient, skin type, certification, and SPF filter queries — the most common beauty AI query types Add additionalProperty array with at minimum skin type, key active ingredient, and fragrance status
2 Certifications only in product description text "Cruelty-free" in text requires AI agent to parse NLP claim; hasCertification is explicit and machine-readable Add hasCertification objects for every third-party cert held — Leaping Bunny, Vegan Action, COSMOS, EWG Verified
3 SPF value buried in product title only AI agent cannot filter by SPF numeric threshold ("SPF 50 or higher") from title text alone Add SPF additionalProperty with a QuantitativeValue so numeric comparison works
4 Inconsistent skin type values across catalog "Oily Skin", "oily skin", "for oily/combination" are treated as three different values; AI agents lose matching confidence Standardize on a controlled vocabulary: Oily, Dry, Combination, Normal, Sensitive, All Skin Types
5 Missing legalDisclaimer for SPF/sunscreen products Regulatory risk — FDA-regulated SPF products require drug facts; AI agents trained on compliant data deprioritize non-compliant pages Add full Drug Facts text to legalDisclaimer on all products with SPF claims

Frequently Asked Questions

Does schema.org have a dedicated type for cosmetics and beauty products?

No — there is no CosmeticProduct or BeautyProduct type in schema.org. Beauty products use the standard Product type augmented with additionalProperty arrays for skin type, active ingredients, shade, finish, and SPF; hasCertification for cruelty-free and vegan credentials; and legalDisclaimer for SPF drug facts. The key to AI visibility is consistent, predictable propertyID values across your catalog.

Should I list INCI ingredients in schema.org structured data?

Yes. Place the full INCI list in an additionalProperty block with propertyID: "ingredientList". Add individual entries with propertyID: "activeIngredient" for key actives (e.g., "Niacinamide 10%", "Hyaluronic Acid 2%"). This enables AI agents to match ingredient-specific queries — "fragrance-free hyaluronic serum", "retinol 0.3% night cream", "niacinamide for pores" — without relying on NLP text parsing.

How do I encode cruelty-free and vegan certifications in Shopify schema?

Use hasCertification on the Product block with a Certification object for each credential. Include name, issuedBy Organization, and optionally certificationIdentification. Also add parallel additionalProperty entries with propertyID: "certificationStatus" values like "Cruelty-Free", "Vegan" for AI agents that do not yet parse the hasCertification type. Both layers together provide the broadest AI agent coverage.

How do I express SPF value in schema for sunscreen products?

Use additionalProperty with propertyID: "spf" and a QuantitativeValue for the numeric SPF value. Add a separate property for protection type: "Broad Spectrum UVA/UVB" or "UVB only". For all SPF products sold in the US, add legalDisclaimer with the full FDA Drug Facts text — SPF claims are regulated drug claims and AI agents trained on FDA-compliant data expect the disclaimer to be present.

How do I handle shade variants (lipstick colors, foundation shades) in beauty schema?

Use a ProductGroup with hasVariant containing individual Product entries for each shade. Each variant Product should set color to the shade name and include additionalProperty entries for shadeFamily, shadeHex, undertone, and coverageLevel. This allows AI agents to match "warm nude lipstick for medium skin" against shade, family, and undertone data rather than guessing from the SKU name. See the ProductGroup hasVariant schema guide for the full implementation pattern.

Related Resources