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.