Optimization Guide
Shopify Vehicle Parts Fitment Schema — Compatibility Structured Data for Auto Parts Stores
AI shopping agents fielding "will these brake pads fit my 2019 Honda Civic EX?" can't answer from a product title. They need machine-readable fitment data: compatibleWith Vehicle objects that declare year, make, model, trim, engine, and drive type. Shopify's default JSON-LD outputs none of this — leaving every auto parts listing indistinguishable from general merchandise.
Product with compatibleWith pointing to an array of Vehicle objects (one per year/make/model combination). Add additionalProperty PropertyValue entries for fitment summary attributes (Compatible Year Range, Compatible Make, Compatible Model, Compatible Engine, Position). Always include mpn — it is the primary cross-store part identifier AI agents use for comparison queries. Store fitment data in a fitment.* metafield namespace and loop over it in Liquid.
The Auto Parts AI Visibility Problem
Auto parts shopping generates some of the most precise, vehicle-specific queries in e-commerce: "front brake pads for 2018-2022 Honda Civic 1.5T FWD," "K&N air filter for 2020 Toyota Camry 2.5L LE," "OEM oil filter for 2022 Ford F-150 5.0 V8." These queries carry simultaneous filter requirements — year range, make, model, engine displacement, trim, and position — that are unresolvable without structured fitment data.
Schema.org has no dedicated "fitment" type, but its Product, Vehicle, and PropertyValue primitives are sufficient to express compatibility in a form AI agents can parse. The key is compatibleWith: a property on Product that accepts an array of Vehicle typed objects. Each Vehicle entry declares the year, make, model, trim, engine, fuel type, and drive configuration for a single compatible vehicle.
Without compatibleWith, an AI agent answering a fitment query has three options: refuse to confirm compatibility, caveat heavily ("check your vehicle manual"), or surface a competitor's listing that has structured fitment data. None of those outcomes benefit your store.
Auto parts query types requiring structured fitment data
| Query type | Example | Required schema signal | AI agent behavior without it |
|---|---|---|---|
| Year/make/model fitment | "brake pads for 2019 Honda Civic" | compatibleWith Vehicle with brand Honda, model Civic, vehicleModelDate "2019" |
Cannot confirm compatibility; surfaces parts with verified fitment data instead |
| Trim-specific fitment | "air filter for 2020 Civic EX" | Vehicle with vehicleConfiguration: "EX" |
Recommends part as "may fit" without trim confirmation |
| Engine displacement query | "oil filter for 2022 Camry 2.5L" | EngineSpecification with engineDisplacement 2.5 LTR | Cannot distinguish 2.5L from 3.5L variants; recommends wrong part |
| Position-specific query | "front driver side caliper 2018 Accord" | additionalProperty: Position: Front |
Cannot distinguish front vs. rear; may recommend rear caliper |
| Cross-reference by part number | "Brembo 09.B316.10 price" | mpn: "09.B316.10" |
Cannot match query to product; listing invisible in part-number comparison |
Complete JSON-LD Example: Brake Pads with Three Compatible Vehicles
This is a realistic brake pad product (Brembo front brake pads) compatible with three Honda Civic configurations. Each compatibleWith entry is a fully specified Vehicle object. The additionalProperty block provides summary fitment attributes for agents that read property tables rather than traversing the full vehicle array:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Brembo P28056N Front Brake Pads — 2016-2021 Honda Civic",
"description": "OE Replacement front disc brake pads for 2016-2021 Honda Civic 1.5T and 2.0L. Low-dust semi-metallic compound. Includes hardware kit.",
"mpn": "P28056N",
"gtin13": "0082736280567",
"brand": {
"@type": "Brand",
"name": "Brembo"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Compatible Year Range",
"value": "2016-2021"
},
{
"@type": "PropertyValue",
"name": "Compatible Make",
"value": "Honda"
},
{
"@type": "PropertyValue",
"name": "Compatible Model",
"value": "Civic"
},
{
"@type": "PropertyValue",
"name": "Compatible Engine",
"value": "1.5L Turbocharged I4, 2.0L Naturally Aspirated I4"
},
{
"@type": "PropertyValue",
"name": "Compatible Trim",
"value": "LX, Sport, EX, EX-L, Touring, Si"
},
{
"@type": "PropertyValue",
"name": "OEM Part Number",
"value": "45022-TBA-A00"
},
{
"@type": "PropertyValue",
"name": "Position",
"value": "Front"
},
{
"@type": "PropertyValue",
"name": "Drive Type",
"value": "FWD"
},
{
"@type": "PropertyValue",
"name": "Part Type",
"value": "Aftermarket"
}
],
"compatibleWith": [
{
"@type": "Vehicle",
"name": "Honda Civic 2018 EX Sedan",
"brand": { "@type": "Brand", "name": "Honda" },
"model": "Civic",
"vehicleModelDate": "2018",
"vehicleConfiguration": "EX Sedan 1.5T",
"driveWheelConfiguration": "https://schema.org/FrontWheelDriveConfiguration",
"fuelType": "Gasoline",
"vehicleTransmission": "CVT",
"vehicleEngine": {
"@type": "EngineSpecification",
"engineDisplacement": {
"@type": "QuantitativeValue",
"value": 1.5,
"unitCode": "LTR"
},
"engineType": "Turbocharged Inline-4",
"fuelType": "Gasoline"
}
},
{
"@type": "Vehicle",
"name": "Honda Civic 2019 Sport Hatchback",
"brand": { "@type": "Brand", "name": "Honda" },
"model": "Civic",
"vehicleModelDate": "2019",
"vehicleConfiguration": "Sport Hatchback 1.5T",
"driveWheelConfiguration": "https://schema.org/FrontWheelDriveConfiguration",
"fuelType": "Gasoline",
"vehicleTransmission": "6-Speed Manual",
"vehicleEngine": {
"@type": "EngineSpecification",
"engineDisplacement": {
"@type": "QuantitativeValue",
"value": 1.5,
"unitCode": "LTR"
},
"engineType": "Turbocharged Inline-4",
"fuelType": "Gasoline"
}
},
{
"@type": "Vehicle",
"name": "Honda Civic 2021 LX Sedan",
"brand": { "@type": "Brand", "name": "Honda" },
"model": "Civic",
"vehicleModelDate": "2021",
"vehicleConfiguration": "LX Sedan 2.0",
"driveWheelConfiguration": "https://schema.org/FrontWheelDriveConfiguration",
"fuelType": "Gasoline",
"vehicleTransmission": "CVT",
"vehicleEngine": {
"@type": "EngineSpecification",
"engineDisplacement": {
"@type": "QuantitativeValue",
"value": 2.0,
"unitCode": "LTR"
},
"engineType": "Naturally Aspirated Inline-4",
"fuelType": "Gasoline"
}
}
],
"offers": {
"@type": "Offer",
"price": "49.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
}
}
Vehicle Schema Properties Reference
The Vehicle type (a subtype of Product in schema.org) provides structured fields for every dimension of fitment data that auto parts queries require. Use these on each object in your compatibleWith array:
| Property | Type | Example value | Notes |
|---|---|---|---|
brand |
Brand | {"@type":"Brand","name":"Honda"} |
Vehicle manufacturer brand — distinct from the parts brand on the Product |
model |
Text | "Civic", "Camry", "F-150" | Model name without year or trim |
vehicleModelDate |
Text | "2019" | Always a string, not an integer. "2019" not 2019. For ranges: "2016-2021" |
vehicleConfiguration |
Text | "EX Sedan 1.5T", "Sport Plus AWD" | Free-text trim + body + engine descriptor for the specific configuration |
driveWheelConfiguration |
URL or Text | https://schema.org/FrontWheelDriveConfiguration |
Use schema.org enum URLs; see driveWheelConfiguration table below |
fuelType |
Text or URL | "Gasoline", "Diesel", "Electric", "Hybrid" | Identifies fuel system relevant to filter and emissions parts |
vehicleTransmission |
Text | "CVT", "6-Speed Manual", "8-Speed Automatic" | Transmission type; relevant for clutch, transmission, and drivetrain parts |
vehicleEngine |
EngineSpecification | See EngineSpecification pattern below | Nested object with engineDisplacement QuantitativeValue and engineType |
vehicleIdentificationNumber |
Text | "1HGCV1F31JA012345" | Only use on VIN-specific pages — do not use a placeholder on general fitment pages |
driveWheelConfiguration enum values
| Drive type | schema.org URL | Common text equivalent |
|---|---|---|
| Front-wheel drive | https://schema.org/FrontWheelDriveConfiguration |
FWD |
| Rear-wheel drive | https://schema.org/RearWheelDriveConfiguration |
RWD |
| All-wheel drive | https://schema.org/AllWheelDriveConfiguration |
AWD |
| Four-wheel drive | https://schema.org/FourWheelDriveConfiguration |
4WD / 4x4 |
EngineSpecification pattern
Use vehicleEngine with a nested EngineSpecification object whenever engine displacement is a fitment dimension — which it is for most filters, fuel systems, and intake/exhaust parts:
"vehicleEngine": {
"@type": "EngineSpecification",
"engineDisplacement": {
"@type": "QuantitativeValue",
"value": 2.5,
"unitCode": "LTR"
},
"engineType": "Naturally Aspirated Inline-4",
"fuelType": "Gasoline"
}
For diesel engines, set both fuelType: "Diesel" on the EngineSpecification and on the parent Vehicle object. For hybrid powertrains, use fuelType: "Hybrid" and add a separate vehicleEngine describing the combustion component if relevant to the part's fitment.
additionalProperty Fitment Reference Table
The additionalProperty array on the Product object carries summary-level fitment attributes. These complement the detailed Vehicle objects in compatibleWith — AI agents that read property tables rather than traversing nested arrays use these values to answer year/make/model summary queries rapidly:
| PropertyValue name | Example value | Purpose |
|---|---|---|
| Compatible Year Range | "2018-2022" | Year span for quick year-range filter queries; use "2016-2021" for a single continuous range |
| Compatible Make | "Honda" | Vehicle manufacturer; use multiple entries for multi-make parts |
| Compatible Model | "Civic" | Model name; multiple entries for cross-model fitment (e.g., "Civic", "Integra") |
| Compatible Engine | "1.5L Turbocharged I4" | Human-readable engine descriptor; complements EngineSpecification in Vehicle |
| Compatible Trim | "LX, Sport, EX, EX-L" | Comma-separated list of compatible trims for quick trim-level filtering |
| OEM Part Number | "45022-TBA-A00" | Original equipment part number for cross-reference lookup; use alongside mpn |
| Position | "Front" or "Rear" | Installation position; use "Front", "Rear", "Left", "Right", "Front Left", "Rear Right", etc. |
| Drive Type | "FWD" | Text summary of driveWheelConfiguration for quick drive-type filter queries |
| Part Type | "OEM" or "Aftermarket" | Distinguishes genuine OEM from aftermarket replacement for part-type filter queries |
Shopify Metafield Namespace for Fitment Data
Store fitment attributes in a dedicated fitment namespace. Use JSON list metafield types for multi-value attributes (makes, models) and single-line text for scalar values (position, OEM part number). Loop over compatible vehicles from a fitment.compatible_vehicles JSON list metafield — one object per vehicle:
| Metafield key | Type | Example value |
|---|---|---|
fitment.compatible_years |
Single-line text | "2018-2022" |
fitment.compatible_makes |
JSON (list of strings) | ["Honda","Acura"] |
fitment.compatible_models |
JSON (list of strings) | ["Civic","ILX"] |
fitment.compatible_engines |
Single-line text | "1.5L Turbocharged I4, 2.0L I4" |
fitment.oem_part_number |
Single-line text | "45022-TBA-A00" |
fitment.position |
Single-line text | "Front" |
fitment.drive_type |
Single-line text | "FWD" |
fitment.compatible_vehicles |
JSON (list of objects) | [{"year":"2019","make":"Honda","model":"Civic","trim":"EX","engine":"1.5T","transmission":"CVT","drive":"FWD"}] |
Shopify Liquid template — full fitment JSON-LD
Gate on a product tag (auto-part) to avoid injecting Vehicle fitment schema on non-parts products. Loop over the fitment.compatible_vehicles JSON list to build the compatibleWith array. Handle the driveWheelConfiguration mapping from text shorthand to schema.org enum URLs within the loop:
{% if product.tags contains 'auto-part' %}
{% assign fitment = product.metafields.fitment %}
{% assign vehicles = fitment.compatible_vehicles.value %}
{% endif %}
Common Mistakes
1. Not including compatibleWith at all
The most damaging omission. Without compatibleWith, an AI agent answering "will these brake pads fit my 2019 Honda Civic EX?" has no machine-readable fitment signal to work with. Your part appears identical to a universal-fit product — or to a competitor's part that happens to be mentioned alongside a Civic in a review. Every auto parts product page that has fitment data must output that data in compatibleWith. Encoding it only in the product title ("2016-2022 Honda Civic Brake Pads") leaves AI agents unable to resolve structured fitment queries.
2. Using plain text in name instead of structured compatibleWith + additionalProperty
Titles like "Fits 2016-2022 Honda Civic / 2017-2021 Acura ILX Front Brake Pads" contain fitment information, but it is packed into an unstructured string with forward-slashes, em-dashes, and inconsistent delimiters that AI agents and parsers cannot reliably decompose. Structured data works precisely because the year is in vehicleModelDate, the make is in brand.name, and the model is in model — each in a declared typed field that requires no NLP to interpret.
3. Using vehicleModelDate as an integer instead of a string
Schema.org specifies vehicleModelDate as a Text value. The year must be a quoted string — "vehicleModelDate": "2019" — not an integer "vehicleModelDate": 2019. Structured data validators flag the integer form as a type error. For year ranges, use "2016-2021" as a single string value rather than separate minYear/maxYear fields, which are not part of the Vehicle schema.
4. Setting brand to the vehicle brand instead of the parts brand
The brand property on the root Product object belongs to the parts manufacturer — Brembo, ACDelco, K&N, Bosch, NGK. The vehicle manufacturer's brand (Honda, Toyota, Ford) belongs inside each Vehicle object in the compatibleWith array. Setting brand: Honda on an aftermarket brake pad signals that the part is a genuine Honda OEM part, misleading both AI agents and shoppers comparing OEM versus aftermarket options.
5. Omitting mpn
MPN (manufacturer part number) is the primary cross-store comparison key for auto parts. When a shopper asks an AI agent "compare prices for Brembo P28056N," the agent looks for mpn: "P28056N" to identify which product listings are the same part. Without mpn, your listing is invisible in part-number comparison queries — one of the highest-intent query types in auto parts shopping. SKU is insufficient; SKUs are store-specific and non-transferable. MPN is universally recognized across stores, catalogs, and fitment databases.
Common Mistakes — Quick Reference
| Mistake | Incorrect pattern | Correct pattern |
|---|---|---|
Missing compatibleWith |
No fitment data in JSON-LD; fitment only in product title | "compatibleWith": [{"@type":"Vehicle", ...}] array with one Vehicle per compatible vehicle |
| Unstructured fitment in name | "name": "Fits 2016-22 Civic / ILX Brake Pads" |
Clean name + structured compatibleWith array + additionalProperty fitment summary |
| Integer vehicleModelDate | "vehicleModelDate": 2019 |
"vehicleModelDate": "2019" (always a quoted string) |
| Wrong brand on Product | "brand": {"name": "Honda"} on an aftermarket Brembo part |
"brand": {"name": "Brembo"} on Product; Honda brand inside Vehicle objects |
Missing mpn |
No mpn; only store SKU in sku field |
"mpn": "P28056N" using the manufacturer's universal part number |
| VIN on general fitment page | "vehicleIdentificationNumber": "1HGCV1F31JA012345" on a page fitting 200 vehicles |
Omit VIN; only use on VIN-specific pages generated for a single known vehicle |
Frequently Asked Questions
How do I express multi-vehicle compatibility when a part fits 47 different year/make/model combinations?
Use an array of Vehicle objects in compatibleWith — one object per distinct year/make/model/trim combination. For parts with large fitment datasets (100+ vehicles), you can group by generation where all trims in a range share identical fitment — use "vehicleModelDate": "2016-2021" as a range string rather than six separate year entries. Always pair the full compatibleWith array with additionalProperty fitment summaries (Compatible Year Range, Compatible Make, Compatible Model) so agents have both granular Vehicle-level and summary-level data.
What is the difference between mpn and gtin for auto parts?
MPN (manufacturer part number) is assigned by the parts manufacturer — Brembo's "P28056N", ACDelco's "ACT905". GTIN (gtin13, gtin12, gtin8) is a universal barcode identifier issued by GS1. For auto parts, mpn is the more critical identifier: AI agents use it to match identical parts across stores for price comparison queries. Many aftermarket parts have mpns but no GTIN/UPC. Always populate mpn if you have it. If the part has both a manufacturer MPN and an OEM cross-reference number, put the manufacturer MPN in mpn and the OEM number in an additionalProperty with name "OEM Part Number".
How does vehicle fitment schema help AI shopping agents recommend my parts?
AI agents handling fitment queries ("best brake pads for 2019 Honda Civic EX") match the user's vehicle against structured compatibleWith Vehicle objects in your product schema. With fitment data, the agent can confirm compatibility and recommend your product with confidence. Without it, the agent cannot verify the fit and either surfaces a competitor with structured data or adds heavy compatibility caveats that suppress purchase intent. Fitment schema is the single highest-ROI schema addition for auto parts stores — it directly enables the core query type that drives parts purchases.
Should I use vehicleIdentificationNumber (VIN) in my parts schema?
Only use vehicleIdentificationNumber on VIN-specific pages — a dynamic fitment confirmation page generated after a user enters their VIN, or a rebuild kit page for a single documented classic car. Do not use VIN on general product pages for parts that fit a year/make/model range. A brake pad fitting all 2018-2022 Honda Civics does not have a VIN. Placeholder VINs mislead validation tools and crawlers. For the vast majority of auto parts pages, use vehicleModelDate + brand + model + vehicleConfiguration instead.
How do I handle OEM vs. aftermarket part distinctions in structured data?
Add an additionalProperty with name "Part Type" and value "OEM" or "Aftermarket". For OEM parts, set brand to the vehicle manufacturer's genuine parts brand (e.g., "Honda Genuine Parts") and use mpn for the OEM part number. For aftermarket parts, set brand to the parts manufacturer (Brembo, Bosch, K&N) and mpn to their number. If the aftermarket part replaces an OEM part, include the OEM number in a separate additionalProperty named "OEM Part Number" — this enables cross-reference queries while keeping the primary brand attribution accurate.