What goes wrong most often, what it actually means, and what to do about it. For anything not listed here, set Config.Debug = true and restart: the server console and F8 show how far the job got before it stopped.
Installation and Startup#
"You have renamed the script!" and the console freezes
The folder is not called qs-busjob. The resource checks its own name on start and halts on purpose when it does not match. Rename the folder back, fix the ensure line in server.cfg and restart the whole server — the frozen console will not take commands.
No dispatcher, no blip — the job does nothing at all
The framework was not running when the job started, so it found none. The console may show one of these lines, or nothing at all if the framework had not started yet when the job loaded:
[qs-busjob] es_extended has not answered getSharedObject after 10s. Is it started, and does it start before this resource?
[qs-busjob] qb-core has not answered GetCoreObject after 10s. Is it started, and does it start before this resource?Move your framework's ensure above ensure qs-busjob and restart the server.
"Illegal mix of collations" in the console
The leaderboard joins the job's table to your framework's player table, and MySQL refuses when their collations differ — common on MariaDB 11.4 and newer. The job fixes this itself on start; when it cannot, it prints the exact statement to run:
[qs-busjob] could not align `qs_busdriverjob`.`identifier` to utf8mb4_uca1400_ai_ci (users.identifier uses it).
The leaderboard will fail with "Illegal mix of collations" until it matches. Run by hand:
ALTER TABLE `qs_busdriverjob` MODIFY `identifier` varchar(46) COLLATE utf8mb4_uca1400_ai_ci NOT NULL;Run that statement in HeidiSQL or phpMyAdmin, then restart the resource.
/setjob says the bus_driver job does not exist
On QBCore and Qbox jobs live in shared/jobs.lua, not in the database, so the job has to be added there by hand — see Giving Players the Job. On ESX it is registered automatically; if the console says Could not register the ESX job rows, run the two INSERT statements from [sql]/qs-busdriver.sql and restart the server so ESX loads the new job.
"Ped model … never loaded"
Config.StartJob.ped.model is not a ped model the game knows, or an add-on ped is not streamed. Use a valid model name and restart the resource.
The Depot and the Panel#
There is no Bus Station blip
Correct behaviour for players who cannot drive. The blip is only shown to players allowed to start a route — with Config.RequireJob on, those holding a job listed in Config.busdriverjob — and it appears the moment they are given the job. If nobody sees it, check Config.EnableBlip.
"You don't have the bus driver job"
The player's job is not in Config.busdriverjob. Hire them with /setjob <id> bus_driver 0, add the job they already have to the list, or set Config.RequireJob = false. The same message ends a route when a driver loses the job half-way — and that route is not paid.
"You don't have the required level" or "You have not unlocked that bus yet"
The driver's level is below the route's or the bus's levelRequired. The server checks the level it has stored, so the only way up is to finish lower routes — or to lower the requirement in the config.
"You are already driving a route"
A route is still open for that player. Open the panel and use Abandon route first. Disconnecting also drops it.
Pressing E at the dispatcher does nothing
With Config.Target = true the key prompt at the dispatcher is turned off — use the third eye instead. If the third eye shows nothing either, Config.TargetScript does not match the target resource you run, or that resource starts after the job.
The Statistics button is missing
Config.EnableLeaderboard is false. Turning it off hides the button and stops the resets and prizes.
The camera does not cut to the dispatcher
Correct behaviour when the panel is opened from somewhere else — an export, a radial menu — more than 6 m from the dispatcher. The panel opens on its own instead of cutting across the map.
Driving a Route#
"Parking lot is full"
Every bay in Config.VehicleSpawnCoords has a vehicle standing in it — often a car someone left in the depot. Clear the bays, or add more; keep new bays more than 2.5 m apart across their heading so a bus in one never blocks the next.
"The depot could not bring a bus out"
A bay was free, but no bus appeared within 5 seconds, so the route was dropped without charge. F8 names the model:
[qs-busjob] The bus 'pbus2' never spawned. Is the model on this server?Check the spawn name in Config.Vehicles, and that an add-on model is actually streamed by a running resource.
No prompt at a stop, or pressing E there does nothing
The prompt only appears within 10 m of the stop, and only while you are in the driver's seat of the bus this route spawned — not another bus, not as a passenger, not on foot. The server then needs you within Config.StopReachDistance (25 m) of the stop point, and it has to be the next stop. A custom stop placed away from the road can be unreachable in a bus: move it onto the pavement beside the lane.
The bus has no keys, or cannot be locked
No supported key script was running when the job started — check that it is ensured above qs-busjob — or yours is not on the list. Integrations shows how to pin one or add a bridge for it.
The bus spawns with an empty tank
Set Config.Fuel = true and point Config.FuelExport at your fuel resource, which needs a SetFuel export.
Stops take too long
Every passenger uses the front door, one at a time, at about three seconds a head. Lower maxBoard and maxAlight in Config.PassengersPerStop, and the longRideBonus if long routes are the slow ones.
Some passengers walk away instead of boarding
Correct behaviour. Either the bus had no seat left for them, or they could not reach the door after two tries — blocked by traffic, a bollard, or a bus parked too far from the kerb. They are never teleported into a seat.
There is no prompt to hand the bus back
It only appears after the last stop has been served, within 5 m of Config.DeliverBusCoords. The server then needs you within Config.DeliverReachDistance (20 m) of it.
The route paid less than the card says
The card shows the route's base pay. Each crash the server logged took Config.CrashMonetaryPayment off, less your crash protection; the bus multiplier and level bonus then apply to the rest. With Discord logs on, the MissionFinished embed shows the crash penalty that was taken.
The route was not paid at all
Either the driver lost the job before handing the bus back — they were told "You don't have the bus driver job" — or the route was abandoned. With qs-job-management running, the payout went to it rather than to the driver's cash.
A player passenger was not charged
The driver must be on a route and at the wheel of that route's bus. The same passenger pays the same driver once per Config.TicketCooldown (180 s), the fare comes from cash — not the bank — and Config.MultiplayerTicketPrice = 0 turns fares off.
The uniform does not change, or stays on after the route
On ESX the outfit is skipped for a character with no saved skin in esx_skin — the job itself carries on. On QBCore and Qbox your appearance script has to answer the qb-clothing events; for illenium-appearance, swap in its reload line in client/clothing.lua (see Integrations). Or turn Config.Clothing off.
Leaderboards#
The leaderboard is empty
The boards refresh every Config.UpdateLeaderboard minutes and only list drivers with experience in that period, so the daily and season boards are empty right after a reset until someone finishes a route. If the console shows "Illegal mix of collations", fix that first — see above.
Names show as "Unknown"
The character has no first or last name in users (ESX) or players.charinfo (QBCore). Set Config.PlayerNameSource = 'both' to show the FiveM name as well while the player is online.
The daily or season prizes were not paid
Resets run at 00:00 on the server's clock — check the machine's time zone. A winner who was offline is paid in cash the next time they log in. Prizes need Config.EnableLeaderboard on, and only drivers with experience in that period can place.
Error Keys#
Refusals reach the player as translation keys, so the same failure reads correctly in every language. Each one means exactly this:
Key | Means |
|---|---|
| The player holds no job listed in |
| A route is already open for this player. |
| The stored level is below the route's |
| The stored level is below the chosen bus's |
| Every bay in |
| A bay was free but no bus appeared within 5 seconds — usually a model that is not on the server. |
| A player passenger cannot pay the ticket in cash. |
Still stuck? Open a ticket and include the server console from start-up with
Config.Debugon, the F8 output from the moment it went wrong, your framework, and the order of yourensurelines inserver.cfg.



