Most QBCore tutorials start from a car that is already "FiveM ready". This one starts a step earlier, with a vehicle page on gta5-mods.com, and ends with that car for sale in qb-vehicleshop and showing its proper name in qb-garages.
You need: a QBCore server you can restart, file access to its resources folder, and an account with the QBCore admin permission for the test spawn. The examples use a car whose spawn name is gtr35; replace it with yours everywhere.
Note
The snippets below match qb-core 1.3.0 (see Sources). Older qb-core versions used a different layout for the same file. If the entries already in your vehicles.lua do not look like the ones shown here, copy the shape of your file's existing entries instead.
Step 1: Convert the car and note the spawn name
Paste the gta5-mods.com page link into the converter and download the zip. The first 3 conversions are free; after that it is a one-time $15 for unlimited conversions. Add-on cars convert best, see add-on conversions for what that means.
Inside the zip is one resource folder:
gtr35/
├── fxmanifest.lua
├── common/ vehicles.meta, handling.meta, carcols.meta, carvariations.meta
└── stream/ gtr35.yft, gtr35_hi.yft, gtr35.ytd, ...The spawn name is the <modelName> value in common/vehicles.meta, which is also the name of the main .yft file in stream/. Write it down in lowercase. If you would rather not open the file, drop the zip into the Resource Inspector and read it there. More background: spawn name and model hash.
Step 2: Install the resource and ensure it
Create a category folder for your cars and put the resource in it:
resources/
└── [cars]/
└── gtr35/
├── fxmanifest.lua
├── common/
└── stream/Folders in square brackets are categories, not resources, so one line in server.cfg starts every car inside:
ensure qb-core
ensure [qb]
ensure [standalone]
ensure [cars]The first three lines are from the QBCore txAdmin recipe and are probably already in your file; only ensure [cars] is new. If you manage the server through txAdmin, installing cars via txAdmin shows where each of these clicks lives.
Step 3: Check that it spawns before touching the framework
Restart the server (or run refresh and then ensure gtr35 in the console), join, and run:
/car gtr35/car is a qb-core admin command. If the car appears with textures, the resource is fine and everything left is configuration. If it does not, stop here: no vehicles.lua entry will fix a resource that is not streaming. Go to the invisible car guide or paste the console output into the Error Analyzer.
Step 4: Add the car to qb-core/shared/vehicles.lua
Open resources/[qb]/qb-core/shared/vehicles.lua. The file is one long list called Vehicles, one entry per line. Add yours inside that list, before its closing } (the one just above QBCore.Shared.VehicleHashes):
--- Custom cars
{ model = 'gtr35', name = 'GT-R R35', brand = 'Nissan', price = 185000, category = 'sports', type = 'automobile', shop = 'pdm' },| Key | What to put there |
|---|---|
model | The spawn name from step 1, lowercase. Everything else looks the car up by this exact string. |
name | Display name in the shop menu and the garage list. |
brand | Manufacturer. Used as the "make" list when Config.FilterByMake is on in qb-vehicleshop. |
price | A number, no quotes. |
category | One of the categories already used in the file, such as compacts, sedans, suvs, coupes, muscle, sports, sportsclassics, super, offroad, vans, motorcycles. |
type | automobile for cars. The stock file also uses bike, boat, heli and plane. |
shop | The key of a shop in qb-vehicleshop's Config.Shops. |
You do not write a hash. The loop at the bottom of the file calls joaat(model) for every entry and fills QBCore.Shared.VehicleHashes itself.
To sell the car in more than one shop, use a table: shop = { 'pdm', 'luxury' }. To register the name without selling the car anywhere (a staff or job vehicle), use shop = 'none', as the stock file does for its non-sale vehicles.
Warning
Every entry ends with a comma and every string needs both quotes. One missing comma is a Lua syntax error in a file that qb-core loads at startup, and the whole framework fails to start. If the server breaks right after this edit, look at the line you just added first.
Step 5: Match the shop key to qb-vehicleshop
Open resources/[qb]/qb-vehicleshop/config.lua and look at the keys of Config.Shops. The stock config has pdm, luxury, boats, air and truck. The shop value from step 4 must be one of those keys, spelled the same way.
Two things worth knowing about the stock shops:
pdmhas['Type'] = 'free-use': any player can walk in and buy.luxuryhas['Type'] = 'managed'and['Job'] = 'cardealer': a player with that job has to sell the car. Putting your car there and then testing alone looks exactly like "the car is not showing".
Categories need no extra setup. qb-vehicleshop builds a shop's category menu from the category values of the vehicles assigned to that shop.
Step 6: Restart the whole server and buy the car
vehicles.lua is a shared file of qb-core, and qb-vehicleshop and qb-garages read the vehicle list from the core when they start. Restart the whole server instead of single resources. Then walk into the shop, open the vehicle menu, pick the category and find the car by its name. Buy it, store it, and open the garage: the list should show "GT-R R35", not the raw spawn name.
Not showing up? Check these in order
- Does
/car gtr35work? If not, it is a resource problem, not a QBCore problem. Check that the folder is underresources/, thatensure [cars]is inserver.cfgand that the server console lists the resource as started. - Does
modelmatch the spawn name exactly? Compare it with<modelName>invehicles.meta. Keep it lowercase in both the config and your head; the game hashes model names without regard to case, but the QBCore tables are looked up by the exact string. - Is
shopa real key?'PDM','pdm 'or a shop you renamed inConfig.Shopsall fail silently. - Are you standing in a managed shop without a dealer? See step 5.
- Did you edit the right copy? Servers that were moved or updated sometimes have two qb-core folders. The one that counts is the one that is started.
- Did you restart everything? Restarting only qb-vehicleshop does not reload qb-core's shared file.
- Is the entry inside the list? A line pasted below the final
}ofVehiclesis a syntax error or is simply ignored. - Garage shows the spawn name instead of the name? qb-garages falls back to the raw model when it finds no vehicles.lua entry for it. The car was probably given to the player under a different spelling than the
modelkey.
The name shows as NULL
The converted resource does not ship a display-name script, so GTA has no text for the car's label and prints NULL wherever a script asks the game for the vehicle name. Open common/vehicles.meta, find the <gameName> value for your car, then add a small client script to the car resource:
-- vehicle_names.lua (inside the car resource)
CreateThread(function()
-- first argument: the <gameName> value from vehicles.meta
AddTextEntry('GTR35', 'Nissan GT-R R35')
end)Then register it in the resource's fxmanifest.lua:
client_script 'vehicle_names.lua'The Vehicles.meta Generator writes this file for you if you are building the metas from scratch.
FAQ
Do I need to add a hash for the car?
No. In the current format you write model only and qb-core computes the hash. If your file has entries with a hash field, you are on an older qb-core: follow the format your file already uses.
Can I add a new category such as "imports"?
For qb-vehicleshop, yes: the menu shows whatever categories the shop's vehicles carry, so category = 'imports' creates an "imports" entry. Be careful with bikes, boats and aircraft, though. qb-vehicleshop maps a few category names (motorcycles, boats, helicopters, planes) to the vehicle type it spawns, so keep those names for those vehicle kinds.
Where do I change the price later?
In the same line of vehicles.lua, followed by a server restart. Vehicles that players already own are not affected.
I have twenty cars. Do I need twenty resources?
No. Merge them with the Car Pack Builder into one resource, then add twenty lines to vehicles.lua. The Vehicle List tool helps you keep the spawn names straight.
Will updating qb-core delete my cars?
Replacing the qb-core folder replaces shared/vehicles.lua with the stock one. Keep your custom lines together under one comment so they are easy to copy back.
Other frameworks
Running something else? See ESX, Qbox, or the framework-neutral txAdmin install guide. The full tool chain from link to working car is in the complete workflow.
Sources
Checked on 2026-10-10.
- qb-core shared/vehicles.lua at commit 9b3cddc (qb-core 1.3.0): entry format and the hash loop.
- qb-core server/commands.lua: the
/caradmin command. - qb-vehicleshop config.lua, client.lua and server.lua at commit e865297: shop keys, shop types, category menu.
- qb-garages client.lua at commit f22a09f: garage label lookup.
- QBCore documentation, Shared: field descriptions.
- QBCore txAdmin recipe server.cfg: default ensure order.
- FiveM docs, introduction to resources: category folders in brackets.
Have a gta5-mods.com link ready?
Paste it into the converter and download a FiveM resource with the stream folder, meta files and fxmanifest.lua in place.
- 3 conversions free, no account needed
- 2 more free if you leave an email
- After that: $15 once for unlimited conversions and the Pro tools, no subscription