Before You Begin#
Before installing Job Management + Multijob, make sure your server meets the requirements. Three things are mandatory — the database resource, ox_lib and one supported framework; everything else is optional and picked up on its own.
Requirement | Status | Notes |
|---|---|---|
| Required | Database access. The table installs itself. |
| Required | Callbacks, notifications and the scheduled statistics resets. |
Framework | Required | ESX Legacy, QBCore or Qbox — detected automatically. There is no standalone mode. |
| Optional | A styled 3D prompt at boss zones. Without it, a drawn text label is used. |
Quasar job resources | Optional | Mining, Garbage, Dog Walker, Newspaper, Lumberjack, Bus, Trucker, Taxi, Hunter, Treasure Hunting and Fishing show their level and XP in the menus. |
The framework is detected by looking at what is already running when the resource starts:
Framework | Resource | Player identifier |
|---|---|---|
ESX Legacy |
|
|
QBCore |
|
|
Qbox |
|
|
Optional integrations degrade silently: if a resource is missing, that feature simply stands down. Integrations has the details.
github.comReleases · overextended/oxmysqlMySQL resource for FXServer.github.comReleases · overextended/ox_libA FiveM resource and script library for Lua and JS.Downloading Job Management#
After purchasing Job Management + Multijob, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Job Management.
After extracting the download, you should have the following folder:
qs-job-management/
├── config/ -- config.lua and the language loader (editable)
├── client/framework/ -- ESX and QBCore/Qbox bridges (editable)
├── server/framework/ -- ESX and QBCore/Qbox bridges and the admin check (editable)
├── locales/ -- the 19 translations
├── data/ -- treasuries, permissions, salaries, statistics, logs
├── web/dist/ -- the interface, already built
├── bosses.json -- the boss of each job
├── hrlog.json -- HR history per job
└── qs-job-management.sqlThe folder must be named
qs-job-management. The resource checks its own name on start — a renamed copy prints an error and freezes the server console — and other scripts call its exports by that name.
Installing the Resource#
Move the qs-job-management folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-job-management/Once copied, open your server.cfg and make sure every dependency starts before Job Management:
ensure oxmysql
ensure ox_lib
# Framework — only one
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Optional
ensure qs-textui
ensure qs-job-managementThe loading order matters. The framework is detected when Job Management starts, so it has to be running already. Quasar job resources can start before or after it — they are looked up each time a menu needs them.
The Database#
There is no SQL file to import. On the first start Job Management creates its one table, qs_job_management, which holds every player's job list. An older install's table is upgraded in place: any column it is missing is added, and the console says so once:
[qs-job-management] Added missing column qs_job_management.badgesColumn | Holds |
|---|---|
| The character — the ESX identifier, or the QBCore/Qbox citizenid. |
| The job name, exactly as your framework knows it. |
| The player's rank in that job. |
| The badges awarded in that job, as a JSON list of names. |
The bundled qs-job-management.sql creates exactly the same table, if you prefer to import it yourself. Everything else — bosses, treasuries, permissions, salaries, contracts, statistics, reports and logs — is saved as JSON files inside the resource; Usage lists every file and what it holds.
Starting From Clean Data#
The JSON files hold the live state of a server: who is boss, every balance, every log line. Before opening a new server — or to wipe a test run — stop the server and reset them to these values:
File | Reset to |
|---|---|
|
|
|
|
|
|
|
|
|
|
Claiming Admin Access#
The admin panel — /boss by default — and every admin action behind it are reserved to server admins. Who counts as an admin is decided by your framework:
Players whose ESX group is admin or superadmin. Give the group with ESX's own command, using the player's server id:
setgroup 1 adminGroup names are case-sensitive.
Players the core allows the admin permission — the same check the core's own admin commands use. Granting the ace works on both cores; add it to server.cfg with the player's license:
add_ace group.admin admin allow
add_principal identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx group.adminRestart the server after adding it.
The check is the PlayerIsAdmin function in server/framework/esx.lua and server/framework/qb.lua. Both files are open to edit — accept other groups, an ace, or a staff list:
-- server/framework/esx.lua
function PlayerIsAdmin(source)
local xPlayer = GetPlayerId(source)
if not xPlayer then return false end
local group = xPlayer.getGroup()
return group == 'admin' or group == 'superadmin' or group == 'mod'
endAnyone else who types /boss sees No permission.
Configuring the Resource#
Jobs, badges, boss zones, limits, commands and the webhook live in one file. Everything bosses and admins change in game — ranks, salaries, permissions, treasuries, hire modes, panel-placed zones — is saved by the resource itself.
File | Contents |
|---|---|
| Jobs and badges, level tables, boss zones, the blacklist, limits, commands and keys, notifications, license restriction and the Discord webhook. |
| Loads the language set in |
| The 19 translations of every text in the interface. |
| The framework bridges: job-change events, player names and the admin check. |
The values worth reviewing first:
Config.Locale = "en" -- en, es, ar, bg, da, de, fa, fr, hi, hu, it, ja, ko, nl, pt, ro, ru, tr, zh-CN
Config.MaxJobs = 5 -- jobs a character can hold at once
Config.Position = "right" -- side of the screen the job menu opens on
Config.Interactions = {
jobCommand = "job", -- job menu
jobKey = 166, -- F5
adminCommand = "boss", -- admin panel
adminKey = nil,
bossCommand = nil, -- boss menu away from the boss zone
bossKey = nil,
}
Config.DiscordWebhook = "" -- one channel for every job eventNotifications are silent until you choose a system.
SendTextMessageinconfig/config.luaships with every line commented out — uncomment the vanilla block or call your own notification resource. See Integrations.
Verifying the Installation#
After completing the installation, restart your server and read the console. There should be no renamed the script error and no Could not verify the database schema line. Then join your server and work through the first loop:
Open the job menu
Type
/jobor pressF5. Your current job is already on the list, with its rank and an End shift button.Open the admin panel
As an admin, type
/boss. The Jobs tab lists every job inConfig.Jobs.Assign a boss
Open a job, go to Boss and press Set Boss next to an online player — yourself is fine. The job's boss zone appears on that player's map.
Visit the boss zone
With that job active, walk into the zone and press
Eat the [E] Manage prompt. The boss menu opens on the employee list. From there, Usage covers everything else.
Ranks, salaries, permissions, treasuries and boss zones are all changed in game, with no restart. Only
config/config.luaneeds one.



