Before You Begin#
Before installing Taxi Job, make sure your server meets the minimum requirements. Three things are mandatory; everything else is optional, and either detected on its own or switched on in the config.
Requirement | Status | Notes |
|---|---|---|
| Required | Database access. The tables install themselves. |
| Required | Callbacks, and the scheduler behind the leaderboard resets. |
Framework | Required | ESX, QBCore or Qbox — auto-detected. |
Target | Optional |
|
Vehicle keys | Optional | Eleven key systems, auto-detected. Hands the driver the keys to the cab. |
Fuel | Optional | Fills the cab on spawn through your fuel script's |
| Optional | Taxi quests, and locking the inventory while the uniform goes on. |
| Optional | Draws the floating prompts when 3D text is switched on. |
Dispatch | Optional | Alerts the police when an illegal stop is reported. |
| Optional | Ride-request notifications for the Taxi Job phone app. |
Everything framework- or third-party-specific sits behind a small bridge file. Some layers are picked by looking at what is already running, the rest by a switch in the config:
Layer | How it is chosen |
|---|---|
Framework |
|
Vehicle keys | The first of eleven supported key systems found running (auto) |
Target |
|
3D prompts |
|
Notifications | Built in, or your own through |
Fuel · dispatch · outfit |
|
Every optional integration degrades quietly. A missing key script means the cab is driven without keys being handed over; a missing target means the prompt is a key press. 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 Taxi Job#
After purchasing Taxi Job, 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 Taxi Job.
After extracting the download, you should have the following:
[taxijob]/
├── qs-taxijob/
│ ├── config/ -- config.lua and translations.lua: what you edit
│ ├── client/ -- framework, target, outfit and key bridges (editable)
│ ├── server/ -- framework bridges and quests (editable)
│ ├── web/ -- the interface, ready to use
│ ├── driver_ratings.json -- every driver's reputation
│ └── fxmanifest.lua
└── [sql]/
└── qs-taxi.sql -- optional: the resource creates its own tablesThe folder must be named
qs-taxijob. The resource checks its own name on start — a renamed copy prints You have renamed the script! and freezes the server console — and every export other scripts call is addressed to that name.
Installing the Resource#
Move the qs-taxijob folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-taxijob/Once copied, open your server.cfg and make sure every dependency — and everything it should integrate with — starts before it:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Target, vehicle keys, fuel, inventory, text UI, phone
ensure ox_target
ensure qs-vehiclekeys
ensure LegacyFuel
ensure qs-inventory
ensure qs-textui
ensure qs-smartphone
ensure qs-taxijobThe loading order matters. Detection only sees resources that are already started, so a framework that starts after Taxi Job leaves the job unloaded, and a key script that starts after it means cabs spawn without keys.
The Database#
There is no SQL file to import. Taxi Job creates its own tables on first start, adds any column an older install is missing, and on every later start simply checks that nothing has changed.
Table | Holds |
|---|---|
| Each driver's level and experience, plus all-time, season and daily experience and earnings for the leaderboards. |
| When the daily and season rankings last reset, so a restart over midnight never pays twice. |
| Prizes won by drivers who were offline at the reset, paid on their next login. |
| The last top three of each ranking, shown in the statistics view. |
On ESX the job is registered too: every job in Config.TaxiJob that does not exist yet is added to jobs (label Taxi Driver) with a grade 0 Driver in job_grades. On QBCore and Qbox jobs live in the core's shared jobs file rather than the database, so nothing is written — the stock taxi job is already there.
Driver reputations — the star average, the number of ratings and the fares driven — are kept in driver_ratings.json inside the resource folder, not in the database. It is written every minute and on shutdown. Keep it safe when you update.
The
identifiercolumns are matched to your framework's own collation automatically. MariaDB 11.4 changed the default collation, and a mismatch would break the leaderboard with Illegal mix of collations — the resource fixes the column instead, and prints the exact statement to run by hand if it cannot. The[sql]/qs-taxi.sqlfile is only for preparing the database outside the server; importing it is optional.
Giving Players the Job#
With Config.RequireJob on — the default — only players whose job is listed in Config.TaxiJob can start a shift. The dispatcher's panel still opens for anyone, so they can read the guide and the leaderboards.
Config.RequireJob = true -- false lets anyone drive, no job needed
Config.TaxiJob = {
['taxi'] = true,
-- ['cabco'] = true, -- add as many jobs as you like
}Hand the job out the way your server normally does — a job centre, a boss menu, or the framework's admin command:
# ESX, QBCore and Qbox all ship the same admin command
/setjob <id> taxi 0The Taxi Services blip is only drawn for players who hold one of these jobs. Losing the job in the middle of a shift ends the shift on the spot, and the server refuses to pay a fare to anyone who no longer has it.
Configuring the Resource#
Everything is configured in a handful of files, all left open for editing:
File | Contents |
|---|---|
| Every behaviour: who can drive, how players interact, the dispatcher and the rank, the cabs, the pickup and drop-off points, pay and levels, ratings, passenger requests, streaks, leaderboards, the marker, webhooks and debug. |
| The language, and every line of text in all eleven languages. |
| The driver uniform, male and female, used when |
| The qs-inventory taxi quests: titles, descriptions and rewards. |
The values worth reviewing first:
Config.Language = 'en' -- translations.lua: en · es · it · fr · pt · de · ru · tr · nl · cn · zh-tw
Config.RequireJob = true -- only players with a job in Config.TaxiJob can drive
Config.Target = false -- true = a target option on the dispatcher
Config.TargetScript = "ox" -- "ox" or "qb"
Config.DistanceUnit = "miles" -- the taximeter: "km" or "miles"
Config.CurrencyPosition = "prefix" -- $500, or "suffix" for 500 zł
Config.PlayerNameSource = 'character' -- 'character', 'cfx' or 'both'
Config.Fuel = false -- true fills the cab through Config.FuelExport
Config.Clothing = false -- true dresses the driver from client/clothing.luaConfig changes apply on the next restart of the resource. Usage → Configuration Reference lists every option with its default.
Verifying the Installation#
After completing the installation, restart your server and watch the console. On a first start with ESX the job is registered:
[qs-taxijob] Registered the ESX job "taxi"Nothing is printed on QBCore, Qbox or later starts — silence means the schema was already up to date. An upgrade from an older version prints one Added missing column line per leaderboard column, once.
Then join your server and work through the first loop:
Get the job
Give yourself the taxi job with
/setjob <your id> taxi 0. The Taxi Services blip appears on the map, at the Downtown Cab Co. rank.Talk to the dispatcher
Walk up to Manuel Ortega, under the floating blue marker, and press
E. The camera cuts to him and the job panel opens beside him: your level, the shift card and the cab picker.Start a shift
Pick the Taxi and press Start shift. You are put behind the wheel at a free bay, and within 5 to 20 seconds a fare comes in and the pickup appears on your GPS.
Finish a fare
Stop beside the passenger and press
E, drive them to the drop-off, stop and pressEagain. You are paid, the star card shows the rating and the tip, and the radio calls the next fare. From here, Usage covers everything else a shift can hold.
Setting things up? Turn
Config.Debugon inconfig/config.lua: the script then explains what it is doing in the server console and in F8. Leave it off on a live server — it prints a lot.



