Structured Data Guide
Shopify Watch & Luxury Timepiece Schema — Movement Type, Water Resistance, Case Diameter & COSC Certification Structured Data
AI agents handling queries like "Swiss automatic watch under 40mm sapphire crystal water resistant 100m," "COSC chronometer certified dive watch 300m," "solar-powered titanium quartz watch with perpetual calendar," or "ladies dress watch rose gold 28mm mechanical movement" need machine-readable movement type, water resistance depth, case material, crystal type, and chronograph complication data to produce accurate answers. Shopify's default JSON-LD outputs only name and price — zero horology data. Without structured movement type markup, your automatic movements are invisible to "no battery" filter queries. Without water resistance depth in additionalProperty, "100m dive-safe" searches miss your stock entirely. This guide covers the complete watch.* metafield schema to close those gaps.
Product @type with additionalProperty for movement type, case diameter, case material, crystal material, water resistance (in meters + ATM + BAR in the description), lug width, power reserve, movement caliber, bezel type, complication type, and movement frequency. Add hasCertification for ISO 6425 diver's watch certification and COSC chronometer certification. Use compatibleWith linked by lug width for strap compatibility. Store all values in a watch.* metafield namespace with Liquid conditionals for COSC and chronograph blocks.
Why Watches Require Specialized Structured Data
Watches are a category where expert shoppers apply the most granular filters of any consumer product. Movement type alone divides the entire market — a buyer searching "automatic watch" will not accept a quartz, and vice versa. Water resistance rating determines whether a watch can accompany a dive, a swim, or only handle rain. Case diameter is a dealbreaker for wrist fit. These filters are impossible for an AI agent to apply if the data lives only in product descriptions rather than structured schema fields.
Shopify's default Product JSON-LD provides name, price, availability, and SKU. It does not emit movement type, water resistance depth, case diameter, crystal material, or chronograph complication data. This means every watch query with a technical filter — the vast majority of watch queries — receives no signal from your product pages and cannot be matched by AI shopping agents parsing your schema.
Watch queries and the structured data they require
| AI agent query | Required structured data | Key property |
|---|---|---|
| "Swiss automatic under 40mm sapphire crystal" | Movement type + case diameter + crystal material | additionalProperty Movement Type, Case Diameter, Crystal Material |
| "COSC chronometer certified dive watch" | COSC certification + water resistance ISO 6425 | hasCertification (COSC + ISO 6425) |
| "solar quartz titanium perpetual calendar" | Movement type + case material + complication | additionalProperty Movement Type, Case Material, Complication Type |
| "ladies rose gold 28mm dress watch" | Case diameter + case material + dial color | additionalProperty Case Diameter, Case Material, Dial Color |
| "dive watch 300m ISO 6425 certified" | Water resistance + ISO certification | additionalProperty Water Resistance + hasCertification ISO 6425 |
| "20mm NATO strap compatible field watch" | Lug width + compatible straps | additionalProperty Lug Width + compatibleWith |
Section 1 — Automatic Dive Watch: Full Product Schema
The following example shows a complete Product JSON-LD for a 42mm automatic dive watch. Every additionalProperty reflects a real horology data point that AI agents use to filter watch queries. The hasCertification block includes both ISO 6425 (diver's watch standard, mandatory for a watch to be marketed as a diver's watch) and the optional COSC chronometer certification shown as a conditional comment.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Pelagic 300 — 42mm Automatic Dive Watch, ETA 2824-2, 300m Water Resistance",
"description": "Swiss automatic diver's watch featuring an ETA 2824-2 movement with 38-hour power reserve. 42mm 316L stainless steel case with sapphire crystal (double AR coating), screw-down crown, unidirectional rotating bezel. 300m / 30 ATM water resistance — ISO 6425 certified. Lug width 20mm.",
"url": "https://example-watches.myshopify.com/products/pelagic-300-automatic-dive",
"brand": {
"@type": "Brand",
"name": "Pelagic Watch Co."
},
"material": "316L stainless steel case and bracelet, sapphire crystal",
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Movement Type",
"value": "Automatic",
"description": "Mechanical self-winding movement — no battery required; rotor winds mainspring via wearer's wrist motion"
},
{
"@type": "PropertyValue",
"name": "Movement Caliber",
"value": "ETA 2824-2"
},
{
"@type": "PropertyValue",
"name": "Movement Frequency",
"value": "28800",
"unitCode": "2M",
"description": "28,800 bph / 4 Hz — beats per hour indicating balance wheel frequency; higher frequency = smoother sweep"
},
{
"@type": "PropertyValue",
"name": "Case Diameter",
"value": "42",
"unitCode": "MMT"
},
{
"@type": "PropertyValue",
"name": "Case Thickness",
"value": "12",
"unitCode": "MMT"
},
{
"@type": "PropertyValue",
"name": "Case Material",
"value": "Stainless Steel 316L",
"description": "316L marine-grade stainless steel — highest corrosion resistance in the mid-range segment; Rolex uses 904L superalloy"
},
{
"@type": "PropertyValue",
"name": "Crystal Material",
"value": "Sapphire",
"description": "Scratch-resistant sapphire crystal (9 Mohs hardness) with anti-reflective coating on both inner and outer surfaces for glare-free legibility underwater"
},
{
"@type": "PropertyValue",
"name": "Crystal Anti-Reflective",
"value": "Double-sided AR coating"
},
{
"@type": "PropertyValue",
"name": "Water Resistance",
"value": "300",
"unitCode": "MTR",
"description": "300m / 30 ATM / 30 BAR water resistance — suitable for recreational scuba diving; not rated for saturation diving or mixed-gas professional diving (ISO 6425 diver's watch standard)"
},
{
"@type": "PropertyValue",
"name": "Lug Width",
"value": "20",
"unitCode": "MMT",
"description": "20mm lug width — compatible with any standard 20mm strap (NATO, rubber dive strap, leather, metal bracelet)"
},
{
"@type": "PropertyValue",
"name": "Power Reserve",
"value": "38",
"unitCode": "HUR"
},
{
"@type": "PropertyValue",
"name": "Dial Color",
"value": "Black"
},
{
"@type": "PropertyValue",
"name": "Bezel Type",
"value": "Unidirectional rotating bezel",
"description": "ISO 6425 diver's watch requirement — 60-minute graduated unidirectional rotating bezel with luminous marker at 12 o'clock; can only rotate counterclockwise so accidental nudges cannot add time to a dive"
},
{
"@type": "PropertyValue",
"name": "Crown Type",
"value": "Screw-down crown",
"description": "Screw-down crown for water resistance integrity — always unscrew to set time, then resecure fully before any water entry"
},
{
"@type": "PropertyValue",
"name": "Lume",
"value": "Swiss Super-LumiNova Grade X1",
"description": "BGW9 blue-glow Super-LumiNova applied to hour indices and hands; Grade X1 is the highest-output commercially available grade"
}
],
"hasCertification": [
{
"@type": "Certification",
"name": "ISO 6425 Diver's Watch Certification",
"issuedBy": {
"@type": "Organization",
"name": "International Organization for Standardization (ISO)",
"url": "https://www.iso.org"
},
"description": "ISO 6425 diver's watch standard: requires water resistance to rated depth, unidirectional rotating bezel, legibility underwater, magnetic resistance, shock resistance, and strap robustness testing"
}
/*
COSC block — inject only when watch.cosc_certified metafield = "true":
{
"@type": "Certification",
"name": "COSC Chronometer Certification",
"issuedBy": {
"@type": "Organization",
"name": "Contrôle Officiel Suisse des Chronomètres (COSC)",
"url": "https://www.cosc.swiss"
},
"description": "COSC-certified movement tested for accuracy of -4/+6 seconds per day across 16 days, 5 positions, 3 temperatures"
}
*/
],
"compatibleWith": [
{
"@type": "Product",
"name": "20mm NATO Strap — Olive Drab",
"url": "https://example-watches.myshopify.com/products/20mm-nato-strap-olive-drab"
},
{
"@type": "Product",
"name": "20mm Rubber Dive Strap — Black",
"url": "https://example-watches.myshopify.com/products/20mm-rubber-dive-strap-black"
}
],
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"price": "649.00",
"availability": "https://schema.org/InStock",
"url": "https://example-watches.myshopify.com/products/pelagic-300-automatic-dive"
}
}
</script>
Key points on this schema. The Water Resistance PropertyValue includes all three equivalent notations (300m, 30 ATM, 30 BAR) in the description because AI agents treat each as a separate potential filter. The Case Material value uses the precise grade "Stainless Steel 316L" rather than the generic "Stainless Steel" — this matters for luxury-tier filtering where 904L superalloy is a distinct signal. The ISO 6425 certification in hasCertification distinguishes a true certified diver's watch from a watch that merely claims a water resistance depth.
Section 2 — Solar-Powered Quartz Watch: Movement Variants
Quartz movement variants — standard battery quartz, solar-powered, kinetic, and Spring Drive — each require precise movement type values. Collapsing all non-mechanical watches into "Quartz" loses the signal that drives "no battery replacement ever" queries and "eco-drive solar" brand-adjacent searches.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Solaris Ti — Solar-Powered Titanium Quartz Watch, Perpetual Calendar, Eco-Drive E168",
"description": "Solar-powered titanium quartz watch with Citizen Eco-Drive E168 movement. Charges from any light source — full charge runs 6 months in total darkness. Case: 39mm grade 5 titanium (30% lighter than steel). Hardlex mineral crystal. Perpetual calendar complication accurate through 2100. 100m / 10 ATM water resistance.",
"url": "https://example-watches.myshopify.com/products/solaris-ti-solar-titanium",
"brand": {
"@type": "Brand",
"name": "Solaris Watch Co."
},
"material": "Grade 5 titanium case and bracelet, Hardlex mineral crystal",
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Movement Type",
"value": "Solar-Powered Quartz",
"description": "Citizen Eco-Drive solar movement — charges from any light source (natural or artificial), no battery replacement ever; full charge provides 6-month power reserve in total darkness"
},
{
"@type": "PropertyValue",
"name": "Movement Caliber",
"value": "E168"
},
{
"@type": "PropertyValue",
"name": "Accuracy",
"value": "±15",
"unitCode": "SEC",
"description": "±15 seconds per month — standard quartz accuracy. COSC quartz chronometer standard: ±0.07 seconds/day = ±2.1 seconds/month. Standard battery quartz: ±15 sec/month. GPS-synced quartz: ±0 seconds"
},
{
"@type": "PropertyValue",
"name": "Power Reserve",
"value": "4380",
"unitCode": "HUR",
"description": "6-month power reserve (4,380 hours) in total darkness at full charge — built-in power reserve indicator sub-dial"
},
{
"@type": "PropertyValue",
"name": "Case Diameter",
"value": "39",
"unitCode": "MMT"
},
{
"@type": "PropertyValue",
"name": "Case Thickness",
"value": "9",
"unitCode": "MMT"
},
{
"@type": "PropertyValue",
"name": "Case Material",
"value": "Titanium",
"description": "Grade 5 (Ti-6Al-4V) titanium alloy — approximately 30% lighter than equivalent 316L stainless steel at equivalent strength; hypoallergenic and non-magnetic"
},
{
"@type": "PropertyValue",
"name": "Crystal Material",
"value": "Hardlex Mineral",
"description": "Hardlex is Seiko's proprietary tempered mineral crystal — harder than standard mineral glass (7 Mohs vs 5–7 Mohs range) but softer than sapphire (9 Mohs). Resistant to shattering; more scratch-prone than sapphire. Used across Seiko and Citizen mid-range price points."
},
{
"@type": "PropertyValue",
"name": "Water Resistance",
"value": "100",
"unitCode": "MTR",
"description": "100m / 10 ATM / 10 BAR water resistance — suitable for swimming and snorkeling; not rated for scuba diving"
},
{
"@type": "PropertyValue",
"name": "Complication Type",
"value": "Perpetual Calendar",
"description": "Perpetual calendar accurate through 2100 — automatically accounts for month lengths and leap years without manual date correction"
},
{
"@type": "PropertyValue",
"name": "Lug Width",
"value": "20",
"unitCode": "MMT"
},
{
"@type": "PropertyValue",
"name": "Dial Color",
"value": "Blue Sunburst"
}
],
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"price": "395.00",
"availability": "https://schema.org/InStock",
"url": "https://example-watches.myshopify.com/products/solaris-ti-solar-titanium"
}
}
</script>
Movement type value reference
| Movement Type value | Technology description | Key AI query signals |
|---|---|---|
Automatic |
Mechanical self-winding via rotor; no battery | "automatic", "self-winding", "no battery mechanical" |
Manual Wind |
Mechanical hand-wound; no rotor; thinner profile | "hand-wound", "manual winding", "dress watch movement" |
Quartz |
Battery-powered oscillator; highest accuracy | "quartz", "battery watch", "accurate timekeeping" |
Solar-Powered Quartz |
Quartz charged by light via solar cell | "solar", "eco-drive", "no battery replacement", "light powered" |
Kinetic |
Seiko Kinetic — rotor charges capacitor powering quartz | "kinetic", "Seiko Kinetic", "self-charging quartz" |
Spring Drive |
Seiko Spring Drive — mechanical mainspring, quartz accuracy via tri-synchro regulator | "Spring Drive", "hybrid movement", "glide spring" |
Section 3 — Chronograph Complication Schema
A chronograph is the most common complication in sports watches and the most frequently filtered complication in AI queries ("chronograph watch under $500," "COSC certified column wheel chronograph"). The schema below shows how to express the chronograph and its sub-components as discrete additionalProperty values — one property per measurable attribute, not a single bundled string.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Apex Chrono — 41mm Automatic Chronograph, Column Wheel, Tachymeter",
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Movement Type",
"value": "Automatic",
"description": "Mechanical self-winding chronograph movement — integrated column wheel chronograph module"
},
{
"@type": "PropertyValue",
"name": "Complication Type",
"value": "Chronograph",
"description": "Stopwatch complication via crown/pushers — measures elapsed time independently of the timekeeping function"
},
{
"@type": "PropertyValue",
"name": "Sub-dial Count",
"value": "3",
"description": "Three chronograph sub-dials: running seconds (9 o'clock), 30-minute counter (3 o'clock), 12-hour counter (6 o'clock)"
},
{
"@type": "PropertyValue",
"name": "Tachymeter",
"value": "Tachymeter scale",
"description": "Outer bezel tachymeter scale for calculating speed over a known distance — start chronograph at mile/km marker, stop at next; bezel reads speed in units/hour"
},
{
"@type": "PropertyValue",
"name": "Pushers",
"value": "2 — standard chronograph pushers at 2 o'clock and 4 o'clock",
"description": "2 o'clock pusher: start/stop chronograph. 4 o'clock pusher: reset to zero. Both pushers are non-screw-down on this model — do not operate while submerged."
},
{
"@type": "PropertyValue",
"name": "Column Wheel",
"value": "Column wheel chronograph",
"description": "Column wheel mechanism controls chronograph start/stop/reset with precisely indexed steps — smoother, lighter pusher action vs cam-operated lever chronographs; column wheel is a recognized indicator of movement quality and finishing level"
},
{
"@type": "PropertyValue",
"name": "Case Diameter",
"value": "41",
"unitCode": "MMT"
},
{
"@type": "PropertyValue",
"name": "Case Thickness",
"value": "13",
"unitCode": "MMT",
"description": "13mm case thickness — chronograph movements add 1-2mm vs equivalent non-chronograph calibers due to additional layer for chronograph module"
},
{
"@type": "PropertyValue",
"name": "Crystal Material",
"value": "Sapphire",
"description": "Flat sapphire crystal with single-sided anti-reflective coating on inner surface"
},
{
"@type": "PropertyValue",
"name": "Water Resistance",
"value": "100",
"unitCode": "MTR",
"description": "100m / 10 ATM / 10 BAR — suitable for swimming; pushers should not be operated underwater"
},
{
"@type": "PropertyValue",
"name": "Lug Width",
"value": "20",
"unitCode": "MMT"
}
]
}
</script>
Column Wheel as a discrete additionalProperty value enables this differentiation.
Section 4 — Water Resistance Reference Table
Water resistance ratings are expressed three ways — ATM (atmospheres), BAR, and meters — and AI agents may receive queries using any of the three. Your additionalProperty description must include all three equivalents. The table below shows the full rating ladder and appropriate use cases.
| Marking | ATM | BAR | Meters | Suitable for |
|---|---|---|---|---|
| "Water Resistant" (no depth) | 3 ATM | 3 BAR | 30m | Splashes and rain only — no swimming or submersion |
| Water Resistant 5 ATM | 5 ATM | 5 BAR | 50m | Swimming in shallow water; no diving or high-impact water sports |
| Water Resistant 10 ATM | 10 ATM | 10 BAR | 100m | Swimming and snorkeling; no scuba diving |
| Diver's 200m (ISO 6425) | 20 ATM | 20 BAR | 200m | Recreational scuba diving to sport diving depths; ISO 6425 certified |
| Diver's 300m+ (ISO 6425) | 30+ ATM | 30+ BAR | 300m+ | Professional and technical diving; not rated for saturation diving |
"value": "30", "unitCode": "MTR") rather than the vague textual marking. A watch listed as "Water Resistant" with no numeric depth is appropriate for splashes only and should carry a 30m value with the caveat description.
How to encode the ATM equivalents
The canonical PropertyValue for water resistance should use meters as the numeric value (since meters is the most internationally recognized unit for dive depth) and include ATM and BAR equivalents in the description field:
{
"@type": "PropertyValue",
"name": "Water Resistance",
"value": "100",
"unitCode": "MTR",
"description": "100m / 10 ATM / 10 BAR water resistance — suitable for swimming and snorkeling. Not rated for scuba diving. ISO unit code MTR = meters."
}
Section 5 — Crystal Material Reference Table
Crystal material is a high-priority filter for buyers comparing scratch resistance, optical clarity, and price tier. AI agents match "scratch-resistant watch crystal" to sapphire, "vintage look crystal" to acrylic/Hesalite, and "mid-range Japanese watch" to Hardlex or mineral. Structuring crystal material as an additionalProperty enables all three query patterns.
| Crystal type | Hardness (Mohs) | Scratch resistance | Price tier | Notes |
|---|---|---|---|---|
| Sapphire | 9 Mohs | Excellent — resists most everyday scratches | Swiss luxury, premium segments | Industry standard for Swiss watches over ~$500; brittle under sharp impact; can be polished by specialist |
| Mineral / Hardlex | 5–7 Mohs (Hardlex: ~7) | Good — resistant to minor scratches; scratches with keys/sand | Mid-range ($50–$500) | Hardlex is Seiko's proprietary tempered mineral crystal — harder than standard mineral but softer than sapphire. Used across Seiko and Citizen mid-range lines. |
| Acrylic / Hesalite | 3 Mohs | Low — scratches easily; can be polished to remove scratches | Vintage, retro, budget | Hesalite is Omega's trade name for high-quality acrylic; used in the Speedmaster Moonwatch Professional by authentic specification. Safer under impact shock than sapphire. Polishable with watch crystal polish. |
additionalProperty — not buried in a description paragraph — enables all three routing patterns.
Crystal material PropertyValue encoding
{
"@type": "PropertyValue",
"name": "Crystal Material",
"value": "Sapphire",
"description": "Scratch-resistant sapphire crystal (9 Mohs hardness) with double-sided anti-reflective coating. Industry standard for Swiss luxury watches. Brittle under sharp lateral impact — impact resistance is lower than mineral or acrylic."
}
/* Mid-range mineral example */
{
"@type": "PropertyValue",
"name": "Crystal Material",
"value": "Hardlex Mineral",
"description": "Hardlex is Seiko's proprietary tempered mineral crystal — harder than standard mineral glass, scratch-resistant for everyday use, and more shatter-resistant than sapphire."
}
/* Vintage / Hesalite example */
{
"@type": "PropertyValue",
"name": "Crystal Material",
"value": "Hesalite Acrylic",
"description": "Hesalite is Omega's trade name for high-clarity acrylic crystal — used in the Speedmaster Moonwatch Professional by original NASA specification. Scratches easily but can be polished; will not shatter on impact."
}
Section 6 — Strap Compatibility with compatibleWith
Strap compatibility is determined by a single physical measurement: lug width. Any 20mm strap fits any watch with a 20mm lug width, regardless of brand. Structuring this linkage in schema enables AI agents to answer "compatible 20mm straps for [watch model]" and to surface strap accessories alongside watch PDPs in accessory queries.
On the watch product: declare lug width and link compatible straps
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Pelagic 300 — 42mm Automatic Dive Watch",
"url": "https://example-watches.myshopify.com/products/pelagic-300-automatic-dive",
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Lug Width",
"value": "20",
"unitCode": "MMT",
"description": "20mm lug width — fits any standard 20mm strap: NATO, leather, rubber, and metal bracelets. The lug width is the only compatibility dimension for strap swapping."
}
],
"compatibleWith": [
{
"@type": "Product",
"name": "20mm NATO Strap — Olive Drab",
"url": "https://example-watches.myshopify.com/products/20mm-nato-strap-olive-drab",
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Strap Width",
"value": "20",
"unitCode": "MMT"
}
]
},
{
"@type": "Product",
"name": "20mm Rubber Dive Strap — Black",
"url": "https://example-watches.myshopify.com/products/20mm-rubber-dive-strap-black",
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Strap Width",
"value": "20",
"unitCode": "MMT"
}
]
}
]
}
On the strap product: use isAccessoryOrSparePartFor
On the strap's own product page, use isAccessoryOrSparePartFor to link back to compatible watches. Combine with a matching Strap Width additionalProperty so AI agents can verify dimensional compatibility without traversing to the watch product first.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "20mm NATO Strap — Olive Drab",
"url": "https://example-watches.myshopify.com/products/20mm-nato-strap-olive-drab",
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Strap Width",
"value": "20",
"unitCode": "MMT",
"description": "20mm strap width — compatible with any watch with a 20mm lug width. No tools required to swap: slide existing strap out via spring bars, slide NATO under."
},
{
"@type": "PropertyValue",
"name": "Strap Material",
"value": "Nylon NATO",
"description": "Military-spec nylon weave — machine washable, waterproof, extremely durable. Single-pass NATO design keeps watch secure even if one spring bar fails."
},
{
"@type": "PropertyValue",
"name": "Strap Length",
"value": "280",
"unitCode": "MMT",
"description": "280mm total length — standard NATO strap length fits most wrist sizes from 155mm to 210mm circumference"
}
],
"isAccessoryOrSparePartFor": [
{
"@type": "Product",
"name": "Pelagic 300 — 42mm Automatic Dive Watch",
"url": "https://example-watches.myshopify.com/products/pelagic-300-automatic-dive"
}
]
}
The lug width is the canonical compatibility key. An AI agent answering "best NATO strap for a watch with 20mm lugs" can verify compatibility from either the watch's compatibleWith block or the strap's isAccessoryOrSparePartFor + Strap Width combination — without relying on textual description matching.
Section 7 — Liquid Implementation: watch.* Metafield Namespace
Implement all watch-specific properties under a watch metafield namespace in Shopify. The following Liquid template covers the full 14-field namespace, with conditionals for the COSC certification block (only injected when explicitly set) and the chronograph section (only injected when the complication type includes "Chronograph").
Metafield definitions — watch.* namespace
| Metafield key | Type | Example value |
|---|---|---|
watch.movement_type | single_line_text | Automatic |
watch.movement_caliber | single_line_text | ETA 2824-2 |
watch.movement_frequency_bph | integer | 28800 |
watch.case_diameter_mm | number_decimal | 42 |
watch.case_thickness_mm | number_decimal | 12 |
watch.case_material | single_line_text | Stainless Steel 316L |
watch.crystal_material | single_line_text | Sapphire |
watch.water_resistance_m | integer | 300 |
watch.water_resistance_atm | integer | 30 |
watch.lug_width_mm | integer | 20 |
watch.power_reserve_hours | integer | 38 |
watch.dial_color | single_line_text | Black |
watch.bezel_type | single_line_text | Unidirectional rotating bezel |
watch.complication_type | list.single_line_text | ["Chronograph", "Date"] |
watch.cosc_certified | boolean | true |
watch.iso_6425_certified | boolean | true |
Liquid template with conditionals
{% comment %}
watch-schema.liquid — inject in theme.liquid or product.liquid
All watch.* metafields must be defined in Shopify Admin > Settings > Custom data
{% endcomment %}
{% assign mf = product.metafields.watch %}
{% if mf.movement_type != blank %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": {{ product.title | json }},
"url": "{{ shop.url }}{{ product.url }}",
"description": {{ product.description | strip_html | json }},
"brand": {
"@type": "Brand",
"name": {{ product.vendor | json }}
},
"offers": {
"@type": "Offer",
"priceCurrency": {{ cart.currency.iso_code | json }},
"price": "{{ product.price | money_without_currency }}",
"availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}",
"url": "{{ shop.url }}{{ product.url }}"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Movement Type",
"value": {{ mf.movement_type | json }}
}{% if mf.movement_caliber != blank %},
{
"@type": "PropertyValue",
"name": "Movement Caliber",
"value": {{ mf.movement_caliber | json }}
}{% endif %}{% if mf.movement_frequency_bph != blank %},
{
"@type": "PropertyValue",
"name": "Movement Frequency",
"value": "{{ mf.movement_frequency_bph }}",
"unitCode": "2M",
"description": "{{ mf.movement_frequency_bph }} bph — beats per hour of balance wheel"
}{% endif %}{% if mf.case_diameter_mm != blank %},
{
"@type": "PropertyValue",
"name": "Case Diameter",
"value": "{{ mf.case_diameter_mm }}",
"unitCode": "MMT"
}{% endif %}{% if mf.case_thickness_mm != blank %},
{
"@type": "PropertyValue",
"name": "Case Thickness",
"value": "{{ mf.case_thickness_mm }}",
"unitCode": "MMT"
}{% endif %}{% if mf.case_material != blank %},
{
"@type": "PropertyValue",
"name": "Case Material",
"value": {{ mf.case_material | json }}
}{% endif %}{% if mf.crystal_material != blank %},
{
"@type": "PropertyValue",
"name": "Crystal Material",
"value": {{ mf.crystal_material | json }}
}{% endif %}{% if mf.water_resistance_m != blank %},
{
"@type": "PropertyValue",
"name": "Water Resistance",
"value": "{{ mf.water_resistance_m }}",
"unitCode": "MTR",
"description": "{{ mf.water_resistance_m }}m / {{ mf.water_resistance_atm }} ATM / {{ mf.water_resistance_atm }} BAR water resistance"
}{% endif %}{% if mf.lug_width_mm != blank %},
{
"@type": "PropertyValue",
"name": "Lug Width",
"value": "{{ mf.lug_width_mm }}",
"unitCode": "MMT",
"description": "{{ mf.lug_width_mm }}mm lug width — compatible with standard {{ mf.lug_width_mm }}mm straps"
}{% endif %}{% if mf.power_reserve_hours != blank %},
{
"@type": "PropertyValue",
"name": "Power Reserve",
"value": "{{ mf.power_reserve_hours }}",
"unitCode": "HUR"
}{% endif %}{% if mf.dial_color != blank %},
{
"@type": "PropertyValue",
"name": "Dial Color",
"value": {{ mf.dial_color | json }}
}{% endif %}{% if mf.bezel_type != blank %},
{
"@type": "PropertyValue",
"name": "Bezel Type",
"value": {{ mf.bezel_type | json }}
}{% endif %}{% for complication in mf.complication_type %},
{
"@type": "PropertyValue",
"name": "Complication Type",
"value": {{ complication | json }}{% if complication == "Chronograph" %},
"description": "Stopwatch complication via crown/pushers — measures elapsed time independently of timekeeping"{% endif %}
}{% endfor %}
],
"hasCertification": [
{% if mf.iso_6425_certified == true %}
{
"@type": "Certification",
"name": "ISO 6425 Diver's Watch Certification",
"issuedBy": {
"@type": "Organization",
"name": "International Organization for Standardization (ISO)",
"url": "https://www.iso.org"
},
"description": "ISO 6425 diver's watch standard — requires verified water resistance, unidirectional bezel, shock and magnetic resistance"
}{% if mf.cosc_certified == true %},{% endif %}
{% endif %}
{% comment %}
COSC block — only inject when watch.cosc_certified metafield is explicitly true.
Never inject for watches claiming 'chronometer-grade' without independent COSC testing.
{% endcomment %}
{% if mf.cosc_certified == true %}
{
"@type": "Certification",
"name": "COSC Chronometer Certification",
"issuedBy": {
"@type": "Organization",
"name": "Contrôle Officiel Suisse des Chronomètres (COSC)",
"url": "https://www.cosc.swiss"
},
"description": "COSC-certified movement tested for accuracy of -4/+6 seconds per day (mechanical) across 16 days, 5 positions, 3 temperatures. Quartz COSC standard: ±0.07 seconds/day."
}
{% endif %}
]
}
</script>
{% endif %}
hasCertification COSC block only injects when watch.cosc_certified is explicitly true. Do not default to including it. COSC certification is issued per movement caliber by the independent Swiss testing body — a manufacturer's own "chronometer-grade" claim without COSC testing does not qualify and should not appear in the schema.
Section 8 — 5 Common Structured Data Mistakes for Watch Listings
-
Mistake 1 Using "water resistant 100m" without specifying ATM equivalent
AI agents parse "100m" and "10 ATM" as entirely separate filter tokens. A query for "10 ATM dive-safe watch" will not match a product whose schema only contains"value": "100", "unitCode": "MTR"without the ATM/BAR equivalents in the description. Always include all three notations in the description field:"description": "100m / 10 ATM / 10 BAR water resistance". -
Mistake 2 Omitting movement type entirely
Movement type (Automatic vs Quartz vs Manual Wind) is the number one filter in watch AI queries. It divides the entire market — automatic buyers will not accept a quartz recommendation, and the price distribution between movement types is dramatic. A watch product without aMovement TypeadditionalPropertyis invisible to every movement-filtered query, which is the majority of watch searches. -
Mistake 3 Providing case diameter without case thickness
Dress watch buyers filter on both dimensions — diameter for wrist fit and thickness for whether the watch fits under a shirt cuff. A 42mm watch at 9mm thickness wears completely differently than a 42mm chronograph at 14mm thickness. Both values should be present as separateadditionalPropertyentries. Omitting case thickness leaves dress-watch and slim-profile queries unserviced. -
Mistake 4 Missing lug width — strap compatibility cannot be linked
Without a structuredLug WidthadditionalProperty, AI agents cannot verify strap compatibility or surface your strap accessories alongside watch PDPs. Lug width is the physical interface dimension that makes strap swapping mechanically verifiable. Cross-sell opportunities for NATO straps, rubber dive straps, and metal bracelets are entirely lost when lug width is absent from the schema. -
Mistake 5 Using generic "stainless steel" without specifying the alloy grade
316L stainless steel and 904L superalloy stainless (used by Rolex) are different materials with measurably different corrosion resistance, hardness, and price positioning. An AI agent answering a luxury watch query filters "904L stainless" as a distinct value from "316L stainless." Using the generic value "Stainless Steel" collapses this distinction and removes your 904L product from luxury-tier AI recommendations. The same principle applies to titanium grades (Grade 2 vs Grade 5 / Ti-6Al-4V) and to ceramic case materials.
Related Structured Data Guides
- Shopify Jewelry & Gemstone Schema — our jewelry and gemstone schema guide covering GIA certificates, 4Cs, metal purity, and ring size SizeSpecification
- Shopify Visual Artwork & Collectibles Schema — our collectibles schema guide for limited editions, provenance, and authentication certificates
- Shopify ProductGroup Variant Schema — ProductGroup variant implementation for watches with multiple strap or dial color options
- Ecommerce Product Condition Structured Data — markup for pre-owned and vintage watches with condition grades
- Shopify Metafields for AI Agents — complete metafield namespace strategy for product-specific structured data
Frequently Asked Questions
How do I express watch water resistance (ATM/BAR/meters) in schema.org?
Use additionalProperty with name: "Water Resistance", a numeric value in meters as the canonical value (e.g., "value": "300", "unitCode": "MTR"), and include all three equivalent notations in the description field: "300m / 30 ATM / 30 BAR water resistance." This ensures AI agents parsing any of the three notations as independent query filters can still match your product. For ISO 6425 certified diver's watches, add a hasCertification block with the ISO standard as the issuing body — this is a stronger signal than a bare depth claim and distinguishes certified diver's watches from watches that merely claim a depth rating.
How do I mark up automatic vs quartz vs manual movement type in schema.org?
Use additionalProperty with name: "Movement Type" and a precise value: "Automatic", "Manual Wind", "Quartz", "Solar-Powered Quartz", "Kinetic", or "Spring Drive". Include a description explaining the technology for AI natural-language query matching. Always pair with a second additionalProperty for "Movement Caliber" (the specific reference number, e.g., "ETA 2824-2" or "NH35A"). Never collapse "Automatic" and "Manual Wind" into a generic "Mechanical" value — they are separate market segments with different buyers. See the metafields guide for the full watch.* namespace setup.
How do I implement COSC chronometer certification in Shopify schema?
Use hasCertification on the Product with a Certification object: set name to "COSC Chronometer Certification", issuedBy to the COSC organization (https://www.cosc.swiss), and include a description of the accuracy standard (−4/+6 sec/day mechanical, ±0.07 sec/day quartz). Use a Liquid conditional so this block only injects when the watch.cosc_certified metafield is explicitly true. Do not inject the COSC block for watches that claim "chronometer-grade" by the manufacturer's own testing — COSC certification must be issued by the independent Swiss body. Because COSC certifies per movement caliber rather than per serial number, certificationIdentification is typically omitted.
What schema.org property marks watch strap lug width compatibility?
Use additionalProperty with name: "Lug Width" and unitCode: "MMT" on the watch product to declare the dimension. Use compatibleWith to explicitly link compatible strap products. On the strap product, use isAccessoryOrSparePartFor pointing back to compatible watch URLs, plus a matching additionalProperty for "Strap Width" with the same millimeter value. The lug width is the physical compatibility key — it is the only dimension required to confirm that a given strap will fit a given watch. AI agents can verify strap recommendations from either the watch's compatibleWith block or the strap's isAccessoryOrSparePartFor reference.
How do I handle chronograph and other watch complications in additionalProperty?
Use additionalProperty with name: "Complication Type" and a single complication per PropertyValue — one property per complication for watches with multiple complications (e.g., separate entries for "Chronograph", "Date", "GMT"). Never bundle multiple complications into a single string like "Chronograph + Date + GMT" as this prevents individual complication filtering. For chronographs specifically, add supporting properties: "Sub-dial Count", "Tachymeter", "Pushers", and "Column Wheel" as separate additionalProperty values. The Column Wheel property is a recognized movement quality signal for AI agents answering "best quality chronograph" queries.
Are your watch movement types and water resistance ratings invisible to AI shopping agents?
CatalogScan audits your Shopify store's structured data and identifies missing movement type signals, absent water resistance ATM equivalents, unstructured crystal material data, and COSC certification gaps — ensuring your watch listings surface in AI horology queries from "Swiss automatic sapphire crystal" to "COSC certified dive watch 300m."
Run Free Scan