Open Source edition
The Open Source edition ships the full, unencrypted source for servers that don’t run escrowed scripts and want to modify and maintain the script themselves. It is on sale to everyone through the store — no invitation needed.- Price — €89.90.
- How to buy — open the store page and pick Open Source next to the price.
- Delivery & licensing — Cfx.re rules apply to the Open Source edition too, so the purchase is registered to your Cfx.re server key and shows up in your Keymaster like any other asset.
- GitHub access — you get access to the script’s GitHub repository, including the main release branch. You can open issues and pull requests and contribute to the main version, within the contributor rules.
- Direct support — 24/7 access to the script’s contributor and product owner, MustafaAta, for questions, modifications, and integration help.
Contributor rules
Repository and contribution access are granted under the studio’s contributor rules. In short: the source is yours to modify for your own server, but it stays private to buyers — redistribution, resale, and public mirrors are not permitted. Issues and pull requests are welcome; merges into the main version are at the studio’s discretion. The full rules are shared with your purchase.Overview
9AM Vehicle Shop is the studio’s most complete vehicle-sales system for roleplay servers that want more than a basic buy menu. Players walk into a dealership, browse a live 3D catalog, test drive, pay by cash, bank, or financing, and drive away in a car registered to their name. Staff run the whole business from a per-shop management tablet — sales, wallet, stock, coupons, orders, employees, and settings — all gated by granular per-employee permissions. Admins place and configure new dealerships live, in-game, with no config editing. Everything is written against QBox shapes, with QBCore and ESX supported through an auto-detecting framework bridge. Vehicle-key, garage, and phone integrations are also auto-detected at startup — install only what you use.Current version: 1.4.0. Frameworks: QBox · QBCore · ESX. Author: 9AM Studios — MustafaAta.
Public features
- 3D showroom catalog — walk into the dealership and browse vehicles in a live preview with a seated driver ped (a clone of the player), rotate and inspect each model, switch paint colors, and read specs pulled straight from the game.
- Purchasing — pay by cash or bank; the vehicle is registered to the player and either spawned at the shop or delivered to a garage. Coupon / discount codes are supported.
- Custom currencies — accept VIP coins, tokens, crypto, or an inventory item, enabled per dealership, with automatic reward delivery from your webstore.
- Financing — configurable down payment, interest, and installment count, with automatic real-time bank deductions plus manual and early payoff.
- In-person sales — employees with the
salespermission send a purchase offer to a nearby player and earn commission on the sale. - Management dashboard — a per-shop tablet UI: sales history, case (shop wallet) balance & ledger, stock, coupons, orders, employees, and settings — every panel gated by per-employee permissions.
- Stock & delivery logistics — order stock, then run a truck-and-trailer delivery mission to bring it in, sized by vehicle category and trailer type.
- Physical showroom displays — place real display vehicles in the showroom, with optional in-world info stands rendered as DUI textures.
- In-game shop creator — admins place and configure new dealerships live with
/dealerships; each inherits its catalog from a source shop. - Phone app — employees open the dashboard from lb-phone or cylex_phone (auto-detected); permissions still apply.
- Multi-framework bridge — QBox, QBCore, and ESX auto-detected; vehicle-key, garage, and phone integrations auto-detected at startup.
- Localization — all in-game and UI text is keyed, with 30 languages shipped and per-key fallback for partial translations.
Dependencies
Required
- ox_lib
- oxmysql
- A supported framework: qbx_core (QBox), qb-core (QBCore), or es_extended (ESX)
- On QBox: qbx_vehicles — used to register purchased vehicles
Optional (auto-detected — install only what you use)
Interaction & prompts
Interaction & prompts
- ox_target — required only when
Config.InteractionMode = 'target'. 9am-textui— enhances prompts when present; falls back to ox_libshowTextUIautomatically.
Vehicle keys
Vehicle keys
qbx_vehiclekeys, qb-vehiclekeys, qs-vehiclekeys, ak47_qb_vehiclekeys, 0r-vehiclekeys, Renewed-Vehiclekeys, MrNewbVehicleKeys, mk_vehiclekeys.Garages
Garages
jg-advancedgarages, cd_garage, okokGarage, esx_garage, plus the framework defaults qbx_garages / qb-garages. Set Config.DefaultGarage to a garage name your garage script recognizes.Phone
Phone
lb-phone, cylex_phone — the running one is detected automatically; nothing to configure.The showroom info stands use custom prop models (
vehicle_info_stand1–4). If they aren’t in your build, disable the Info Stands option for the affected shop(s) in the /dealerships editor, or install the companion props resource.Compatibility and editions
Both editions ship the config, vehicle catalog, currency definitions, and framework bridges unencrypted so you can edit them; see the store for current escrow pricing. For what the Open Source edition includes, see Open Source edition.
Editable files
Installation
1
Drop the resource in
Place
9am-vehicleshop into your resources folder (a [9am] sub-folder is fine).2
Ensure it after your framework
3
Database
No SQL import is required — all 19 tables are created automatically on first start. The MySQL user oxmysql uses must have
CREATE and ALTER privileges.4
Create the jobs your shops use
Add the dealership jobs your shops reference to your framework. QBox/QBCore ship
cardealer; add any others (e.g. airdealer) yourself. The boss grade grants full dashboard access.5
Create shops in-game
There are no default shop locations to edit. Run
/dealerships (admin) to place and configure dealerships. Use config.lua for global options only.Configuration
All global settings live inconfig.lua. Shops themselves are not configured here — they are database-driven and managed in-game (see Shops & the creator).
NPC suppression
Inside dealership zones, ambient pedestrians and traffic can be suppressed so the showroom stays clean. Player vehicles, dealer peds, and showroom vehicles are unaffected.Finance
Test drive
Phone app
lb-phone and cylex_phone are both supported and detected automatically. Employees open the dashboard from the app; permissions apply as usual.
Orders & delivery
Config.Orders controls stock ordering and the delivery mission. Highlights:
preparationTime— minutes until an ordered stock delivery is ready (lower it for testing; default30).delivery.enabled— whenfalse, ready orders add to stock directly via a Receive button instead of running a mission.delivery.truckModel,carTrailer,containerTrailer— the truck and two trailer types (car trailer holdsS/M/L, container holds everything includingXL).vehicleSizes/slotCosts— map each vehicle category to a size (S/M/L/XL) and a trailer-slot cost.containerOnlyModels— models too large for the car trailer, forced to container-only.delivery.shops[shopId]— per-shop truck spawn and delivery destination.
Shops and the in-game creator
Config.Shops is intentionally empty. Shops live in the database (9am_vehicleshop_dynamic_shops) and are created, edited, and deleted in-game — never by editing config.
- Run
/dealerships(alias/dealershipcreator) as an admin to open the creator. - Place the shop on the map (a live blip preview uses GTA minimap tiles), set the dealer ped, showroom slots, blip, and the Vehicle Source (which catalog the shop sells).
- The Garage Override dropdown lists garages detected from your garage script; unsupported scripts fall back to garages already in use on stored vehicles, and a Custom option always lets you type any name.
- On first boot, the former static shops (
pdm,air,boats) are seeded once into the database, then loaded server-side intoConfig.Shopsand published to clients via GlobalState. SoConfig.Shops[shopId]works at runtime on both sides, but its contents come from the DB.
The vehicle catalog
vehicles.lua is the catalog (~150 KB). Each entry defines the spawn code, brand, price, category, and which shop(s) sell it — a vehicle may belong to multiple shops via its shop tag.
- Images load from
Config.VehicleImageUrl(defaulthttps://docs.fivem.net/vehicles/<model>.webp). Add-on / custom vehicles FiveM doesn’t host should set a per-vehicleimage = 'https://...', or they show a broken image. - Blocked models — oversized models in
Config.BlockedModelsare never spawnable for safety. - The
truckcatalog — 32 heavy/commercial vehicles ship taggedshop = 'truck'that no default dealership sells. To sell them, create a dealership and pick truck as its Vehicle Source.
Management dashboard & permissions
Staff open the dashboard with/dealertablet, from the phone app, or (with Config.Debug) the debug command. The UI is one React app with dashboard, catalog, sale-offer, finance, and shop-creator pages.
Access is gated by granular per-employee permissions that appear in both the server (gating) and the UI. Boss grades and shop owners bypass all checks.
Sales, financing & coupons
- In-person sales — a staffer with
salessends an offer to a nearby player; on acceptance the buyer pays and the staffer earnsConfig.SalesCommission. Price, coupon, stock, and job checks are all re-derived server-side. - Financing — the buyer chooses a down payment and installment count within the
Config.Financebounds; the balance auto-deducts from their bank on a real-time interval, with manual and early payoff available. - Coupons — percentage or fixed discount codes, created and managed from the dashboard.
Stock, orders & delivery
- Staff order stock from the dashboard; after
preparationTimethe order is ready. - With delivery enabled, a truck-and-trailer mission spawns at the shop’s
truckSpawn; the driver hauls the trailer to thedeliveryPoint. - Each ordered vehicle occupies trailer slots sized by category (
S/M/L/XL); the car trailer holdsS/M/L, the container holds everything. - On delivery the stock is added and becomes purchasable.
Showroom displays & info stands
Each shop can show physical display vehicles in its showroom slots, edited in-game with the showroom editor. Optional info stands render a standalone page (web/showroom_stand.html) as a DUI texture on in-world stand props, showing the model’s name, price, and specs. Disable info stands per shop if you don’t have the prop models.
Framework & integration bridges
Two bridge files auto-detect your stack and ship unencrypted so you can edit them:bridge/server.lua— player lookup, money, vehicle registration, and keys/garage integration. Auto-detects the framework and errors if none is found. Plates are trimmed before being handed to key/garage scripts (GTA pads plates to 8 chars).bridge/client.lua— synthesizesQBX.PlayerDatain QBox shape for all three frameworks.
dealership_audit in the server console — it lists every supported integration per feature with installed vs. active state.
Custom currencies
Dealerships can take payment in something other than cash and bank — VIP coins, car tokens, crypto, an inventory item. Currencies are defined incurrencies.lua and enabled per dealership, so one showroom can be VIP-only while the rest stay on cash.
The file ships fully commented out. Leave it alone and nothing changes.
The registration API is drop-in compatible with JG Dealerships. An existing
Currencies.Server.Register block pastes in unchanged, including calls to Framework.Server.GetPlayerIdentifier(src) inside its callbacks.currencies.lua
* Not required when using
flatCost.
Prices convert after tax and coupons and always round up, so a vehicle can never come out free at a high conversion rate. Coupons do not apply to flat-cost purchases.
Where the balance lives
WritefetchBalance / addBalance / removeBalance yourself, or add a backend block and let the script generate them:
ESX account (viptoken)
ESX account (viptoken)
Register the account in your framework config first, then point the currency at it — no balance callbacks needed.
Flat-cost token
Flat-cost token
One token buys any vehicle, whatever it costs.
Another resource owns the balance
Another resource owns the balance
Hand-written callbacks (JG form)
Hand-written callbacks (JG form)
Enabling a currency
Open/dealerships as an admin, edit a dealership, and use the Payment Methods section. The same section controls whether that dealership accepts cash, bank, and finance at all.
Payments taken in a custom currency are held in that dealership’s case in the same currency, alongside its dollar balance, and staff withdraw them from the Case tab. Stock orders and case deposits stay dollar-only.
Webstore rewards
Sell VIP coins on Tebex and let the script deliver them. Run this from the server console, or as a Tebex command package:identifier accepts license:..., cid:<citizenid>, a bare citizenid, or #<serverId> for an online player. Substitute your own store’s placeholder tokens — the exact tokens differ per store plugin.
Always pass a transaction id. It is the primary key of the grant table, so re-running the same line grants nothing and prints
REPLAY. That makes a webstore retry safe.dealership_balance <identifier> <currencyId> and dealership_grants <identifier|txId|flush>.
Exports
Server-side. Use these to wire the script into a society account, a payslip system, a Discord bot, or your own store handler.Player balances
Work for any registered currency.Dealership balances
Each dealership keeps its own case rather than anesx_addonaccount society, because a dealership is not always a job — a player-owned shop belongs to one character with no society to point at, and two shops can share a job. These exports expose the balance so you can mirror it into a society account or read it elsewhere.
boolean, string?. The error string is one of unknown_shop, unknown_currency, invalid_amount, insufficient_funds, duplicate, missing_tx_id, or delivery_failed.
You can also register a currency from another resource instead of currencies.lua:
Commands
Debug commands (
/openshop, /opendash, /finance, /trailerspawn, …) are gated behind Config.Debug and off by default.
Database
These 19 tables are auto-created on startup — do not import them manually:player_vehicles on QB/QBox, owned_vehicles / users on ESX) when registering a purchased vehicle. Schema upgrades run as guarded ALTER TABLE migrations in the MySQL.ready block — never add a SQL import file.
Localization
All user-facing text is keyed, English is the fallback, and 30 languages ship:en, ar, cs, da, de, es, fi, fr, he, hi, hu, id, it, ja, ko, lt, ms, nl, pl, pt, pt-br, sl, sv, th, tl, tr, uk, vi, zh-cn, zh-tw. locales/en.json is the source of truth. Each file has two namespaces — game.* (Lua) and ui.* (React). To add a language, copy en.json, translate the values (keys identical; partial files fall back per-key), and set Config.Locale. No web rebuild is needed.
Version history
Custom currencies
Custom currencies. Dealerships can be paid in VIP coins, tokens, crypto, or an inventory item, enabled per dealership. The registration API is drop-in compatible with JG Dealerships, and five backends (
db, account, export, metadata, item) cover the common setups with no callbacks to write.Webstore rewards. dealership_grant delivers currency by player identifier from Tebex or RCON — replay-safe on the store’s transaction id, so a retried delivery grants nothing. Offline buyers are credited directly where the currency allows it, and queued for their next login where it physically cannot be handed over, such as an inventory item.Per-currency case. Each dealership holds its currency balances alongside its dollar balance, with a switcher and per-currency withdrawal in the Case tab. Deposits and stock orders stay dollar-only.Per-dealership payment methods. A new Payment Methods section in /dealerships controls cash, bank, finance, and each currency.Exports. New company-balance and currency-balance exports for integrating with society accounts and external systems. Withdrawals fail with insufficient_funds rather than overdrawing, and both directions write a ledger row.Audit log. Every currency movement is recorded in 9am_vehicleshop_currency_log, including webstore grants and case withdrawals.Financing in a custom currency is not supported in this release. allowFinance and the offline callbacks are accepted, validated, and stored so JG definitions load cleanly, but financed purchases always use the bank account.Fixes. Three pre-existing bugs were found and fixed while building this release:- A credit to a dealership that had no balance row yet was silently discarded. The shop case is now written as an upsert.
- Renaming a shop while its catalog was open reset the test-drive toggle, and would also have cleared that shop’s payment methods.
- The sale-offer page failed to render in browser development because its state was never seeded.
With an untouched
currencies.lua, every existing dealership keeps accepting cash, bank, and finance and behaves exactly as it did in 1.3.x.Shop creator polish
Redesigned the dealership list in
/dealerships with a clearer hierarchy and filters, and tidied the editor header.File layout — action required
Customer-editable files moved. Copy your customizations to the new paths before starting 1.3.0 — the old filenames are no longer loaded, so edits left behind are silently ignored.
Also relocated, though usually not customized:
shared/locale.lua → modules/locale.lua, server/helpers.lua → modules/helpers.lua, server/data.lua → modules/data.lua, client/utils.lua → modules/utils.lua, client/state.lua → modules/state.lua.Server-only files are no longer included in the client download, so permission checks and SQL builders stay on the host.Build tooling
Internal build tooling only — no gameplay or configuration changes.
Phone fix
Fixed the phone dashboard bottom sheet sitting in the wrong position after the build toolchain upgrade.
Interface refresh
Moved the interface onto the shared 9AM UI Kit so components stay consistent across scripts.
30-language pack
Completed the localization pack — 30 languages now ship, with English fallback for any missing key. Set
Config.Locale and restart; no rebuild required.Packaging
Customer builds are now produced with the production pipeline, which strips development seed data, mock data, and console noise from the shipped interface.
Best for
Choose this script if your server wants:- A believable vehicle-sales loop instead of a flat buy menu
- Staff-driven dealership gameplay with real permissions
- A business players can own and operate
- Financing, coupons, stock, and delivery logistics
- Live, in-game dealership creation with no config edits
- A donation currency that buys cars, delivered automatically from your store