Skip to main content
Status Sign in

Fitment data model

A fitment is the link between a part and the vehicles it fits. Sounds simple, but the constraints of powersport (submodel precision, multi-year ranges, position-specific applications, free-text caveats) make it less trivial than it looks. This page covers how the data model handles those constraints.

The core shape

Every fitment is a row that links one part to one vehicle. The vehicle is a (model, submodel, year) tuple. Both sides reference the central catalog. The fitment row itself carries the metadata that makes the link meaningful.

vehicleId
FK to a Vehicle row in the central catalog. Vehicle = (modelId, submodel, year).
partId
FK to a Part row in the central catalog. The aftermarket SKU this fitment applies to.
position
Optional. LH, RH, FRONT, REAR, FOUR-CORNER, or other position values that surface on the storefront before the customer hits Buy.
notes
Optional free-text caveat. 'Fits with electric start', 'Before VIN 12345', 'Not compatible with PRO trim'. Surfaced on the storefront product page.

Year ranges in CSV import

Manufacturers and importers typically deliver fitment data as CSV with year ranges, not individual year rows. PowersportOS expands these at import time.

Single year

2024

Creates one fitment row for that year.

Continuous range

2020-2024

Expands to five fitment rows: 2020, 2021, 2022, 2023, 2024.

Range with gaps

2012-2016, 2018-2023

Expands to ten fitment rows. The 2017 gap is preserved, useful for model years that were skipped or where the manufacturer doesn't support that specific year.

Wildcard submodels

Some parts genuinely fit "all submodels of this model+year". A universal-fit air filter that's the same physical part across the Outlander lineup, for example. Creating one fitment row per submodel would be both noise and a maintenance hazard (forget to add a row when a new submodel ships, and that submodel mysteriously stops returning the part).

PowersportOS supports an empty-submodel Vehicle row that means "wildcard, matches all submodels of this model+year". One fitment to a wildcard vehicle covers every submodel without listing them individually.

At YMM query time, the platform queries for (model+submodel+year) matches AND (model+year, submodel=NULL) wildcard matches in the same lookup. Customer sees the part either way.

Position and notes

Two fields turn a basic "X fits Y" fitment into something the customer can act on confidently.

Position

For parts with left/right or front/rear variants, the fitment row specifies which side. The most common values:

LH / RH
Left-hand / right-hand. Often used for hand controls, mirrors, side panels, etc.
FRONT / REAR
Front or rear axle / suspension / brake position.
FOUR-CORNER
ATV/UTV-specific, applies to all four wheel positions equally. Brake pads sold as a four-corner set, for instance.
Free text
Custom values for less-standard positions ('inner ring', 'idler', 'pivot bushing').

Notes

Free-text caveat that surfaces on the storefront product page before the customer hits Buy. Examples that prevent real wrong-part returns:

  • "Fits only with electric-start variant"
  • "Before VIN 5JX12345"
  • "Not compatible with the optional sport-tuned shock package"
  • "Requires hardware kit X-12345 sold separately"

Notes are intentionally free-text rather than a structured enum. The compatibility caveats in powersport are too varied to fit a fixed taxonomy, and the value is to the end customer who reads them as English (or Swedish, German, etc. in localised storefronts).

How fitments flow to the storefront

When a customer hits a product page, the storefront fetches the part's full fitment list. The PowersportOS Shopify theme renders it as a structured table: "Fits these vehicles", with vehicle column, year-range column, position column, and notes column. The customer can scan it and confirm their vehicle is in the list, or, if their vehicle isn't there, walk away before placing an order that would have to come back.

The same fitment data feeds the YMM widget: customer picks (Year, Make, Model, Submodel) and gets back the parts whose fitments match. Same underlying data, two surfaces.