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.
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 |
{
"@type": "Product",
"name": "Vegan Serum",
"description": "Certified vegan
and cruelty-free serum."
// No hasCertification
// No additionalProperty
// AI: cannot verify claim
}
{
"@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
- Shopify Dietary Supplement Schema — DietarySupplement JSON-LD for Health & Wellness Stores
- Product Safety Certifications Schema — NSF, USP, FDA, CE in JSON-LD
- Shopify ProductGroup hasVariant Schema — Multi-Variant Structured Data
- Shopify Schema Markup Guide — Complete JSON-LD Reference
- E-commerce AI Readiness Checklist
- CatalogScan Blog — AI Shopping Agent Optimization