Shopify Structured Data · Furniture

Shopify furniture dimensions schema:
hasMeasurement JSON-LD for home furnishings stores

Furniture shoppers use AI agents with hard dimension constraints: "sofa under 82 inches wide", "desk that fits in 48 × 24 inches", "dining table for 8 under 94 inches long". These queries require machine-readable dimension data — which standard Product schema without hasMeasurement cannot express.

TL;DR Use hasMeasurement with QuantitativeValue objects for all furniture dimensions — width, depth, height, seat height, and weight. Include UN/CEFACT unitCode (INH for inches, CMT for centimeters) on every entry. Store values in Shopify metafields under the dimensions namespace and output them via a Liquid conditional block. Dimension text in descriptions alone cannot be used for numeric filtering by AI agents.

Why furniture needs hasMeasurement, not just description text

When a user asks an AI shopping agent for "a sectional sofa that fits along an 8-foot wall", the agent performs a numeric constraint check: does this product's width value fall below 96 inches? This requires dimension data to exist as a structured, unit-aware numeric value in the product's JSON-LD.

Furniture product descriptions commonly include phrases like "84W × 37D × 33H inches" or "Available in standard and apartment sizes." These are readable by humans but not reliably machine-processable for numeric filtering because:

hasMeasurement solves all four problems: each QuantitativeValue entry has an explicit axis label (name), a numeric value, and an unambiguous unit code (unitCode). AI agents can directly compare value: 84 + unitCode: "INH" against the user's 96-inch constraint — no NLP parsing required.

The hasMeasurement property: what it accepts

hasMeasurement is a schema.org property on the Product type. It accepts an array of QuantitativeValue objects. Each object represents one physical measurement of the product.

FieldTypeRequired?Notes
@typeStringYesAlways "QuantitativeValue"
nameStringYesHuman label for the dimension: "Width", "Depth", "Seat Height", etc.
valueNumberYesNumeric measurement — no units, no strings. Use 17.5 not "17.5 in"
unitCodeStringYesUN/CEFACT unit code. INH = inches, CMT = centimeters, LBR = pounds, KGM = kilograms
unitTextStringRecommendedHuman-readable unit: "inches", "cm", "lbs". Fallback for NLP parsers that don't resolve unitCode
measurementTypeURLOptionalSchema.org enum URL for standard axes. Use name for furniture-specific measurements like Seat Height

measurementType values for standard dimensions

The measurementType property accepts a schema.org URL from the WearableMeasurementType enumeration. For furniture, the relevant standard values are:

DimensionmeasurementType URL
Height (vertical, floor to top)https://schema.org/Height
Width (horizontal, left to right)https://schema.org/Width
Depth (front to back)https://schema.org/Depth
Weighthttps://schema.org/Weight

For furniture-specific functional dimensions — Seat Height, Arm Height, Desk Surface Height, Drawer Depth — there are no standard schema.org enum URLs. Use a descriptive name property instead. AI agents index the name field for these specialized measurements.

UN/CEFACT unit codes for furniture

CodeUnitPrimary use
INHInchesUS dimension measurements (most common for US furniture stores)
CMTCentimetersEU/international dimension measurements
FOTFeetRoom-size references (e.g., "fits in a 10-foot room")
MTRMetersEU room-size references
LBRPoundsProduct weight (US)
KGMKilogramsProduct weight (EU/international)

Always include both unitCode and unitText. The unitCode is used by AI agents for numeric unit-aware comparisons. The unitText is the human-readable fallback for NLP parsers that display dimension values in their responses.

Complete JSON-LD example: 84-inch performance velvet sofa

