Frequently Asked Questions
Common questions and solutions for zerio-garage v3. If your question isn’t answered here, visit our community server for support!
General Configuration
How do I hide the blip for a garage?
Blips are enabled by default for all garages. To disable them:
Option 1: Via Admin Panel
- Open the admin panel with
/garageadmin - Find the garage you want to modify
- Toggle off the “Blip Enabled” option
Option 2: Via Database
Set blip_enabled = 0 for the garage in the zerio_garage_configs table.
How do I hide markers for a garage?
Markers are enabled by default. To disable them:
Option 1: Via Admin Panel
- Open the admin panel with
/garageadmin - Find the garage you want to modify
- Toggle off the “Marker Enabled” option in the marker configuration section
Option 2: Via Database
Set marker_enabled = 0 for the garage in the zerio_garage_configs table.
How do I restrict a garage to specific vehicle types?
You can use whitelist or blacklist filtering:
Whitelist (only allow specific types):
-- Via data.sql or admin panel
whitelisted_types = '["Boats"]' -- Only boats allowedBlacklist (allow all except specific types):
-- Via data.sql or admin panel
blacklisted_types = '["Boats", "Plane"]' -- Everything except boats and planesValid vehicle types: Compacts, Sedans, SUVs, Coupes, Muscle, SportClassic, Sport, Super, Motorcycle, Offroad, Industrial, Utility, Vans, Bicycles, Boats, Helicopter, Plane, Service, Emergency, Military
You cannot use both whitelist and blacklist on the same garage. Whitelist takes precedence.
Vehicle Features
How do I rename/nickname my vehicle?
- Open any garage menu
- Select your vehicle from the list
- Click the nickname/rename button in the vehicle details panel
- Enter your desired nickname and confirm
Nicknames are stored in your framework’s vehicle table and persist across server restarts.
How do vehicle favorites work?
Mark vehicles as favorites to:
- Pin them to the top of your vehicle list
- Quickly identify your most-used vehicles
To mark a vehicle as favorite:
- Open any garage menu
- Select your vehicle
- Click the star/favorite icon
Favorites are player-specific and stored in the zerio_garage_favorite_vehicles table.
Can I transfer vehicles between garages?
Yes! The vehicle transfer system allows you to move vehicles between any accessible garages:
- Open a garage menu
- Select a vehicle (it can be stored at any garage)
- Click the transfer button
- Choose the destination garage
- Pay the transfer cost (configurable in
configs/features.lua) - Wait for the transfer to complete (configurable delay)
Configuration:
-- In configs/features.lua
Config.VehicleTransfer = {
Enabled = true,
TransferCost = 500, -- Cost in currency
PaymentMethod = "bank", -- "bank" or "cash"
TransferTime = 10, -- Seconds (0 = instant)
AllowImpoundTransfer = true, -- Allow transferring from impound
}When transferring from impound, you must pay both the transfer cost AND the impound fee.
How do I share a vehicle with another player?
The vehicle sharing system allows you to grant temporary access to your vehicles:
- Open a garage menu
- Select your vehicle
- Click the share button
- Select the player from nearby players list
- Confirm the share
The other player will now see your vehicle in their garage menu (marked as “Shared”). You can revoke access at any time by unsharing.
Note: The range for nearby players can be configured in configs/logging.lua under Config.NearbyPlayers.sharing.
How do I sell a vehicle to another player?
The vehicle sale system provides a secure way to sell vehicles:
- Open a garage menu
- Select the vehicle you want to sell
- Click the sell button
- Enter the sale price and select a nearby buyer
- Wait for the buyer to accept
- The buyer reviews the vehicle and chooses their payment method
- If accepted, ownership transfers and you receive payment
Configuration:
-- In configs/features.lua
Config.VehicleSales = {
Enabled = true,
MaxPrice = 1000000, -- Maximum sale price (0 = unlimited)
RequestCooldown = 60, -- Cooldown between sale requests (seconds)
PaymentMethods = { "bank", "cash" },
DefaultPaymentMethod = "bank"
}Job & Gang Garages
How do vehicle presets work for job vehicles?
The preset system allows players to save and quickly apply vehicle configurations:
- Take out a job vehicle
- Customize it (livery, extras)
- Store it back
- The system saves your configuration as a preset
- Next time you take it out, you can select your saved preset
Grade Restrictions: Admins can set minimum grades for specific presets via the admin panel.
Configuration:
-- In configs/features.lua
Config.JobVehicles = {
PresetSystem = {
Enabled = true,
MaxPersonalPresets = 0, -- 0 = unlimited
AllowPresetSharing = true, -- Share presets between players
ShareCodePrefix = "ZGP_",
}
}What’s the difference between static vehicles and zerio-bossmenu integration?
Static Vehicles (default):
- Vehicles are defined in the database (
zerio_garage_vehiclestable) - Fixed list of vehicles per garage
- Managed via admin panel or SQL
- Best for most servers
Zerio Bossmenu Integration:
- Vehicles are managed dynamically through the bossmenu
- Job bosses can add/remove vehicles without admin access
- Vehicles are tied to the business/job’s inventory
- Requires zerio-bossmenu resource
Enable bossmenu integration per garage in the admin panel or set use_zerio_bossmenu = 1 in the database.
How do I restrict job vehicle access by grade?
When creating or editing job vehicles in the admin panel or database:
-- Allow all grades
grades = '"all"'
-- Specific grades only (e.g., grades 2 and 3)
grades = '[2, 3]'
-- Multiple specific grades
grades = '[0, 1, 2]'Players must have one of the specified grades to see and take out the vehicle.
Can job vehicles be shared across multiple garage locations?
Yes! Enable the “Shared Across Locations” option:
Via Admin Panel:
- Edit the job garage
- Enable “Shared Across Locations”
Via Database:
UPDATE zerio_garage_configs
SET shared_across_locations = 1
WHERE name = 'Your Job Garage Name';When enabled:
- Vehicles taken out from one location can be stored at another
- The
current_garage_idfield tracks where the vehicle currently is - Perfect for emergency services with multiple stations
Police Features
How do police impound vehicles?
Officers with police jobs can use the /impound command:
- Stand near the vehicle you want to impound
- Type
/impoundin chat - A UI will open showing:
- Vehicle information (plate, model, owner)
- Fee input (or fixed fee depending on config)
- Reason selection (predefined or custom)
- Impound lot selection (if enabled)
- Confirm the impound
The vehicle owner will be notified (if online) and can retrieve it from the impound for the specified fee.
Configuration:
-- In configs/features.lua
Config.PoliceImpound = {
Enabled = true,
Command = "impound",
AllowedJobs = { "police", "sheriff" },
PriceMode = "range", -- "fixed" or "range"
FixedPrice = 500,
MinPrice = 100,
MaxPrice = 5000,
MaxDistance = 10.0, -- Max distance to vehicle
OfficerSelectsImpound = false, -- Let officer choose impound lot
NotifyOwner = true, -- Notify vehicle owner
Reasons = { -- Predefined reasons
"police_impound_reason_illegally_parked",
"police_impound_reason_abandoned_vehicle",
"police_impound_reason_evidence_seizure",
"police_impound_reason_unpaid_fines",
},
}Housing Integration
How do I integrate zerio-garage with my housing script?
Zerio-garage provides server-side exports that any housing script can use. Your housing script should:
- Handle all access control and permissions
- Call zerio-garage exports when players interact with house garages
Example Integration:
-- In your housing script (server-side)
-- When player opens house garage
RegisterNetEvent('your-housing:openGarage', function(houseId)
local src = source
-- YOUR access check
if not PlayerOwnsHouse(src, houseId) then return end
local house = GetHouseData(houseId)
-- Call zerio-garage export
exports['zerio-garage']:OpenHousingGarage(
src,
"house_" .. houseId, -- Unique garage ID
house.label, -- Display name
house.garageSpawns -- Spawn point(s)
)
end)
-- When player stores vehicle
RegisterNetEvent('your-housing:storeVehicle', function(houseId)
local src = source
if not PlayerOwnsHouse(src, houseId) then return end
local house = GetHouseData(houseId)
exports['zerio-garage']:StoreHousingVehicle(
src,
"house_" .. houseId,
house.label
)
end)See the housing integration documentation for more details.
QS-Housing Integration
Change Config.Garage in qs-housing/config/config.lua to "zerio-garage".
Then create the file qs-housing/client/custom/garage/zerio-garage.lua with the following content:
if Config.Garage ~= "zerio-garage" then
return
end
function StoreVehicle(house)
TriggerEvent("zerio-garage:client:PutBackHouseVehicle", house, "qs-housing")
end
function OpenGarage(house)
TriggerEvent("zerio-garage:client:OpenHousingGarage", house, "qs-housing")
end
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
local ped = PlayerPedId()
local pos = GetEntityCoords(ped)
if closesthouse ~= nil and hasKey and Config.Houses and Config.Houses[closesthouse] and Config.Houses[closesthouse].garage then
local dist = GetDistanceBetweenCoords(pos, Config.Houses[closesthouse].garage.x, Config.Houses[closesthouse].garage.y, Config.Houses[closesthouse].garage.z, true)
if dist < 5.0 then
DrawMarker(20, Config.Houses[closesthouse].garage.x, Config.Houses[closesthouse].garage.y, Config.Houses[closesthouse].garage.z + 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.3, 0.15, 120, 10, 20, 155, false, false, false, 1, false, false, false)
if dist < 2.0 then
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
if Config.Houses[closesthouse].garage and Config.Houses[closesthouse].garage.x and Config.Houses[closesthouse].garage.y and Config.Houses[closesthouse].garage.z then
if vehicle and vehicle ~= 0 then
if Config.HelpNotification == 'ShowHelpNotification' then
ShowHelpNotification(Lang("HOUSING_SHOWHELP_GARAGE_STORE"))
elseif Config.HelpNotification == 'DrawText3D' then
DrawText3D(Config.Houses[closesthouse].garage.x, Config.Houses[closesthouse].garage.y, Config.Houses[closesthouse].garage.z + 0.3, Lang("HOUSING_DRAWTEXT_GARAGE_STORE"))
end
if IsControlJustPressed(0, Keys["E"]) or IsDisabledControlJustPressed(0, Keys["E"]) then
if not StoreVehicle then return DebugPrint("Your client/custom/garages/*.lua is not correctly configured") end
StoreVehicle(closesthouse)
end
else
if Config.HelpNotification == 'ShowHelpNotification' then
ShowHelpNotification(Lang("HOUSING_SHOWHELP_GARAGE_MENU"))
elseif Config.HelpNotification == 'DrawText3D' then
DrawText3D( Config.Houses[closesthouse].garage.x, Config.Houses[closesthouse].garage.y, Config.Houses[closesthouse].garage.z + 0.3, Lang("HOUSING_DRAWTEXT_GARAGE_STORE"))
end
if IsControlJustPressed(0, Keys["E"]) or IsDisabledControlJustPressed(0, Keys["E"]) then
if not OpenGarage then return DebugPrint("Your client/custom/garages/*.lua is not correctly configured") end
OpenGarage(closesthouse)
end
end
end
end
else
Citizen.Wait(1000)
end
end
end
end)Other Housing Scripts
For housing scripts not listed here, integration is straightforward using our server-side exports. See the Developer Documentation for integration examples.
If you need assistance, open a ticket in our community server.
Phone Integration
QB-Phone Support
QB-Phone uses exports from qb-garages to fetch garage data for their vehicle app. To integrate zerio-garage:
Step 1: Remove the old dependency from qb-phone/fxmanifest.lua:
-- REMOVE OR COMMENT OUT:
-- '@qb-garages/config.lua'Step 2: Add zerio-garage as a dependency at the bottom of qb-phone/fxmanifest.lua:
dependencies {
"zerio-garage"
}Step 3: In qb-phone/server/main.lua, add this line at the top:
Config.Garages = exports["zerio-garage"]:getQbPhoneData()This ensures QB-Phone fetches garage data from zerio-garage instead of qb-garages.
Vehicle Management
Why can’t I take out a vehicle from a different garage?
This is controlled by the Config.AllowTakeoutFromAnyGarage setting in configs/garage.lua:
false(default): You can only take out vehicles from where they’re storedtrue: Take out any vehicle from any garage (instant access)
Even if set to false, you can still transfer vehicles between garages using the transfer system.
Why do I see all my vehicles at every garage?
This is controlled by the Config.ShowVehiclesFromAllGarages setting in configs/garage.lua:
true(default): See all your vehicles in every garage menufalse: Only see vehicles stored at the specific garage you’re accessing
This setting affects visibility only. Whether you can take them out depends on Config.AllowTakeoutFromAnyGarage.
Can I retrieve a vehicle if it’s already spawned in the world?
By default, no. The Config.CheckIfVehicleAlreadyExists setting in configs/vehicle.lua prevents duplicate spawns.
If set to false, you can spawn multiple copies of the same vehicle (not recommended for realism).
Are vehicle damages and fuel saved?
Yes! The following settings control this in configs/vehicle.lua:
Config.SaveVehicleDamages = true -- Save engine and body damage
Config.SaveFuelLevel = true -- Save fuel levelWhen enabled, vehicles are stored with their current condition and restored when taken out.
Can vehicles be repaired automatically when stored/impounded?
Yes, use these settings in configs/vehicle.lua:
Config.FixVehicleOnGarage = false -- Repair when storing in personal garage
Config.FixVehicleOnImpound = true -- Repair when retrieving from impoundAdmin & Police
How do I access the admin panel?
Use the /garageadmin command in-game. You must have admin permissions in your framework.
The admin panel allows you to:
- Create, edit, and delete garages
- Manage spawn and putback points
- Configure job vehicles and grades
- View audit logs
- Search vehicles and players
- Manage private garage access lists
How do I use the placement editor?
The placement editor is an in-game visual tool for positioning garages:
- Open the admin panel (
/garageadmin) - When creating or editing a garage, use the “Placement Editor” button
- Walk to your desired location
- Follow the on-screen instructions to place:
- Garage marker position
- Spawn points
- Putback points
- NPCs or props
- Confirm when done
The editor automatically captures coordinates and sends them back to the admin panel.
What are private garages?
Private garages are admin-controlled exclusive garages where access is granted on a per-player basis:
- Create a private garage via the admin panel
- Add player identifiers to the access list
- Only authorized players can see and access the garage
Use Cases:
- VIP garages for donators
- Special faction garages
- Event-specific temporary garages
How do I change a vehicle’s plate?
Use the /changeplate command (admin only):
/changeplate [oldPlate] [newPlate]Example:
/changeplate ABC123 XYZ789This updates:
- The vehicle’s plate in the database
- All related tables (shares, favorites, transfers, impound logs)
- The vehicle’s stored properties
The new plate must be unique and cannot already exist in the database.
Interaction Systems
How do I change the interaction system?
Edit Config.Interaction.Type in configs/interactions.lua:
Available Options:
-- Normal help text (press E to interact)
Config.Interaction.Type = "normal"
-- Target system (ox_target, qb-target, qtarget)
Config.Interaction.Type = "target"
Config.Interaction.Target.Script = "ox_target" -- Specify which one
-- Proximity prompts (requires zerio-proximityprompt)
Config.Interaction.Type = "proximity"
-- Custom system
Config.Interaction.Type = "custom"
Config.Interaction.CustomSystem = "my_system_name"How do I change the help text style?
If using “normal” interaction type, you can customize the help text style in configs/interactions.lua:
Config.Interaction.HelpText = {
Enabled = true,
Style = "Floating", -- Options: Default, Floating, QBCore, okokTextUI,
-- JGTextUI, ESXTextUI, CDDrawTextUI, OXLibTextUI
}Each style has specific configuration options documented in the config file.
Advanced Features
How do I add NPCs or props to garages?
You can add atmosphere to garages with NPCs or props:
Via Admin Panel:
- Edit a garage
- In the “NPC/Prop Configuration” section:
- Enter an NPC model (e.g.,
s_m_m_dockwork_01) OR - Enter a prop model (e.g.,
prop_parkingpay)
- Enter an NPC model (e.g.,
- Use the placement editor to position it
- Save
Via Database:
-- Add NPC
UPDATE zerio_garage_configs
SET npc_model = 's_m_m_dockwork_01',
prop_x = -100.0, prop_y = 200.0, prop_z = 30.0, prop_heading = 90.0
WHERE name = 'Your Garage';
-- Add Prop
UPDATE zerio_garage_configs
SET prop_model = 'prop_parkingpay',
prop_x = -100.0, prop_y = 200.0, prop_z = 30.0, prop_heading = 90.0
WHERE name = 'Your Garage';You cannot have both an NPC and a prop at the same garage. They are mutually exclusive.
How does the vehicle preview camera work?
When enabled, opening a garage menu will:
- Transition the camera to the spawn area
- Spawn preview vehicles client-side (invisible to other players)
- Allow you to orbit the camera by right-clicking and dragging
Configuration:
-- In configs/features.lua
Config.VehiclePreview = {
Enabled = true,
DefaultDistance = 6.0, -- Camera distance from vehicle
OrbitSensitivity = 2.0, -- Mouse orbit speed
}How do I set up webhook logging?
Configure webhooks in configs/logging.lua:
Config.Webhook = {
username = "Garage Logs",
communtiyName = "My Server",
communtiyLogo = "https://your-logo-url.png",
toggles = {
takevehicleoutgarage = true, -- Log vehicle takeouts
putvehiclebackin = true, -- Log vehicle storage
vehicleshare = true, -- Log vehicle sharing
transfergarage = true, -- Log transfers
vehiclesale = true, -- Log sales
policeimpound = true, -- Log police impounds
},
links = {
takevehicleoutgarage = "https://discord.com/api/webhooks/...",
-- ... add webhook URLs for each event type
}
}Troubleshooting
Vehicles won’t spawn - “Vehicle in the way” error
This is controlled by Config.CheckForVehicleInTheWay in configs/vehicle.lua. When enabled, the system checks if a vehicle is blocking the spawn point.
Solutions:
- Clear vehicles from spawn points
- Add more spawn points to the garage
- Set the config to
false(not recommended)
UI is not opening / showing localhost error
The fxmanifest.lua has a development setting:
ui_page "http://localhost:5173" -- Development mode
-- ui_page 'html/index.html' -- Production modeFor production servers, comment out the localhost line and uncomment the html/index.html line. Or rebuild the UI and let it use the production build automatically.
Locale/translations not working
- Check
Config.Localeinconfigs/core.luamatches your locale file name (e.g.,"en"forlocales/en.lua) - Check
Config.BrowserLocaleis set correctly (e.g.,"en-US","en-GB","de-DE") - Ensure your locale file exists in the
locales/folder - Restart the resource
How do I enable debug mode?
Set Config.Debug = true in configs/core.lua. This will print detailed debug information to the server and client console.
For PolyZone debugging, also set Config.DebugPolyZone = true.
Database & Server
What happens to vehicles after a server restart?
By default, vehicles remain in their current state (out or stored).
You can force all vehicles back to storage on restart:
-- In configs/vehicle.lua
Config.ResetVehiclesAfterRestart = trueWhen enabled, all vehicles will be marked as “stored” when the server starts.
Can I customize vehicle name fetching?
Yes! Zerio Garage supports multiple methods in configs/vehicle.lua:
Config.NameFetching = "default" -- Options: default, zerio, esx, qb, custom- default: FiveM natives
- zerio: zerio-cardealers database
- esx: ESX vehicle table (ESX only)
- qb: QB-Core shared vehicles (QB-Core only)
- custom: Your own function (define
Config.CustomNameFetch)
Custom Example:
Config.NameFetching = "custom"
Config.CustomNameFetch = function(modelName)
-- Your custom logic here
local myCarDealer = exports['my-cardealer']:GetVehicleName(modelName)
return myCarDealer or modelName
endHow do I customize the spawn point selection strategy?
Configure in configs/garage.lua:
Config.SpawnPointStrategy = "closest_available"
-- Options: "closest_available", "first_available", "random_available"- closest_available: Selects the nearest available spawn point to the player
- first_available: Uses the first available spawn in the table order
- random_available: Randomly selects from available spawns
Need More Help?
If your question isn’t answered here, join our community server for support!