The Job Panel#
Everything starts at the dispatcher — Manuel Ortega, standing at the rank under a floating marker. Walk up and press E (or use the target option, with Config.Target on): the camera cuts to him, your own character is hidden from the shot, and the job panel opens on the right half of the screen.
Part | What it shows |
|---|---|
Header | Your level, the experience towards the next one, and your reputation badge — the average of every star you have been given and the fares you have driven. |
The dispatcher's card |
|
Shift card | The taxi shift as it stands for you: pay per 100 m at your level, experience per 100 m, and the chance of an illegal stop. |
Your Cab | Every cab in |
Statistics | The leaderboards. Hidden when |
Guide | The driver's handbook. Hidden when |
Start shift / Clock off | Which one shows depends on whether you are already on shift. |
The panel opens for anyone, so players without the job can still read the guide and the leaderboards — starting a shift is what checks the job. Escape or the close button hands control back.
Every number on the panel is display only. The server works the same figures out again, from the same config, when a fare is actually paid.
Starting a Shift#
Pick a cab and press Start shift. Before anything is spawned, the job checks:
The player has a job listed in
Config.TaxiJob— unlessConfig.RequireJobis off.They are not already on shift.
Their level is high enough for the cab. The panel greys locked cabs out, and the server checks again.
There is a free bay in
Config.VehicleSpawnCoords. With every bay blocked by a vehicle, the shift is refused with Parking lot is full.
The screen fades, and the cab appears at the bay with the driver behind the wheel (Config.SpawnInsideVehicle). The keys are handed over, the tank is filled if Config.Fuel is on, and the uniform goes on if Config.Clothing is on. Then the radio is quiet for a moment — between Config.CustomerCalls minTime and maxTime, 5 to 20 seconds by default — before the first fare comes in.
A Fare, Step by Step#
The radio calls
The server draws a pickup from
Config.Rides.startLocationand a drop-off fromfinishLocation, and the pickup goes on the GPS. The tracker shows what the fare pays and the experience it is worth.Collect the passenger
The passenger appears as you approach. Stop the cab within
Config.InteractDistance(12 m) and pressE. They take the first free seat, back seats first, and the server checks the cab is really there.Drive
The taximeter starts, the route switches to the drop-off and the on-time clock begins. Some passengers ask for something on the way, and some offer an illegal stop.
Drop them off
Stop within 12 m of the drop-off and press
E. The passenger gets out and walks off, you are paid, and the star card shows the rating, the fare, the tip and your streak.The next call
After another pause the radio calls again. It keeps calling until you clock off — even after a fare that went wrong.
There are no ground markers. The GPS route and the prompt that appears at
Config.InteractDistanceare what tell a driver they have arrived — keep that distance generous enough that the stop is never a guessing game.
Fares and Pay#
A fare is priced on the straight-line distance between its pickup and its drop-off, so spreading your points across the map is what creates long, well-paid rides. The pay is built up in this order:
Step | How it is worked out | Default |
|---|---|---|
Base fare | Distance ÷ 100 × the pay per 100 m at the driver's level × the cab's | $10 per 100 m at level 1 |
Illegal stop |
| ×2.0 |
On time |
| ×1.2 |
Request met | The passenger request's | ×1.20 to ×1.35 |
Streak | The highest streak tier reached | ×1.10 to ×1.35 |
Tip | A share of everything above, by star rating | 0 to 25% |
A worked example, at level 1 in the stock Taxi: a 2 km fare is $200. Delivered on time it becomes $240; an urgent passenger who got there in time takes it to $324; as the fourth fare in a row it is $356; and five stars add an $89 tip — $445 for the ride, and 480 experience.
Where the money goes#
Fare | Paid as |
|---|---|
A legal fare | Cash to the driver. With |
An illegal fare | Black money: the |
A player fare | Cash, from the passenger up front to the driver on arrival — or to the job's money with |
If a payment cannot land — an ESX install with no black_money account, a QBCore inventory with no black_money item, a full bag — the driver is told so plainly and the money is not counted on the leaderboard. The experience is still given: the work was done.
The Taximeter and the On-Time Bonus#
Once the passenger is in, the taximeter shows the fare climbing and the distance left, in Config.DistanceUnit (km or miles), and the tracker counts down the bonus clock.
Setting | Default | What it does |
|---|---|---|
| 0.1 | Time allowed per metre of the fare — 10 seconds per 100 m. |
| 20 | Seconds docked every time the cab is damaged. |
| 1.2 | Pay and experience multiplier for arriving in time. |
| 10 | Extra seconds granted for taking an illegal stop. |
The clock that counts is the server's. It starts when the passenger is picked up, and the countdown on screen is only a display of it — a reported crash can lose the bonus, but nothing can claim it after the real deadline.
Passenger Requests#
With Config.PassengerEvents on, 40% of fares ask for something beyond arriving. The request shows on the tracker the moment the passenger gets in. Meeting it multiplies the pay; ignoring it costs stars, never the fare.
Request | What they want | Pays |
|---|---|---|
Urgent Fare ( | The bonus clock is cut to 75% ( | ×1.35 |
Delicate Passenger ( | No more than 3 hard stops ( | ×1.20 |
Sightseeing Fare ( | Drive within 60 m ( | ×1.30 |
A hard stop is a big drop in speed in a fraction of a second — a slammed brake or a kerb — measured above walking pace, so manoeuvring does not count. The sight a tourist asks for is one of your drop-off points: the one that costs the least detour, so a fare from the docks is never sent across the map. Each request's weight sets how common it is compared with the others.
Illegal Stops#
Once the passenger is in, there is a Config.ChanceToGetIllegalJob chance (10%) that they offer a stop on the way. A window shows what the detour pays and the chance of the police being told, and the driver accepts or declines.
Accepted, the route switches to a point from Config.Rides.illegalLocation, marked in its own blip colour so it never reads as the destination. The fare is re-priced on the whole journey — pickup, stop, drop-off — and doubled. At the stop the passenger gets out, walks up to the buyer, and the two make the exchange.
Outcome | What happens |
|---|---|
Not reported | The passenger gets back in and the route continues to the drop-off. Paid in black money on arrival. |
Reported |
|
The chance of being reported starts at 20% and falls by 1% per level, down to about 11% at the level-60 cap. The roll is made on the server, after the hand-off scene has played.
Ratings, Tips and Streaks#
With Config.Rating on, every NPC fare is scored out of five stars. Each ride starts at five and loses stars from there:
Mistake | Stars lost |
|---|---|
Each crash during the ride | 0.75 ( |
Missing the on-time bonus | 1.5 ( |
Ignoring the passenger's request | 1.0 ( |
The result is rounded to a whole star and never falls below one (minStars). The tip is a share of the fare after all the multipliers:
Stars | Tip |
|---|---|
★★★★★ | 25% |
★★★★ | 15% |
★★★ | 5% |
★ or ★★ | Nothing |
With noTipAfterCrash on, a single crash loses the tip whatever the stars came to — nobody tips the driver who put them through the windscreen. The star card at the end of each fare explains every star taken and shows the fare, the tip, the total and the streak; turning showCard off hides the card but keeps the rating and the tip.
Reputation#
Every rating goes on the driver's record: an average, the number of ratings and the number of fares driven. It shows in the panel header, and on the driver card a player passenger sees before accepting a ride. Records live in driver_ratings.json, written every minute and on shutdown.
Streaks#
Fares finished back to back pay more and more. A fare that was reported to the police does not break the streak; clocking off or abandoning the shift takes it back to zero — that is the point: it is a reason to stay out.
Fares in a row | Pay multiplier |
|---|---|
3 | ×1.10 |
5 | ×1.20 |
10 | ×1.35 |
The tier reached on the previous fare is the one that pays the next, so the third fare in a row finishes at normal pay and the fourth is the first paid at ×1.10.
Levels and Experience#
Every fare earns Config.ExperiencePerHundredMeters (20) experience per 100 m — 200 per kilometre — multiplied by the illegal-stop and on-time bonuses. Levelling never stops: each level asks for a little more than the last, and each one pays better.
Setting | Default | What it does |
|---|---|---|
| 1000 | Experience needed to leave level 1. |
| 1.1 | Each level needs 10% more than the one before. |
| 10 | Base pay per 100 m at level 1. |
| 1.02 | Pay rises 2% per level. |
| 20 | Chance, in %, of an illegal stop being reported at level 1. |
| 0.99 | The alert chance falls 1% per level. |
| 60 | The level where pay and alert scaling stop growing. Levelling itself carries on. |
These live in Config.LevelExperience. With the defaults, a level-10 driver earns about $11.95 per 100 m and needs 2,357 experience for the next level; a driver at the cap earns about $32.17 per 100 m — three times a beginner — and is reported on roughly 11% of illegal stops. Without the cap, a long-lived character would eventually earn absurd fares and never be reported.
The Cabs#
Config.Vehicles is the list the cab picker draws, in order. Add as many as you like — the first one is also the fallback if a cab is ever missing:
Config.Vehicles = {
{
model = 'taxi', -- spawn name, must exist on your server
label = 'Taxi', -- shown on the card
img = 'taximodel.png', -- the shipped picture, or a full https:// URL
seats = 4, -- shown as a tag on the card
levelRequired = 1, -- the lowest level that can take it out
moneyMultiplier = 1.0, -- multiplies every fare driven in it
},
{
model = 'stanier',
label = 'Stanier Cab',
img = 'https://docs-backend.fivem.net/vehicles/stanier.webp',
seats = 4,
levelRequired = 10,
moneyMultiplier = 1.15,
},
}For a cab's picture, use a full https:// address — the FiveM vehicle gallery at docs-backend.fivem.net/vehicles/<model>.webp has one for every base-game car. A picture that cannot be found falls back to a car mark, so a typo costs the picture and nothing else. Config.ShiftImage sets the shift card's cover the same way; set it to nil for a plain taxi mark.
The passengers and the buyers at illegal stops are drawn at random from Config.PassengerModels (77 peds) and Config.DealerModels (10). Any valid ped model works.
Player Passengers#
A real player can ride in a working cab. The moment they sit down, the driver's client reports it and the server pairs the two — as long as the driver is on shift and they are within 10 m of each other.
Mark a destination
The passenger's map opens. They drop a waypoint and close the map. Any waypoint left over from before they got in is cleared first, so the quote is always for where they mean to go.
The quote
The server prices the trip from the passenger to the waypoint — at the driver's level, in the driver's cab — and shows it beside a driver card: name, level, star rating, number of ratings and fares driven.
Accept and pay
Accepting charges the fare in cash, up front. Declining re-opens the map. Not having enough money re-opens it too, so somewhere closer can be tried.
The ride
The driver gets the route and the taximeter, and the passenger sees the same meter. A player comes first: any NPC fare the driver had going is dropped.
Arrival
The driver stops within 12 m of the waypoint and presses
E. The driver is paid the quote, the passenger steps out and — for any trip over 100 m — is asked to rate the driver from one to five stars. The rating has to be given within three minutes, once.
Situation | What happens |
|---|---|
The driver clocks off, disconnects or loses the job | A paid fare is refunded to the passenger in full. |
The passenger gets out before paying | The request is cancelled. Nothing is charged. |
The passenger gets out after paying | The driver still earns the fare on reaching the destination. |
A second player gets into the same cab | One player fare per cab at a time. The second passenger is offered again once the first fare is over. |
| A passenger with a taxi job rides free — checked on the server against their real job. |
The money changes hands on arrival either way, but the experience and the leaderboard earnings are only given when the cab really drove the route: it has to cover at least 75% of the quoted distance, in a time a car could actually do it. Two players who park side by side at a far waypoint earn nothing but the money they passed between themselves.
Statistics and Leaderboards#
Statistics in the job panel opens three rankings, each ordered by experience with earnings beside it. Your own row is highlighted, and a search box finds anyone else.
Ranking | Resets | Prize for 1st · 2nd · 3rd |
|---|---|---|
All-time | Never | — |
Season | 00:00 on the first day of every month | $5,000 · $3,500 · $2,000 |
Daily | 00:00 every day | $500 · $350 · $200 |
The boards refresh every Config.UpdateLeaderboard minutes (1) and list up to Config.MaxLeaderboardPlayers drivers (100). Each ranking shows a countdown to its reset, the prizes on offer and the last winners. Prizes are set in Config.LeaderBoardRewards.
Prizes are paid in cash. A winner who is offline at the reset is paid on their next login. Resets follow the server's clock, and a server that was down over midnight or a month boundary catches up when it starts — never paying the same period twice.
The Guide#
Guide in the job panel opens the Driver's Handbook: an introduction, the steps of a shift and a list of tips. All of it comes from the GUIDE_INTRO, GUIDE_STEP_1 to GUIDE_STEP_12 and GUIDE_TIP_1 to GUIDE_TIP_12 keys in config/translations.lua, read in order until the first missing number — so a step is added, reworded or removed by editing the translation alone.
Clocking Off#
Open the panel at the dispatcher and press Clock off. A confirmation warns when a passenger is still in the cab; confirming abandons that fare unpaid, takes the cab back, restores the player's own clothes and resets the streak. The panel stays open, so a new shift can be started straight away.
A shift also ends on its own when the driver loses the job, disconnects, or the resource restarts. Another script can end it too, through the cancelShift export — a jail script, for example.
Configuration Reference#
Every option lives in config/config.lua, in ten numbered sections. Changes apply when the resource restarts.
1. General — jobs, interaction, names and money
Option | Default | What it does |
|---|---|---|
| true | Only players with a job in Config.TaxiJob can start a shift. |
| taxi | The jobs allowed to drive. |
| false | A target option on the dispatcher instead of a key press. |
| "ox" | "ox" for ox_target, "qb" for qb-target. |
| false | Floating 3D text instead of the corner prompt. |
| 12.0 | Metres at which the pickup, drop-off and stop prompts appear. |
| 38 (E) | The interaction key, as a FiveM control id. |
| 'character' | Names on the leaderboard and driver card: 'character', 'cfx' (the FiveM name) or 'both'. |
| Manuel Ortega | The dispatcher's card in the panel. Empty hides it. |
| "miles" | The taximeter's unit: "km" or "miles". |
| true | The built-in notifications. false sends them to SendTextMessage. |
| "prefix" | $500, or "suffix" for 500 zł. |
| false | Locks qs-inventory while the uniform changes. |
| false | Dresses the driver in the uniform from client/clothing.lua. |
| empty | Called when an illegal stop is reported. |
2. World — blips, the dispatcher and the rank
Option | Default | What it does |
|---|---|---|
| true | The Taxi Services blip, shown to players with the job. |
| sprite 198, colour 5 | That blip's text, sprite, size, colour and display. |
| sprite 1, colour 5 | The blip on the pickup and the drop-off. |
| sprite 1, colour 64 | The blip on an illegal stop. |
| cs_manuel | The dispatcher's position (vector4, with heading) and model. |
| 10 bays | Where cabs appear. One driver can start per free bay. |
| true | Seats the driver in the cab, behind a short fade. |
| false · LegacyFuel | Fills the tank on spawn through that resource's SetFuel. |
3. Vehicles — cabs, passengers and buyers
Option | Default | What it does |
|---|---|---|
| Taxi | The cab picker — see The Cabs above. |
| 77 peds | One is drawn at random for each fare. |
| 10 peds | The buyer waiting at an illegal stop. |
4. Rides — pickups, drop-offs and illegal stops
Option | Default | What it does |
|---|---|---|
| 12 points | Where fares wait. vector4 — the fourth value is the way they face. |
| 13 points | Where they go — and the sights tourists ask for. |
| 5 points | Where an illegal stop is made. |
| 5 to 20 | Seconds of radio silence between one fare ending and the next call. |
| false | Taxi drivers ride free in a colleague's cab. |
5. Levels and shifts — pay, experience and the bonus clock
Option | Default | What it does |
|---|---|---|
| see Levels and Experience | The experience curve, and the pay and alert scaling. |
| 60 | Where the pay and alert scaling stop. |
| 20 | Experience per 100 m driven. |
| 2.0 | Pay and experience multiplier for a fare with an illegal stop. |
| 10 | % of fares that offer an illegal stop. 0 turns them off. |
| 0.1 | Bonus time allowed per metre. |
| 20 | Seconds docked per crash. |
| 1.2 | Pay and experience multiplier for arriving in time. |
| 10 | Extra seconds for taking an illegal stop. |
| 'taximodel.png' | The shift card's cover. A URL works; nil shows a plain taxi mark. |
6. Ratings, passenger requests and streaks
Option | Default | What it does |
|---|---|---|
| true | Star ratings and tips on NPC fares. |
| 0.75 · 1.5 · 1.0 | Stars lost per mistake. |
| 1 | The lowest possible score. |
| 25% · 15% · 5% · 0 · 0 | The tip by stars, from 5 down to 1. |
| true | One crash loses the tip. |
| true | The star card at the end of each fare. |
| on, 40% | Passenger requests, the share of fares that roll one, and each request's weight, target, radius and payMultiplier. |
| on, 3 · 5 · 10 | Streak tiers: the fares in a row and the multiplier each one pays. |
7–9. Guide, leaderboard and marker
Option | Default | What it does |
|---|---|---|
| true | The Guide button in the panel. |
| true | The Statistics button, the rankings, resets and prizes. |
| 1 | Minutes between leaderboard refreshes. |
| 100 | Drivers listed per ranking. Higher costs query time on every refresh. |
| Daily 500 · 350 · 200, Season 5000 · 3500 · 2000 | Cash for the top three at each reset. |
| blue cone | The marker over the dispatcher: enabled, type, height, distance, bob, size and colour. |
10. Debug and webhooks
Option | Default | What it does |
|---|---|---|
| false | Explains what the script is doing in the server console and F8. Off on a live server. |
| off | Discord logs — see Integrations. |
The dispatcher's position, the bays and the ride points are content tables: change the values freely, keep the structure. Spreading pickups and drop-offs across the whole map is what makes long fares — and long fares are what make the job worth doing.