This is the recommended full implementation for a seating product. It covers overall dimensions, the critical seat height measurement, weight, and non-measurable attributes via additionalProperty.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Elara 84-Inch Performance Velvet Sofa — Mid-Century Modern",
  "description": "Solid white oak frame with brushed brass legs and performance velvet upholstery. 84-inch 3-seat sofa seats 3 adults comfortably. Ships in 2 boxes; assembly required (est. 45 min).",
  "image": "https://your-store.myshopify.com/cdn/shop/products/elara-sofa.jpg",
  "brand": { "@type": "Brand", "name": "Elara Home" },
  "material": "Solid White Oak, Performance Velvet",
  "color": "Slate Blue",
  "hasMeasurement": [
    {
      "@type": "QuantitativeValue",
      "name": "Width",
      "value": 84,
      "unitCode": "INH",
      "unitText": "inches",
      "measurementType": "https://schema.org/Width"
    },
    {
      "@type": "QuantitativeValue",
      "name": "Depth",
      "value": 37,
      "unitCode": "INH",
      "unitText": "inches",
      "measurementType": "https://schema.org/Depth"
    },
    {
      "@type": "QuantitativeValue",
      "name": "Height",
      "value": 33,
      "unitCode": "INH",
      "unitText": "inches",
      "measurementType": "https://schema.org/Height"
    },
    {
      "@type": "QuantitativeValue",
      "name": "Seat Height",
      "value": 17.5,
      "unitCode": "INH",
      "unitText": "inches"
    },
    {
      "@type": "QuantitativeValue",
      "name": "Weight",
      "value": 142,
      "unitCode": "LBR",
      "unitText": "lbs",
      "measurementType": "https://schema.org/Weight"
    }
  ],
  "additionalProperty": [
    { "@type": "PropertyValue", "name": "Frame Material", "value": "Solid White Oak" },
    { "@type": "PropertyValue", "name": "Leg Finish", "value": "Brushed Brass" },
    { "@type": "PropertyValue", "name": "Upholstery", "value": "Performance Velvet" },
    { "@type": "PropertyValue", "name": "Assembly Required", "value": "Yes" },
    { "@type": "PropertyValue", "name": "Assembly Time", "value": "45 minutes" },
    { "@type": "PropertyValue", "name": "Room Type", "value": "Living Room" },
    { "@type": "PropertyValue", "name": "Style", "value": "Mid-Century Modern" },
    { "@type": "PropertyValue", "name": "Seats", "value": "3" },
    { "@type": "PropertyValue", "name": "Max Weight Capacity", "value": "600 lbs" }
  ],
  "offers": {
    "@type": "Offer",
    "price": "1299.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "url": "https://your-store.myshopify.com/products/elara-sofa"
  }
}

Why Seat Height is the most important functional dimension for seating

Ergonomic queries — "chair with 18-inch seat height for a standard desk", "sofa with low seat height under 16 inches for a contemporary look" — depend entirely on Seat Height being present as a machine-readable value. Overall Height (floor to top of back) and Seat Height (floor to top of seat cushion) are different measurements; AI agents treat them as distinct. A sofa with 33-inch overall height and 17.5-inch seat height will appear in queries for both — but only if both measurements are present in hasMeasurement.

additionalProperty for non-measurable furniture attributes

additionalProperty with PropertyValue objects handles structured attributes that aren't numeric measurements: materials, finishes, style, room type, and capacity ratings. These are indexed by AI agents for attribute-matching queries like "white oak sofa with brass legs" or "mid-century modern living room sofa under $1,500". Use explicit property names — "Frame Material" not just "Material" — for reliable attribute matching across furniture subcategories.

Furniture-specific dimensions by category

Furniture typeRequired dimensionsFunctional dimensions (high-value)
Sofas & sectionals Width, Depth, Height Seat Height, Arm Height, Seat Depth (front to back of seat cushion)
Chairs (dining, accent, office) Width, Depth, Height Seat Height, Seat Width, Arm Height (if arms present)
Desks & work tables Width, Depth, Height Surface Height (desk height), Leg Clearance Height (under-desk space)
Dining tables Width, Depth (or Diameter), Height Table Height, Leg Clearance Height, Extended Width (for tables with leaves)
Beds & bed frames Width, Depth, Height Headboard Height, Footboard Height, Floor Clearance (under-bed storage)
Bookshelves & cabinets Width, Depth, Height Shelf Spacing, Interior Width, Interior Depth, Interior Height (per shelf)
Dressers & nightstands Width, Depth, Height Drawer Width, Drawer Depth, Drawer Height (interior)

Shopify Liquid template for hasMeasurement

Store all dimension values in product metafields under the dimensions namespace (type: number_decimal for numeric values, single_line_text_field for text attributes). The Liquid template outputs a complete hasMeasurement array with conditional blocks for optional measurements.

{% comment %}
  Metafields namespace: dimensions
  Required numeric: width_in, depth_in, height_in, weight_lbs
  Optional numeric: seat_height_in, arm_height_in, surface_height_in
  Optional text: assembly_time, room_type, style, max_weight_capacity
  All dimension metafields are type: number_decimal
{% endcomment %}

