Dev.to WebDev 🛠 Dev 👁 0 📖 5 min read

Plant Code (VIN Position 11): Why the Same Make Can Mean Different Factories

Position 11 of a 17-character VIN is the plant code: one character that names the factory where the vehicle was assembled. It looks minor next to the WMI and the model-year digit, but it is what turns "a Honda Civic" int

Position 11 of a 17-character VIN is the plant code: one character that names the factory where the vehicle was assembled. It looks minor next to the WMI and the model-year digit, but it is what turns "a Honda Civic" into "a Civic from this plant, not that one."

Two cars with the same make and model can leave different factories. This post covers what position 11 means, why it is not a global lookup table, how NHTSA vPIC exposes plant geography, and how to use plant data with the WMI.

Where position 11 sits

Under ISO 3779 / 49 CFR 565, a modern North American VIN looks like this:

Positions Name Job
1-3 WMI World Manufacturer Identifier
4-8 VDS (descriptor) Model / series / body / restraint / engine encoding
9 Check digit Validation character
10 Model year Encoded year code
11 Plant Manufacturer plant code
12-17 Serial Production sequence

Positions 10-17 are the VIS: model year (10), plant (11), and serial (12-17). Small-volume makers use 12-14 to continue manufacturer identity.

The plant code is one letter or digit from the manufacturer. Honda's A is not Toyota's A. Same letter, different cities - and one brand can use many letters across many plants.

Manufacturer-specific, not universal

Plant codes are manufacturer-specific. There is no public global plant-code registry you can download once and trust forever. Each manufacturer (each entity filing VIN structure with regulators) defines what position 11 means for its WMI family. When a plant opens, closes, or shifts production, the mapping for new model years can change even if older VINs keep the old meaning.

If your code maps plantCode "H" to a city without checking the manufacturer, you are guessing. The correct lookup unit is (manufacturer / WMI context, plant code), not the character alone.

Same brand, many factories

Large brands assemble the same nameplate in more than one place - U.S., Canadian, Mexican, or overseas lines depending on year and market.

Why "same make" does not mean "same factory":

  • Multiple plants per brand. One marketing brand can carry many plant codes.
  • Multiple WMIs per brand. Regional production often uses different WMIs even when the grille badge matches.
  • Contract assembly and joint ventures. The legal manufacturer on the WMI may not be the brand the buyer recognizes; the plant still belongs to whoever filed the VIN structure.

For buyers, plant can matter for parts catalogs and recall campaigns. For developers, it is a structured field to store and display - not free-text folklore about which factory is "best."

What NHTSA vPIC returns

For U.S.-relevant vehicles you do not need a private plant atlas. NHTSA's free vPIC API resolves plant geography when it has a match.

Endpoints live under https://vpic.nhtsa.dot.gov/api/vehicles/ and need no API key:

GET /api/vehicles/DecodeVinValues/{VIN}?format=json

In Results[0], look for:

  • PlantCity
  • PlantState
  • PlantCountry
  • PlantCompanyName (when populated)

These are the human-readable side of position 11. The API uses manufacturer tables on file to map the plant character (in context of the rest of the VIN) to city, state/province, and country.

type PlantFields = {
  VIN: string;
  Make: string;
  Model: string;
  ModelYear: string;
  PlantCity: string;
  PlantState: string;
  PlantCountry: string;
  PlantCompanyName: string;
  ErrorCode: string;
  ErrorText: string;
};

const BASE = "https://vpic.nhtsa.dot.gov/api/vehicles";

export async function decodePlant(vin: string): Promise<PlantFields> {
  const url = `${BASE}/DecodeVinValues/${encodeURIComponent(vin)}?format=json`;
  const res = await fetch(url);
  if (!res.ok) throw new Error(`vPIC error ${res.status}`);
  const data = (await res.json()) as { Results: PlantFields[] };
  return data.Results[0];
}

const row = await decodePlant("1HGBH41JXMN109186");
console.log(row.PlantCity, row.PlantState, row.PlantCountry);

Empty strings are normal: a blank PlantCity means no mapping in vPIC, not "no plant." Coverage is strongest for the U.S. market.

Using plant + WMI together

Plant data is most useful next to the WMI (positions 1-3), not in isolation.

Buyers: Decode and confirm make/model/year match the listing. Read plant city and country alongside WMI region - a domestic WMI with a U.S. plant is a different production story from an import under the same model name. Use plant for parts and campaigns, not as a quality score. Plant is factory identity, not title history; salvage brands and odometer issues live elsewhere.

Developers: Validate length, charset, and check digit before calling the API. Persist PlantCity, PlantState, and PlantCountry next to WMI and model year. Never ship a static Map<plantChar, city> keyed only on position 11. If you filter inventory by geography, filter on resolved fields (and constrain by manufacturer), not on the raw character alone. When WMI and plant disagree with a seller's typed brand, show a soft warning - do not silently "correct" the listing.

function plantSummary(row: PlantFields): string {
  const parts = [row.PlantCity, row.PlantState, row.PlantCountry]
    .map((s) => s?.trim())
    .filter(Boolean);
  return parts.length ? parts.join(", ") : "Plant unknown to vPIC";
}

Pitfalls (not a global registry)

No universal alphabet. Reusing the letter A across brands is expected. A "complete list of VIN plant codes" presented as ISO-wide is misleading.

Mappings change. A code that meant Plant X in 2012 might mean Plant Y later under the same maker. Prefer API resolution per VIN over a frozen spreadsheet.

WMI is not the plant. Position 1 hints at region; position 11 names the factory. Use both.

Small manufacturers. Under small-volume rules, positions 12-14 continue identity. Do not assume 12-17 are always a pure serial.

Blank plant fields. Missing geography often means incomplete table coverage, not a bad VIN.

U.S.-centric strength. vPIC is a U.S. regulatory product. Treat non-U.S. plant resolution as helpful when present.

Plant is not proof of legitimacy. A resolved city does not prove the VIN was never cloned. Combine check digit, WMI/make consistency, and (for purchases) title and history sources.

Wrapping up

Position 11 is a one-character pointer into a manufacturer-owned plant map. Same make, different factories - that is normal. Decode through NHTSA vPIC when you can, store the plant geography fields, and always read the plant code in WMI context. Skip the fantasy of a single global plant-code registry; the authoritative mapping lives in the manufacturer tables the API already consults.

I maintain VIN Lookup, a free decode based on NHTSA data. If you want to see plant city and the rest of a VIN without wiring the API yourself, it is there to try.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.