The Job Panel#
Everything starts at the News Station, where the editor stands under a floating blue marker. Pressing E next to him — or choosing Start working on your target — cuts to a dialogue camera that frames him on the left half of the screen while he gestures, and opens the panel on the right. His name and greeting sit on a card beside him.
The panel opens for everybody, so anyone can read the job description, the guide and the statistics. The job is only checked when a route is started.
Part | What it shows |
|---|---|
Header | The courier's level and experience bar. Hovering it shows the Level Bonus: the payment and experience percentage the server will add on payout. |
Routes | Every route with its picture. Selecting one shows its details: level required, number of locations, reward and experience. |
Your Ride | The ride picker. Locked rides stay visible, dimmed, with the level they need — so couriers see what the next level unlocks. |
Job Details | A short description of the job. |
Footer | Guide, Statistics (hidden when the leaderboard is off) and Start route — which becomes Abandon route while the courier is out on one. |
The panel hides itself while the pause menu is open. During a route a small tracker stays on screen with the route's name, the stops delivered out of the total, and its pay and experience.
A Route, Step by Step#
Pick a route and a ride
Start route is refused if the courier lacks the job or the level, is already on a route, owes newspapers from an earlier one, has a full inventory, or if every parking spot is taken. Each refusal has its own message and the panel stays open so another choice can be made.
Collect the bike and the bag
The ride spawns in the first free parking spot with a
DELplate, the engine on and the keys handed over. The server puts one newspaper per stop in the inventory (orConfig.NewspaperAmount). WithConfig.SpawnInsideVehiclethe courier is seated straight away behind a short screen fade.Follow the blips
Every stop gets a map blip, and every stop still owed within 60 m gets a marker on the ground showing where the paper has to land. The GPS line always follows the closest stop still owed, so the route can be ridden in any order.
Throw from the saddle
Select the newspaper and throw it with the left mouse button. The paper must land within
Config.DeliveryRadius(5 m) of the stop. Throwing on foot is blocked with You are not on your work bike. The server confirms each stop with Newspaper delivered!, removes its blip and moves the tracker on.Ride back
When every stop is served — or the bag runs empty — the delivery blips clear and the GPS points to the drop-off at the station. Leaving with half the route done pays half.
Hand the bike in
Press E at the drop-off. The courier steps off, the bike is removed with its keys, leftover newspapers are taken back, and the server pays the route. If the server measures the courier as too far away, the prompt simply stays up to try again.
How Pay Is Worked Out#
Pay and experience are computed on the server, from the route in the config and the stops the server itself counted:
share = stops delivered / stops on the route
money = route.money × share × ride.moneyMultiplier × (1 + payment bonus %)
experience = route.experience × share × (1 + experience bonus %)Example: Vinewood Hills Run pays $1,000 and 800 XP for 5 stops. A level 10 courier (+5% / +5%) on the BMX (×1.15) who delivers 4 stops earns 1000 × 0.8 × 1.15 × 1.05 = $966 and 800 × 0.8 × 1.05 = 672 XP.
Unreturned newspapers#
The newspaper is a weapon item, so every paper handed out is tracked. A paper comes off the courier's tab when it lands at a stop the server counted, or when it is handed back at the end of the route. A paper that left the bag without reaching a stop — a miss, a drop, a stash — is charged out of that route's pay at one stop's worth (route money ÷ stops, rounded up), and the courier sees The newspapers you did not bring back were taken out of your pay.
The charge never exceeds what the route paid; whatever it could not cover stays on the tab for the next route.
A courier owing more than one bag cannot start a new route until they bring papers back. Papers still in the inventory are handed in automatically at the next start.
The tab follows the character, survives a reconnect, and is cleared by a restart of the resource.
Want to forgive misses? Raise
Config.NewspaperAmountabove the number of stops to hand out spares, or turn onConfig.UnlimitedNewspapersto give a paper back on every throw. Unused spares are reclaimed at the drop-off and cost nothing.
Routes#
Five routes ship in Config.Tasks:
Route | Level | Stops | Pays | Experience |
|---|---|---|---|---|
Cityline Route | 1 | 6 | $400 | 300 |
Uptown Express | 2 | 6 | $600 | 500 |
Grand Avenue Route | 3 | 6 | $600 | 500 |
Interstate Express | 4 | 7 | $800 | 700 |
Vinewood Hills Run | 5 | 5 | $1,000 | 800 |
Adding a route is one more entry in the list. Stand where each paper should land and copy your coordinates with any coords tool:
{
taskOrder = 6, -- unique id, never reuse one
name = "Mirror Park Loop",
img = "newspaper_delivery_3.png", -- a bundled picture or a full https:// URL
description = "Quiet streets and wide driveways around the lake.",
levelRequired = 6,
experience = 900, -- paid in full only when every stop is delivered
money = 1200,
route = {
vec3(1100.25, -645.10, 56.82),
vec3(1114.60, -612.33, 56.80),
-- one vec3 per doorstep
}
},imgaccepts one of the bundled pictures —newspaper_delivery_1.png,_2,_3— or a fullhttps://URL to your own. A name that does not exist falls back to a newspaper mark.Put each point on the doorstep, at ground height. The ground marker is drawn just below it.
Spread stops along the street. The server only accepts a stop while the courier is within
Config.DeliveryValidationDistance(40 m) of it, so stops packed into one spot can be served without riding.
Rides#
Config.Vehicles is the list the picker draws. The level is checked again on the server, and the payout uses the ride the server approved — not whatever the courier ends up sitting on.
Ride | Model | Speed | Level | Pay multiplier |
|---|---|---|---|---|
Whippet Race Bike |
| Low | 1 | ×1.00 |
BMX |
| Medium | 5 | ×1.15 |
Pegassi Faggio |
| High | 12 | ×1.35 |
Config.Vehicles = {
{
model = 'bmx', -- spawn name, must exist on your server
label = 'BMX', -- shown on the card
img = 'bmx.png', -- bundled picture or https:// URL
speed = 'Medium', -- the tag on the card
levelRequired = 5,
moneyMultiplier = 1.15, -- multiplies the route's payout
},
}
Config.VehicleSpawnCoords = { -- the first free spot is used
[1] = vector4(368.2910, -374.1460, 46.4329, 214.6424),
}
Config.DeliverBikeCoords = vector3(368.2910, -374.1460, 46.432) -- the drop-offAdd more parking spots if several couriers start at once: when every spot is blocked, the route is refused with The car park is full rather than spawning a bike inside another vehicle.
Levels and Bonuses#
Levelling is endless. Each level needs BaseExperience × GrowthFactor ^ (level − 1), so with the defaults (1000 and 1.1):
From level | Experience to the next | Bonus at that level |
|---|---|---|
1 | 1,000 | +0.5% |
2 | 1,100 | +1% |
5 | 1,464 | +2.5% |
10 | 2,357 | +5% |
20 | 6,115 | +10% |
60 and above | keeps growing | +30% (capped) |
Config.LevelExperience = {
BaseExperience = 1000, -- experience needed to leave level 1
GrowthFactor = 1.1, -- how much more each level needs
PaymentBonus = 0.5, -- % added to the money paid, per level
ExperienceBonus = 0.5, -- % added to the experience earned, per level
}
Config.MaxBonusLevel = 60 -- the bonuses stop growing here; levels do notA level up shows You went up to level N! at the drop-off. Levels are stored per character in qs_newspaper.
Statistics and Rankings#
The Statistics button in the panel opens three rankings, each ordered by experience and showing the earnings beside it. The courier's own row is highlighted, and a search box filters by name.
Ranking | Resets | Prizes (default) |
|---|---|---|
All-Time couriers | Never | — |
Top couriers Season | 00:00 on the 1st of every month | $5,000 · $3,500 · $2,000 |
Top couriers Daily | 00:00 every day | $550 · $350 · $200 |
Times are the server's clock. Each timed ranking shows a countdown, the prize per place and the last winners.
Winners online at the reset are paid in cash at once; offline winners are paid automatically the next time their character loads.
If the server was down at midnight or at the turn of the month, the missed reset runs on the next start — and never twice.
The boards are cached and refreshed every
Config.UpdateLeaderboardminutes, so a route just finished can take a minute to appear. Only couriers with experience in that period are listed, up toConfig.MaxLeaderboardPlayers.
Config.PlayerNameSource decides which name the rankings show: 'character' (first and last name), 'cfx' (the FiveM account name) or 'both'. The FiveM name only exists while someone is connected, so offline couriers fall back to their character name.
The Guide#
The Guide button opens a Paperboy's guide: an introduction, six steps and four tips. Every line comes from config/translations.lua (GUIDE_INTRO, GUIDE_STEP_1 to _6, GUIDE_TIP_1 to _4). Reword them freely; deleting a key removes that line from the guide.
Ending a Route Early#
What happens | Result |
|---|---|
Abandon route in the panel, then confirm | No pay. The bike, blips and tracker go, newspapers are taken back, and the panel stays open to pick another route. |
The courier loses the job mid-route | The route is abandoned at once. The server also re-checks the job at payout, so nothing is paid without it. |
The courier disconnects | The route ends without pay. Any newspapers not handed back stay on the tab. |
The bike cannot spawn | The whole route is rolled back on both sides, papers included. |
The Settings#
Every option lives in config/config.lua. Routes, rides and levels are covered above; the rest is here.
General — job, interaction and money
Config.RequireJob = true -- false lets anybody take a route
Config.NewspaperJob = { -- jobs allowed to deliver
['newspaper_delivery'] = true,
}
Config.Target = false -- true = third-eye, false = press a key nearby
Config.TargetScript = 'ox' -- 'ox' or 'qb'
Config.DrawText3D = true -- on-screen "[E] Start working" prompts
Config.Keys = {
InteractKey = 38, -- E: talk to the editor, hand the bike in
ThrowKey = 24, -- left mouse: the throw that delivers
}
Config.PlayerNameSource = 'character' -- 'character' | 'cfx' | 'both'
Config.DefaultNotifications = true -- false = your own notify system
Config.CurrencyPosition = 'prefix' -- 'prefix' → $500, 'suffix' → 500 złControl ids are listed in the FiveM controls reference. With Config.DrawText3D off, the prompt appears as a hint in the corner instead.
World — the blip and the editor
Config.EnableBlip = true
Config.Blip = { text = 'News Station', sprite = 525, size = 1.0, color = 3, display = 2 }
Config.StartJob = {
ped = {
coords = vector4(374.6473, -368.6436, 46.783, 155.9597),
model = 'csb_customer',
name = 'Marcus Vale', -- nil = use PED_NAME from the translations
greeting = "Morning. Pick a route and I'll have a bike ready for you.",
}
}The blip is only shown to players who can deliver. On a server with several languages, set name and greeting to nil so the translated PED_NAME and PED_GREETING are used. Blip sprites are in the FiveM blips reference.
Vehicle — spawn, fade and fuel
Config.SpawnInsideVehicle = false -- true seats the courier on the ride at once
Config.SpawnFade = { -- only used with SpawnInsideVehicle
enabled = true,
outTime = 400, -- ms to fade to black
holdTime = 200, -- ms held on black
inTime = 700, -- ms to fade back in
}
Config.Fuel = false -- true fills the tank on spawn
Config.FuelExport = exports['LegacyFuel'] -- any resource with SetFuelDelivery — the newspaper, throwing rules and distances
Config.NewspaperItem = 'weapon_acidpackage' -- the inventory item
Config.NewspaperWeapon = 'WEAPON_ACIDPACKAGE' -- the projectile detected
Config.NewspaperAmount = nil -- nil = one per stop
Config.UnlimitedNewspapers = false -- true = a paper back on every throw
Config.RequireWorkVehicle = true -- false allows throwing on foot
Config.DeliveryRadius = 5.0 -- how close the paper must land
Config.DeliveryValidationDistance = 40.0 -- how close the courier must be
Config.ReturnValidationDistance = 15.0 -- how close to the drop-offKeep DeliveryValidationDistance well above DeliveryRadius: by the time the paper lands and the server answers, a fast rider is already past the house. Values around 30 m were tested and cost honest couriers stops. The unlimited refill happens on the server and never tops the bag above the size it started at.
Markers and route blips
Config.DeliveryBlip = { text = 'News delivery point', sprite = 40, size = 1.0, color = 3, display = 2 }
Config.RouteBlip = { sprite = 1, size = 1.0, color = 3 } -- the GPS line
Config.DeliveryMarker = { -- on the ground at every stop still owed
enabled = true,
type = 1, -- 1 = flat cylinder
distance = 60.0, -- visible from, in metres
zOffset = 0.95,
bob = false,
rotate = false,
size = { x = 3.0, y = 3.0, z = 0.8 }, -- looks only; hits use DeliveryRadius
color = { r = 59, g = 130, b = 246, a = 110 },
}
Config.PedMarker = { -- floating over the editor
enabled = true,
type = 0, -- 0 = upside-down cone
height = 1.2,
distance = 25.0,
bob = true,
size = { x = 0.25, y = 0.25, z = 0.18 },
color = { r = 59, g = 130, b = 246, a = 170 },
}Marker shapes are in the FiveM markers reference.
Leaderboard
Config.EnableLeaderboard = true -- false hides Statistics and stops the resets
Config.UpdateLeaderboard = 1 -- minutes between refreshes
Config.MaxLeaderboardPlayers = 100 -- rows per ranking
Config.LeaderBoardRewards = {
Daily = { [1] = 550, [2] = 350, [3] = 200 },
Season = { [1] = 5000, [2] = 3500, [3] = 2000 },
}Debug
Config.Debug = falseOn, the script narrates what it is doing in the server console and the F8 console — notifications, payouts and the steps it reached. Leave it off on a live server: it prints a lot.
Discord webhooks, notifications and languages are covered in Integrations.



