Installation Guide
Step-by-step setup for oxide-dealerships — prerequisites, the interface build step, database import, and per-framework admin setup.
This guide takes you from a fresh download to four working dealerships in your world. Follow it top to bottom — the steps are in the order your server needs them.
Prerequisites
Required resources
Make sure these are on your server and starting before oxide-dealerships:
| Resource | Minimum Version | Purpose |
|---|---|---|
ox_lib | latest | Shared utility library — translations, map zones, and vehicle helpers |
oxmysql | latest | The bridge between the resource and your database |
o-link | latest | Framework bridge — one resource, no framework-specific edits |
Optional resource
| Resource | Purpose |
|---|---|
oxide-banking | When installed and enabled, finance interest rates follow each player's credit score, and a missed-payment invoice is sent when a loan defaults. Everything works without it. |
Supported frameworks
| Framework | Support |
|---|---|
| QBCore | Full (via o-link) |
| ESX | Full (via o-link) |
| QBX (qbx_core) | Full (via o-link) |
Installation
Extract the resource
Place the oxide-dealerships folder inside your server's resources/ folder (or your [oxide] bundle folder if you group Oxide resources).
Build the interface
The catalog, management dashboard, and admin panel ship as source code and must be built once before they will display. Skipping this step is the number one cause of a blank or black box instead of the catalog.
You need Node.js installed on the machine where you build (installing Node.js also installs npm). Open a terminal in the resource's web folder (resources/oxide-dealerships/web) and run:
npm install
npm run buildWhen it finishes, a new web/dist folder exists inside web, containing an index.html file and an assets folder. If web/dist is there, this step worked.
Add startup order
Every dependency must start before oxide-dealerships:
ensure ox_lib
ensure oxmysql
ensure o-link
ensure oxide-banking # only if you use it — otherwise leave this line out
ensure oxide-dealershipsImport the database
Run sql/install.sql from the resource folder against your server's database (drag it into a HeidiSQL query tab, or use phpMyAdmin's Import tab).
This creates seven tables:
| Table | What it stores |
|---|---|
dealerships | Every dealership — name, owner, lot zone, greeter, blip, and settings |
dealership_inventory | The vehicles each dealership has for sale (new and used) |
dealership_employees | Staff hired at player-owned dealerships, with their commission |
dealership_financing | Active and past finance contracts |
dealership_sales | A record of every sale (the sales ledger) |
dealership_coupons | Promo codes |
dealership_coupon_redemptions | A record of who used which coupon |
Importing also seeds four ready-to-use NPC dealerships: pdm (Premium Deluxe Motorsport — cars), boats (Marina Shop), air (Air Shop — helicopters and planes), and truck (Truck Motor Shop). They appear in your world automatically. Re-running the file later never duplicates or overwrites anything.
Grant admin permission
The /dealership commands and the admin dashboard are restricted to admins. What counts as an admin depends on your framework — see Framework Setup below.
Never run sql/reset.sql on a live server
The resource also includes sql/reset.sql, which deletes all dealership data — every shop, sale, and finance contract. Only run it if you truly want to wipe everything and start over.
Optional: enable the Luxury dealership
A fifth dealership, Luxury Vehicle Shop at Rockford Hills, is included but disabled by default because it needs a custom map (MLO) at that location to look right. If you have that map, open sql/install.sql in a text editor, find the section near the bottom marked Luxury Vehicle Shop — DISABLED by default, remove the -- comment marks from the start of each of its lines, and import the file again.
Future updates
sql/install.sql contains the complete, up-to-date schema — it is the only file you need to run on this release. If a future update changes the database, it will ship numbered upgrade files in a sql/migrations/ folder, and the changelog will say exactly which ones to run. Re-running install.sql never adds new columns to tables that already exist, which is why updates ship separate upgrade files.
Framework Setup
Behind the scenes, the resource asks o-link "is this player an admin?" — and the answer depends on your framework.
QBCore admins are recognized through the server's ACE permission system — the bridge checks the command permission. Add this to your server.cfg:
add_ace group.admin command allowtxAdmin puts its admins in group.admin, so with that line they pass the check. More generally: any admin who can already run your server's built-in restricted commands has the command permission and passes without changes.
QBX (qbx_core) uses the same ACE permission as QBCore. Add the same line to your server.cfg:
add_ace group.admin command allowESX recognizes admins by their admin group (such as admin or superadmin) set on the player's account in your users database table or through your admin menu. Any player ESX considers an admin automatically passes — no extra ACE line is needed.
If a /dealership command replies "You do not have permission," the player is not recognized as an admin yet — see Troubleshooting.
Turn off your old vehicle shop
If you were running another vehicle shop resource, stop it so the two don't overlap (duplicate blips, two greeters at the same spot). Remove or comment out its ensure line:
- QBCore:
qb-vehicleshop - ESX:
esx_vehicleshop - QBX: its equivalent vehicle shop resource
You do not need to migrate vehicle ownership data by hand — o-link reads whatever ownership system your framework already uses, so cars bought here are saved the way your framework expects.
Optional: oxide-banking
If you run oxide-banking and want financing to react to a player's credit, open shared/config/finance.lua and set:
Config.Finance.useOxideBanking = trueWith this on (and oxide-banking running), two things change:
- A player's credit score sets their interest rate and how many payments they're allowed — better credit means a lower rate and longer terms.
- When a loan defaults, the dealership sends the player a missed-payment invoice through
oxide-banking.
If oxide-banking is not running, this setting does nothing harmful — financing simply uses the standard rates from your config. Leave it false if you don't use oxide-banking.
Verification
Start your server and join. Here's what "working" looks like:
ox_lib, oxmysql, o-link, and oxide-dealerships starting without red dependency errors./myloans — an empty "My Contracts" panel should appear./dealership list as an admin — it prints your four dealerships to chat.