{% assign mf = product.metafields.dimensions %}

"hasMeasurement": [
  {% if mf.width_in != blank %}
  {
    "@type": "QuantitativeValue",
    "name": "Width",
    "value": {{ mf.width_in }},
    "unitCode": "INH",
    "unitText": "inches",
    "measurementType": "https://schema.org/Width"
  },
  {% endif %}
  {% if mf.depth_in != blank %}
  {
    "@type": "QuantitativeValue",
    "name": "Depth",
    "value": {{ mf.depth_in }},
    "unitCode": "INH",
    "unitText": "inches",
    "measurementType": "https://schema.org/Depth"
  },
  {% endif %}
  {% if mf.height_in != blank %}
  {
    "@type": "QuantitativeValue",
    "name": "Height",
    "value": {{ mf.height_in }},
    "unitCode": "INH",
    "unitText": "inches",
    "measurementType": "https://schema.org/Height"
  },
  {% endif %}
  {% if mf.seat_height_in != blank %}
  {
    "@type": "QuantitativeValue",
    "name": "Seat Height",
    "value": {{ mf.seat_height_in }},
    "unitCode": "INH",
    "unitText": "inches"
  },
  {% endif %}
  {% if mf.arm_height_in != blank %}
  {
    "@type": "QuantitativeValue",
    "name": "Arm Height",
    "value": {{ mf.arm_height_in }},
    "unitCode": "INH",
    "unitText": "inches"
  },
  {% endif %}
  {% if mf.surface_height_in != blank %}
  {
    "@type": "QuantitativeValue",
    "name": "Surface Height",
    "value": {{ mf.surface_height_in }},
    "unitCode": "INH",
    "unitText": "inches"
  },
  {% endif %}
  {% if mf.weight_lbs != blank %}
  {
    "@type": "QuantitativeValue",
    "name": "Weight",
    "value": {{ mf.weight_lbs }},
    "unitCode": "LBR",
    "unitText": "lbs",
    "measurementType": "https://schema.org/Weight"
  }
  {% endif %}
]

Adding metric equivalents for international stores

For stores that sell in both US and EU markets, output a second set of hasMeasurement entries in centimeters alongside the inch entries. Liquid's times filter converts from inches to centimeters (multiply by 2.54):

{% comment %}Metric equivalents — append after each inch entry{% endcomment %}
{% if mf.width_in != blank %}
{% assign width_cm = mf.width_in | times: 2.54 | round: 1 %}
{
  "@type": "QuantitativeValue",
  "name": "Width",
  "value": {{ width_cm }},
  "unitCode": "CMT",
  "unitText": "cm",
  "measurementType": "https://schema.org/Width"
},
{% endif %}

Use the same pattern for depth, height, and seat height. Weight conversion (pounds to kilograms: divide by 2.205) uses Liquid's divided_by filter.

Metafield reference table

Metafield keyTypeExample valueNotes
dimensions.width_innumber_decimal84.0Overall width, left to right
dimensions.depth_innumber_decimal37.0Overall depth, front to back
dimensions.height_innumber_decimal33.0Overall height, floor to top
dimensions.seat_height_innumber_decimal17.5Floor to top of seat cushion (seating only)
dimensions.arm_height_innumber_decimal24.0Floor to top of arm rest (seating only)
dimensions.surface_height_innumber_decimal30.0Floor to work surface (desks, tables)
dimensions.weight_lbsnumber_decimal142.0Product weight (not shipping weight)
dimensions.assembly_timesingle_line_text_field"45 minutes"Estimated assembly time for additionalProperty
dimensions.room_typesingle_line_text_field"Living Room"Primary room context for AI attribute matching
dimensions.stylesingle_line_text_field"Mid-Century Modern"Style descriptor for style-filtered queries
dimensions.max_weight_capacitysingle_line_text_field"600 lbs"Structural capacity for additionalProperty

Create these metafield definitions in Shopify Admin under Settings → Custom Data → Products. Set all dimension fields to number_decimal type — this enforces numeric input and prevents text strings from entering dimension fields. Text attribute fields use single_line_text_field.

Common mistakes in furniture dimension schema

