VIN Lookup in Odoo: What the Fleet App Does and How to Add Decoding
If you are looking for vehicle VIN lookup in Odoo, the short answer is that standard Odoo stores and searches VINs but does not decode them. In the Fleet app, each vehicle record has a field for the vehicle identification number, labeled Chassis Number in many versions. You can type a VIN into that field and find the vehicle later by searching for it. Odoo does not, out of the box, read a VIN and fill in the make, model, model year or assembly plant for you. Automatic decoding requires a third-party module from the Odoo app ecosystem or a custom integration with an outside VIN decoding service. Field labels and menus vary between Odoo versions and editions, so check them against your own installation.
What "VIN lookup" can mean in Odoo
People use the phrase for three different tasks, and Odoo handles each one differently.
Finding a record by VIN: searching your own Fleet database for a vehicle whose VIN you already have. Standard Odoo supports this. Validating a VIN: checking that a typed VIN has the right length, uses allowed characters and passes the check digit test. Standard Odoo does not do this; it can be added with a small customization. Decoding a VIN: turning the 17 characters into readable vehicle attributes such as manufacturer, model, model year, body style, engine and assembly plant. This needs an external data source, either a decoding service or a commercial vehicle database, connected through a module or custom code.
How the Fleet app stores the VIN
In Odoo's Fleet module, the vehicle model (technically fleet.vehicle) has a character field commonly named vin_sn, shown in the interface as Chassis Number. It sits beside fields such as license plate, vehicle model, model year, color, fuel type and transmission. These attributes are entered by hand or come from the vehicle model you select. The VIN field does not populate them.
Because the field is ordinary text, you can filter and search the vehicle list by it. Standard Odoo does not check the format of a VIN or block duplicates by default. A mistyped character, such as the letter O entered in place of the digit 0, is saved without warning. Organizations that rely on VINs for maintenance history, insurance or resale records often add validation for this reason.
What a VIN actually encodes
Knowing the VIN's structure helps you judge what any decoder, inside or outside Odoo, can realistically return. For vehicles sold in the US, the modern 17-character format has been standard since the 1981 model year. Its positions break down as follows.
Positions | Name | What it identifies; 1–3 | World Manufacturer Identifier (WMI) | Country or region and manufacturer; sometimes vehicle type; 4–8 | Vehicle Descriptor Section | Manufacturer-defined attributes such as model line, body type, restraint system and engine; 9 | Check digit | A calculated digit used to detect transcription errors (required for North American vehicles); 10 | Model year | A coded character for the model year; 11 | Plant code | The assembly plant, as defined by the manufacturer; 12–17 | Serial / production sequence | The individual vehicle's sequence number
The VIN alphabet excludes the letters I, O and Q to avoid confusion with 1 and 0. The model year character in position 10 repeats on a 30-year cycle, so it cannot always distinguish, for example, 1990 from 2020 by itself. For North American passenger vehicles, position 7 helps resolve this: a digit there generally indicates the earlier cycle, and a letter indicates the later one. That rule does not apply to all vehicle types or markets.
What a VIN does not reliably tell you
Expectations matter when you choose a decoding approach. Positions 4–8 are defined by each manufacturer, so the detail they carry varies by brand, model year and market. In many cases the VIN alone will not give you:
Trim code or trim level: some manufacturers encode it, many do not, or encode it only partially. Full factory equipment: options, packages, paint codes and interior choices are usually held in the manufacturer's build records, not in the VIN. Market specification: emissions certification, lighting and other regional differences are often not visible from the VIN, especially for imported or gray-market vehicles. Modifications or current condition: a VIN describes the vehicle as built, not as it is today.
Decoders that return trim, options or equipment lists are usually drawing on proprietary build data rather than the VIN itself. Their coverage and accuracy depend on that data source. Treat such fields as supplier-provided information that may need checking, especially for older, low-volume or non-US-market vehicles.
Ways to add VIN decoding to Odoo
There are three realistic paths, depending on budget, fleet size and how much the decoded detail matters.
Third-party Odoo modules: the Odoo app ecosystem includes community and commercial modules that add a decode button or automatic decoding to Fleet vehicle records. Before installing one, check which Odoo versions it supports, which decoding service it relies on and whether that service has usage limits or fees. Custom integration: a developer can extend the Fleet vehicle model to call a decoding service when a VIN is entered, then map the response into Odoo fields. For US-market vehicles, the US government's National Highway Traffic Safety Administration publishes a free public VIN decoding service based on manufacturer-submitted data. Commercial providers typically offer deeper equipment and trim data. Manual decoding: for small fleets, decoding VINs outside Odoo and entering the results by hand is workable. Adding automated validation still helps catch typing errors.
How an integrated lookup usually works
Whichever module or custom build you use, the workflow inside Odoo tends to follow the same pattern:
A user enters or scans the VIN on the vehicle form. Odoo checks the format and check digit before calling any outside service. The VIN is sent to the decoding service, and the response is parsed. Returned values such as make, model and model year are matched to existing Odoo vehicle brands and models, or new ones are created. Fields Odoo has no place for, such as plant or engine details, are stored in custom fields or a notes area. The user reviews the result before saving, especially fields the decoder marks as uncertain or leaves empty.
Example: validating a VIN check digit
Validation is the easiest improvement to add and needs no external service. The function below applies the standard North American check digit calculation. A developer could call it from a constraint on the Fleet vehicle model. Vehicles built for some other markets do not use a check digit, so a failed check on a non-North-American VIN does not necessarily mean the VIN is wrong.
VALUES = {; **{str(d): d for d in range(10)},; 'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8,; 'J': 1, 'K': 2, 'L': 3, 'M': 4, 'N': 5, 'P': 7, 'R': 9,; 'S': 2, 'T': 3, 'U': 4, 'V': 5, 'W': 6, 'X': 7, 'Y': 8, 'Z': 9,; }; WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2]; def vin_check_digit_ok(vin): vin = (vin or '').strip().upper(); if len(vin) != 17 or any(c not in VALUES for c in vin): return False # wrong length, or contains I, O, Q or other invalid characters; total = sum(VALUES[c] * w for c, w in zip(vin, WEIGHTS)); remainder = total % 11; expected = 'X' if remainder == 10 else str(remainder); return vin[8] == expected
Example: finding a vehicle by VIN from outside Odoo
If another system, such as a shop management tool or an intake script, needs to look up a vehicle in Odoo by VIN, Odoo's external API can search the Fleet records. The connection details below are placeholders read from environment variables. The field name assumes the standard vin_sn field, so confirm it in your version.
import os; import xmlrpc.client; url = os.environ['ODOO_URL']; db = os.environ['ODOO_DB']; user = os.environ['ODOO_USER']; key = os.environ['ODOO_API_KEY']; common = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/common'); uid = common.authenticate(db, user, key, {}); models = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/object'); vin = '1HGCM82633A004352' # example VIN; vehicles = models.execute_kw(; db, uid, key, 'fleet.vehicle', 'search_read',; [[['vin_sn', '=', vin]]],; {'fields': ['name', 'license_plate', 'model_id', 'model_year']},; ); print(vehicles)
Choosing the right approach
If you only need to record VINs and find vehicles by them, standard Fleet already does the job. Adding check digit validation is a low-effort way to improve data quality. If you manage a growing fleet and want make, model and model year filled in automatically, a maintained third-party module is usually the quickest route. Confirm that it supports your Odoo version and that you understand any decoding service costs. If you need trim, factory equipment or market-specific detail, the data source matters more than the Odoo module. Evaluate the provider's coverage for the brands, model years and markets in your fleet. For maximum control over field mapping and data handling, a custom integration is the most flexible option, at the cost of development and upkeep.