MistakeImpactFix
Dimensions only in description text ("84W × 37D × 33H") High — excluded from numeric size-filter queries Add hasMeasurement array with explicit QuantitativeValue objects per dimension
Using the deprecated weight property on Product instead of hasMeasurement Medium — parseable but inconsistent with dimension entries; schema.org recommends hasMeasurement for all physical measurements Move weight into hasMeasurement array with name: "Weight" and measurementType: "https://schema.org/Weight"
Missing unitCode on QuantitativeValue entries High — 84 without a unit is ambiguous; agents cannot determine whether it's inches or centimeters and may exclude the product Add "unitCode": "INH" (or CMT, LBR, KGM) to every QuantitativeValue entry
Expressing dimensions as plain text strings instead of numeric QuantitativeValue High"value": "84 inches" cannot be numerically compared; the value must be a number (84) with unit in unitCode/unitText Use "value": 84, "unitCode": "INH", "unitText": "inches" — value is always a pure number
Omitting Seat Height for sofas and chairs Medium — misses ergonomic queries: "chair with 18-inch seat height for desk use", "low sofa under 16-inch seat height" Add a hasMeasurement entry with "name": "Seat Height" for all seating products

How AI agents use furniture dimension data

The dimension-filtering capability of AI shopping agents works through a structured lookup against indexed product graph data. When the agent receives a query like "find me a dining table that seats 8 and fits in an 8-foot dining room", it:

  1. Parses the constraint: Width < 96 inches (8 feet)
  2. Parses the attribute: seats 8 adults (maps to additionalProperty: Seats or seatingCapacity)
  3. Queries its product index for Product nodes with a hasMeasurement entry where name = "Width", unitCode = "INH", and value < 96
  4. Cross-filters against the seating capacity attribute
  5. Returns matching products with dimension values cited explicitly in its response

Furniture stores that implement hasMeasurement on their full catalog — not just a few hero products — capture the entire surface area of size-constrained queries. Stores that use description text only are invisible to step 3.

Frequently asked questions

What is the hasMeasurement property and how is it different from putting dimensions in the product description?

hasMeasurement is an official schema.org property on the Product type that accepts an array of QuantitativeValue objects. Each entry holds a pure numeric value, a UN/CEFACT unitCode, and a name identifying the dimension. AI shopping agents can extract the number 84 with unit "inches" and compare it directly against a query constraint — no natural language parsing required. Description text like "84 inches wide" requires NLP to extract, cannot reliably distinguish product width from package width, and cannot be used for precise numeric comparisons across different unit systems.

Should I use inches or centimeters in my furniture schema?

Use the unit system your primary market uses, with the correct UN/CEFACT unitCode: INH for inches (US), CMT for centimeters (EU/international). The unitCode enables AI agents to perform automatic unit conversion — a dimension of 213 with unitCode: "CMT" is unambiguously 83.9 inches. For stores serving both markets, output duplicate hasMeasurement entries for each dimension in both unit systems. This is valid schema.org and improves coverage across US and EU size-constrained queries.

How does dimension schema help AI agents filter furniture by size constraints?

AI agents parse numeric constraints from user queries ("sofa under 82 inches wide") and query their product index for Product nodes with matching hasMeasurement entries. The agent looks for a QuantitativeValue with name: "Width", unitCode: "INH", and a value below 82. Products without machine-readable dimension data are excluded from this filtered result set entirely — even if the correct dimensions appear in the description.

How do I express dimensions for modular furniture with configurable sizes?

Use ProductGroup as the outer type with hasVariant children — one Product per configuration. Each child Product has its own hasMeasurement array reflecting that configuration's actual dimensions. Do not express a size range in a single QuantitativeValue. For furniture with custom-order sizing, use hasMeasurement for the standard default size, and add an additionalProperty with name: "Custom Sizing Available" and value: "Yes".

Is the weight property on Product still valid or should I use hasMeasurement for weight too?

The top-level weight property on Product is technically still valid and parseable by AI agents. However, schema.org now recommends hasMeasurement as the unified pattern for all physical measurements including weight. Using hasMeasurement for weight (with measurementType: "https://schema.org/Weight") keeps all physical attributes in one consistent array. For new implementations, use hasMeasurement for everything. If you have existing weight markup, migrating it to hasMeasurement is low-risk and future-proofs your schema.

Related guides

Audit dimension schema coverage across your furniture catalog

CatalogScan scans your Shopify product catalog for missing hasMeasurement entries, absent unitCode values, and dimension markup gaps — then ranks products by impact on size-filtered AI shopping query coverage.

Scan your store free