Configuration Reference
Every oxide-postaljob setting and its factory default — plus how database-backed settings, the /postaljob settings editor, and adding a second depot work.
Every setting in oxide-postaljob, explained in plain terms. Distances are in meters and times are in seconds unless a setting says otherwise. Start with How Settings Work — the job keeps its settings in your database, so editing the config files does not always do what you expect.
How Settings Work
Settings are edited in-game with the /postaljob settings command (admins only). Changes save to your database and apply instantly — no restart needed.
The config files in the shared/ folder are factory defaults. The first time the resource starts, every value is imported from the files into the database; from then on, the database is the source of truth and editing a file changes nothing for a setting that is already stored, even after a restart. Only brand-new settings added by a future update are imported from the files.
The job still reads the files at every start, and Reset to default on a setting in /postaljob settings loads that setting's file value, replacing the stored one. So a file edit takes effect only after you restart the resource and press Reset to default on that setting.
This includes the depots, delivery addresses, and letterboxes — everything is database-managed. A depot's name, Clerk spot, and van spawn are edited in /postaljob settings under Locations. Its pickup points, post boxes, letterboxes, delivery addresses, and menu camera are not in the menu: they change through shared/config/locations.lua, a restart, and Reset to default on Depots, usually with the /postalbuilder export (see Adding a second depot).
Two settings are never copied into the database, so they are always read from the files: Config.UseHudAccent in shared/config.lua, and Config.SettingsCommand in shared/config/models.lua, which only sets the command named in missing-model warnings.
So there are two ways to work:
- First-time setup: edit the files in
shared/before the resource's first start. Your values are imported automatically. - Changing a setting later: run
/postaljob settingsin game as an admin. See The Settings Editor for how the menu works.
The tables below document every setting and its factory default.
Which File Does What
| File | What's in it |
|---|---|
shared/config.lua | Main switches (debug, phone, menu style, worker limits) |
shared/config/job.lua | Pay, crew, complaints, delivery timer, and the cancel cooldown |
shared/config/levels.lua | The five job levels and what each unlocks |
shared/config/locations.lua | The depot, delivery addresses, and letterboxes |
shared/config/npcs.lua | The supervisor NPC, the map blip, and customer models |
shared/config/outfits.lua | Work uniforms (optional) |
shared/config/vehicles.lua | The delivery van and the box/mail bag props |
shared/config/visuals.lua | Markers, animations, and the floating waypoint |
shared/config/tutorials.lua | First-time player hint prompts |
shared/config/models.lua | Model replacements, and the mailbox models the builder scans for |
Main Switches
File: shared/config.lua
| Setting | Default | What it does |
|---|---|---|
Config.Debug | false | Prints extra [oxide-postaljob] lines to the console for troubleshooting. Leave off normally |
Config.usePhone | true | Sends shift messages (welcome, crew, van destroyed, death or hospital, and the pay summary when Config.shiftSummary sends it) to the player's phone: as texts on phones that support them, as mail on the others. Texts need o-link 1.11.0 or newer; with an older o-link they arrive as mail. See Phone shift messages for which phones get which, and for Oxide Phone's Gigs app. When false they show as on-screen notifications instead, and the pay summary becomes a short net-pay notification. In /postaljob settings it's the Use phone toggle under General |
Config.shiftSummary | 'text' | How the pay summary is shown at clock-out. 'text' sends it to the player's phone (as a text or mail; a short net-pay notification when Config.usePhone is off) and shows a clock-out notification on screen. 'nui' shows a pop-up summary screen instead, with either menu style, and sends nothing to the phone. A shift that ends any other way (its depot deleted, a resource restart) gets the 'text' summary in both modes |
Config.menuStyle | 'nui' | Shift menu style: 'nui' = full custom menu with depot camera, 'menu' = simple text menu |
Config.UseHudAccent | true | The delivery overlay and the tutorial prompts use your server's accent colour from Oxide HUD, set in Oxide HUD's Config.Theme. false keeps the job's own colours. Without Oxide HUD, or with no accent set there, nothing changes. Config file only: it is not in /postaljob settings, so change it in the file and restart |
Config.Sync.broadcastRange | 250.0 | How far away other players can be and still see someone's box pallet at the depot |
Config.MaxSlotsPerLocation | 3 | How many players can be on shift at one depot at the same time |
Pay, Crew, and Timers
File: shared/config/job.lua
Crew
| Setting | Default | What it does |
|---|---|---|
Config.Crew.maxSize | 2 | Crew size (the leader plus one partner) |
Config.Crew.inviteTimeout | 60 | Seconds before an unanswered crew invite expires |
Config.Crew.coopBonusPercent | 0.15 | Extra pay on every delivery made while crewed, as a share of each member's own pay for it (0.15 = 15%) |
Config.Crew.extraDeliveries | 2 | Extra stops added to the round when a partner joins |
Payment
| Setting | Default | What it does |
|---|---|---|
Config.Payment.basePay | 40 | Base pay for every delivery |
Config.Payment.distanceBonusPerUnit | 0.40 | Extra pay per meter driven to the delivery |
Config.Payment.speedBonusAmount | 20 | Flat bonus for beating the delivery timer |
Config.Payment.earlyFinishPenalty | 0.80 | Pay kept when clocking out with undelivered items (0.80 = player keeps 80%, loses 20%) |
Config.Payment.vehicleDestroyFine | 150 | Fine charged the moment the van is destroyed |
Config.Payment.streakBonusPerDay | 10 | Bonus per delivery for each day of the player's daily streak |
Config.Payment.maxStreakDays | 7 | The streak stops growing at this many days |
Config.Payment.gasFeePercent | 0.05 | Gas fee taken from the shift total at clock-out (0.05 = 5%) |
Config.Payment.taxPercent | 0.10 | Tax taken from the shift total at clock-out (0.10 = 10%) |
Config.Payment.minDeliveryTimePerDistanceUnit | 0.05 | Anti-cheat: the fastest believable pace, in seconds per meter. Deliveries finished faster than this are rejected |
Config.Payment.absoluteMinDeliveryTime | 10 | Anti-cheat: a delivery can never legitimately take less than this many seconds |
Config.Payment.maxTravelSpeed | 50.0 | Anti-cheat: Fastest believable trip in the editor, in meters per second along a straight line. A delivery finished faster than this allows, measured from where the van was loaded or the previous stop (from the depot for a delivery made before the van is loaded), pays no distance bonus and no on-time bonus, and the server console logs delivered faster than the van can drive. It backs up the two minimum times above and catches what gets past them if you lower them. Raise it if your server has very fast vehicles |
Config.Payment.payoutAccount | 'bank' | Account shift pay goes into ('bank', 'cash', etc.) |
Config.Payment.fineAccount | 'cash' | Account the van-destroyed fine comes out of |
Complaints
| Setting | Default | What it does |
|---|---|---|
Config.Complaints.maxComplaints | 3 | Complaints needed to get suspended from the job |
Config.Complaints.timeoutMinutes | 30 | How long a suspension lasts, in minutes |
Config.Complaints.vehicleDestroyPenalty | 1 | Complaints given when the van is destroyed |
Config.Complaints.deathPenalty | 1 | Complaints given when the player dies on shift |
Config.Complaints.decayPerDelivery | 1 | Complaints removed for every completed delivery |
Timer
| Setting | Default | What it does |
|---|---|---|
Config.Timer.baseTime | 60 | Seconds every delivery gets regardless of distance |
Config.Timer.timePerDistanceUnit | 0.25 | Extra seconds per meter to the delivery |
Config.Timer.expiredPenalty | 0.85 | Pay kept on a late delivery (0.85 = player keeps 85%, loses 15%) |
How a timer is calculated:
timeLimit = Config.Timer.baseTime + math.floor(distance * Config.Timer.timePerDistanceUnit)In the settings editor these are the Delivery timer fields under Tasks & Dispatch.
Cancelling a round
Players can drop the round they're on without clocking out (see Cancelling the current round). This setting controls the short wait afterwards — Cancelling a round under Tasks & Dispatch in the settings editor.
| Setting | Default | What it does |
|---|---|---|
Config.Cancel.cooldownSeconds | 60 | How long a player must wait after cancelling before they can take a new round or clock in again. Set to 0 to remove the wait entirely |
Config.Cancel = {
cooldownSeconds = 60, -- seconds; 0 = no wait
}The wait applies to the player who cancelled, and it's tied to the character, so relogging doesn't skip it. Because the whole point of cancelling is to escape a bad round rather than to be punished, there is no fine and no complaint attached to it — this cooldown is the only cost.
Levels
File: shared/config/levels.lua
Each entry in Config.Levels is one job level:
| Field | What it does |
|---|---|
title | The level's display name (a translation key from locales/en.json) |
requiredDeliveries | Lifetime deliveries needed to reach this level |
maxPackages | How many stops a package round has at this level |
maxLetters | How many stops a letter round has at this level |
tipChance | Odds of a tip per delivery (0.25 = 25%) |
tipRange | Smallest and largest possible tip, e.g. { 10, 30 } |
payMultiplier | Multiplies the delivery pay (1.2 = 20% more) |
spreadFactor | Shapes the route: 1.0 = addresses far apart (new players explore the map), 0.0 = addresses close together (efficient routes for veterans) |
Default levels
Config.Levels = {
[1] = { title = 'level.trainee', requiredDeliveries = 0, maxPackages = 3, maxLetters = 3, tipChance = 0.10, tipRange = { 5, 15 }, payMultiplier = 1.0, spreadFactor = 1.0 },
[2] = { title = 'level.mail_carrier', requiredDeliveries = 20, maxPackages = 4, maxLetters = 4, tipChance = 0.15, tipRange = { 5, 20 }, payMultiplier = 1.1, spreadFactor = 0.75 },
[3] = { title = 'level.senior_courier', requiredDeliveries = 50, maxPackages = 5, maxLetters = 4, tipChance = 0.25, tipRange = { 10, 30 }, payMultiplier = 1.2, spreadFactor = 0.5 },
[4] = { title = 'level.route_manager', requiredDeliveries = 100, maxPackages = 7, maxLetters = 5, tipChance = 0.30, tipRange = { 10, 40 }, payMultiplier = 1.35, spreadFactor = 0.25 },
[5] = { title = 'level.head_postman', requiredDeliveries = 200, maxPackages = 9, maxLetters = 6, tipChance = 0.40, tipRange = { 15, 50 }, payMultiplier = 1.5, spreadFactor = 0.0 },
}You can add more levels as extra rows under Levels in /postaljob settings. Note: a package round can never exceed the number of box positions inside the van (11 by default — see Config.VanBoxOffsets).
Locations
File: shared/config/locations.lua
Each entry in Config.Locations is one complete depot. The job ships with one, the GoPostal Depot.
| Field | Required | What it is |
|---|---|---|
name | Yes | The depot's name. It shows on the map blip and at the top of the shift menu. Ships as a translation key ('location.gopostal_depot', defined in locales/en.json) — anything that isn't in the locale file is shown exactly as typed, so plain text like Sandy Shores Depot works fine |
coords | Yes | Where the supervisor NPC stands. Three numbers: east/west, north/south, height |
heading | Yes | Which way the NPC faces, 0 to 360 |
vehicleSpawn | Yes | Where the delivery van appears. Four numbers — position, then the direction the van points |
menuCamera | No | The camera shot used by the 'nui' shift menu. Leave it out and the menu simply opens without a camera move |
pickupPoints | Yes | A list of spots where the box pallet can appear for package rounds. One is picked at random each round. At least one is needed |
postBoxes | For letter rounds | A list of spots where players collect the mail bag. One is picked at random per letter round. Without any, letter rounds can't be handed out at this depot |
letterBoxes | For letter rounds | The stops a letter round delivers to |
deliveryZones | Yes | The stops a package round delivers to. Without any, the depot can't hand out package rounds |
Inside menuCamera:
| Field | What it is |
|---|---|
coords | Where the camera sits |
heading | Which way the camera looks, 0 to 360 |
fov | How zoomed in it is. Lower numbers zoom in, higher numbers show more. 50 is a good starting point |
Delivery zones and letterboxes
Each entry in deliveryZones and letterBoxes looks like:
| Field | What it is |
|---|---|
coords | Where the delivery happens |
minLevel | The lowest job level allowed to be sent here. Use it to keep the far-flung addresses for experienced players. Give every stop minLevel = 1 if you don't want to gate anything |
label | The street name players see on the blip and in notifications |
Post boxes
Each entry in postBoxes is just a position and heading (vector4). One is picked at random as the mail bag pickup for each letter round. No prop is spawned there — the player interacts with a small invisible zone at those coordinates, so place them on or next to an existing post box prop for the best look.
Adding a second depot
The job ships with one depot, but Config.Locations is a list — you can add as many as you want, and each one is a complete, independent GoPostal branch. That means its own supervisor NPC, its own map blip, its own van spawn point, and its own set of pickup points and delivery addresses.
A few things worth knowing before you start:
- A shift belongs to the depot the player clocked in at. Someone working out of your Sandy Shores branch only ever gets Sandy Shores addresses. Depots never mix.
- NPCs and blips appear on their own. The job walks the whole
Config.Locationslist at startup, and again whenever the depots are saved in/postaljob settings, and creates a supervisor and a map blip for every entry. There is no list to register anything in and nothing else to switch on. - Worker slots are counted per depot.
Config.MaxSlotsPerLocation(default 3) applies to each depot separately, so two depots means six people can be on shift at the same time. - Progression is shared. A player's level, delivery count, and streak follow their character, not the depot, so they keep their rank wherever they clock in.
A depot is one block inside Config.Locations in shared/config/locations.lua, so a second depot is a second block after the closing }, of the first one (the end of this section explains how a file change reaches a server that has already started). Here is a complete depot entry, with every field in place:
Config.Locations = {
{
-- ... the existing GoPostal Depot entry, leave it alone ...
},
{
name = 'Sandy Shores Post Office',
coords = vector3(1704.12, 3757.65, 34.70),
heading = 220.0,
vehicleSpawn = vector4(1698.40, 3752.10, 34.40, 30.0),
menuCamera = {
coords = vector3(1712.00, 3766.00, 40.00),
heading = 200.0,
fov = 50.0,
},
pickupPoints = {
vector4(1692.55, 3746.80, 34.30, 120.0),
},
postBoxes = {
vector4(1738.90, 3710.25, 34.15, 15.0),
},
letterBoxes = {
{ coords = vector3(1394.20, 3596.10, 34.90), minLevel = 1, label = 'Alhambra Drive' },
{ coords = vector3(1428.75, 3620.40, 34.85), minLevel = 2, label = 'Zancudo Avenue' },
},
deliveryZones = {
{ coords = vector3(1961.20, 3741.55, 32.35), minLevel = 1, label = 'Alhambra Drive' },
{ coords = vector3(1985.60, 3777.10, 32.20), minLevel = 3, label = 'Marina Drive' },
},
},
}The easiest way to gather all these coordinates is the in-game /postalbuilder tool, which lets you stand where you want each thing and record it, then exports a finished block like the one above. See The Location Builder.
Where you make this change depends on whether the resource has ever started:
- On a brand-new install that has never started, paste the block into
shared/config/locations.lua(after the closing},of the first depot). The file is the factory default that gets imported on first boot. - On a server that has already run this resource once, editing
shared/config/locations.luachanges nothing by itself. A depot'sname, Clerk spot (coordsandheading), andvehicleSpawncan be added or changed in the in-game/postaljob settingseditor (admins only) under Locations, where Place in world sets the Clerk spot and van spawn from where you stand. Those changes save to the database and apply instantly: the blip and supervisor appear or move on the spot, no restart needed. The other fields (pickupPoints,postBoxes,letterBoxes,deliveryZones,menuCamera) are not in the editor, so a depot added only there can't hand out rounds. A player who tries to start one there is turned away: a package round tells them the depot has no parcel routes yet (and the server console logs a warning naming the depot), a letter round that no letterboxes are available. To load complete depots, put the full list inshared/config/locations.lua(the/postalbuilderexport is the easy way, see Where the export goes), restart the resource, then press Reset to default on Depots.
Reset to default replaces the stored depot list with the file's version, so the file must contain every depot you want to keep — including the shipped one — and any changes you made to depots in the editor are replaced by the file's values.
You can edit, reorder, or delete depots in the editor while players are on shift. A shift keeps its depot as long as the depot keeps either its name or its Clerk spot (coords), and the worker slots in use move with it. If you delete a depot (or change both its name and its Clerk spot in the same save), the shifts there end straight away and are paid, the pay summary goes out as with Config.shiftSummary = 'text', and the players are told their depot was removed.
Two practical tips:
- Give a new depot plenty of addresses. A round is only as big as the addresses the player qualifies for. A level 5 player can be sent to 9 package stops, so a depot with 6 addresses will simply hand out shorter rounds. Aim for at least as many
minLevel = 1entries as your highest level's round size. - Labels and names can be plain English. The shipped depot uses translation keys like
'location.strawberry_ave'because it ships in several languages. If you type ordinary text like'Alhambra Drive'instead, that exact text is what players see — no locale file editing needed.
NPCs and Blips
File: shared/config/npcs.lua
| Setting | Default | What it does |
|---|---|---|
Config.NpcModel | 's_m_m_postal_01' | The supervisor's character model (a GoPostal worker) |
Config.NpcScenario | 'WORLD_HUMAN_CLIPBOARD' | The idle animation the supervisor performs (holding a clipboard) |
Map blip
| Setting | Default | What it does |
|---|---|---|
Config.Blip.enabled | true | Set to false to hide the depot from the map |
Config.Blip.sprite | 478 | The blip icon |
Config.Blip.color | 5 | The blip color |
Config.Blip.scale | 0.6 | The blip size |
The blip's name is always the depot's name — there is no separate blip label setting.
Customers
Config.CustomerPeds is the list of character models used for the customers who walk out to receive packages. One is picked at random per delivery. Add or remove models freely.
Uniforms
File: shared/config/outfits.lua
| Setting | Default | What it does |
|---|---|---|
Config.uniformsEnabled | false | Master switch. When off, the uniform button is hidden from both menu styles and uniform requests are blocked server-side |
Config.PostalOutfitMale and Config.PostalOutfitFemale define the two uniforms. Each is a list of clothing pieces:
| Field | What it is |
|---|---|
components | Clothing slots: { component_id, drawable, texture } per piece |
props | Accessories like hats or glasses: { prop_id, drawable, texture } per piece |
These use standard GTA clothing IDs — the same numbers you'd use in any clothing menu.
The Van and Props
File: shared/config/vehicles.lua
Van
| Setting | Default | What it does |
|---|---|---|
Config.Vehicle.model | 'boxville2' | The van model |
Config.Vehicle.spawnDistance | 5.0 | Radius around the spawn point checked for blocking vehicles/players |
Config.Vehicle.healthCheckInterval | 1000 | How often (milliseconds) the van's health is checked |
Config.Vehicle.destroyedThreshold | 150 | Engine health below this counts as "destroyed" |
Config.Vehicle.damageChargeRate | 0.50 | Dollars charged per point of body damage at clock-out |
Config.Vehicle.damageChargeThreshold | 950 | Body health below this starts incurring damage charges |
Config.Vehicle.rearDoors | { 2, 3 } | Which doors must be open for loading (the two rear doors) |
Config.Vehicle.primaryColor | { 255, 255, 255 } | Van body color (RGB, white) |
Config.Vehicle.secondaryColor | { 255, 255, 255 } | Van secondary color (RGB, white) |
Config.Vehicle.livery | -1 | Paint livery applied on spawn. -1 keeps the model's default. Useful for replacement van models that ship multiple liveries |
Config.Vehicle.extras | nil | Force vehicle extras on/off at spawn, e.g. { [1] = false }. nil touches nothing. Useful to hide decals on custom replacement models |
Package pallet and boxes
| Setting | Default | What it does |
|---|---|---|
Config.Pallet.model | 'bkr_prop_coke_pallet_01a' | The pallet prop |
Config.Pallet.boxModel | 'prop_cs_cardbox_01' | The cardboard box prop |
Config.Pallet.maxVisibleBoxes | 12 | Most boxes shown stacked on the pallet at once |
Config.Pallet.pickupTime | 3000 | Box pickup time (milliseconds) |
Config.Pallet.loadTime | 2000 | Time to load a box into the van (milliseconds) |
Config.Pallet.vanProximity | 5.0 | How close to the van the player must be to load |
Config.Pallet.palletProximity | 2.5 | How close to the pallet the player must be to pick up |
Config.Pallet.carryBone / carryOffset / carryRotation | 24818 / (-0.2, 0.54, 0.0) / (0.0, 90.0, 0.0) | Where the box attaches on the player while carried (chest) |
Config.Pallet.carry | box-carry anim | The looping carry animation while walking with a box (dict, anim, flags) |
Config.Pallet.pickupAnimation | crouch anim | The animation played while picking a box up (duration, dict, anim, flags) |
Letters
| Setting | Default | What it does |
|---|---|---|
Config.Letter.mailBagModel | 'h4_prop_h4_med_bag_01b' | The mail bag the player carries |
Config.Letter.envelopeModel | 'prop_cash_envelope_01' | The envelope shown during a letterbox delivery |
Config.Letter.pickupTime | 3000 | Mail bag pickup time (milliseconds) |
Config.Letter.loadTime | 2000 | Time to load the bag into the van (milliseconds) |
Config.Letter.deliverTime | 2500 | Letterbox delivery animation time (milliseconds) |
Config.Letter.carryBone / carryOffset / carryRotation | 57005 / (0.35, 0.0, 0.0) / (-5.0, -90.0, 40.0) | Where the bag attaches on the player while carried (right hand) |
Config.Letter.pickupAnimation | crouch anim | The animation played while collecting the bag (duration, dict, anim, flags) |
Box positions
Config.BoxOffsets— the 12 positions boxes occupy on the palletConfig.VanBoxOffsets— the 11 positions boxes occupy inside the van (this is also the van's maximum capacity)Config.VanBoxRotation— the rotation applied to boxes inside the van (defaultvector3(0, 0, 0))
Visuals
File: shared/config/visuals.lua
Delivery marker
The glowing marker at the delivery spot:
| Setting | Default | What it does |
|---|---|---|
Config.DeliveryMarker.type | 25 | The marker shape (25 = flat ring on the ground) |
Config.DeliveryMarker.scale | (1.0, 1.0, 0.5) | The marker size |
Config.DeliveryMarker.color | orange ({ r = 255, g = 200, b = 50, a = 120 }) | Marker color and transparency (RGBA) |
Config.DeliveryMarker.bobUpAndDown | false | Makes the marker bounce |
Config.DeliveryMarker.rotate | false | Makes the marker spin |
Delivery animation
Config.Animations.deliver is the hand-over animation played when delivering a package:
| Animation | Dict | Clip | Duration | Label |
|---|---|---|---|---|
deliver | mp_common | givetake1_a | 3000 ms | Delivering package... |
Floating waypoint
The 3D marker players see over the delivery address while holding H:
| Setting | Default | What it does |
|---|---|---|
Config.Waypoints.heightOffset | 5.0 | How high above the address the marker floats |
Config.Waypoints.updateInterval | 0 | How often the marker position refreshes (0 = every frame, smoothest) |
Config.Waypoints.scaleMin | 0.5 | Marker size when far away |
Config.Waypoints.scaleMax | 1.0 | Marker size when close |
Config.Waypoints.scaleNearDist | 30.0 | Distance at which the marker reaches full size |
Config.Waypoints.scaleFarDist | 300.0 | Distance at which the marker reaches minimum size |
Tutorials
File: shared/config/tutorials.lua
Config.Tutorials defines the nine first-time hint prompts (icon, title, body text, and optionally screen position and duration). The text itself lives in locales/en.json. You normally won't need to change these unless you want to reposition a prompt or change its icon, which you do under Tutorial cards in /postaljob settings.
With Oxide HUD, every prompt left at the default position (top right) appears where each player puts the tutorial prompts in the /hud editor. A prompt you give another position keeps that position.
Models and Compatibility
File: shared/config/models.lua
Model replacements
The Compatibility section of /postaljob settings.
Every model the job spawns (the van, the supervisor, customers, the pallet, boxes, and the mail bag) is checked before it loads. If a model doesn't exist on a player's game build — older builds lack newer DLC props — it is skipped instantly with a warning naming the model, instead of freezing the load. A missing customer model is simply left out of the pool, and a missing van model cleanly cancels the spawn. Nothing is swapped automatically; you choose the replacement.
| Setting | Default | What it does |
|---|---|---|
Config.ModelSwaps | {} (empty) | A list of { from = 'shipped_model', to = 'your_model' } rows. Each row replaces a model everywhere the job uses it — including models inside depot rows that have no field of their own |
Config.SettingsCommand | '/postaljob settings' | Where the missing-model warning tells admins to go |
Config.ModelSwaps = {
{ from = 'h4_prop_h4_med_bag_01b', to = 'your_bag_prop' },
}When a model is missing, online admins get a notification naming it, and the server log records it. Each missing model is reported once, and the warnings are capped per player and in total, so one misbehaving client can't flood admins or the log.
Mailbox models
The /postalbuilder Scan Post Boxes and Scan Letterboxes tools look for these props in the world. If your map replaces the stock mailboxes, add its models here so the scanner finds them (Post box models and Letterbox models under Props & Animations in the settings editor).
| Setting | Default |
|---|---|
Config.PostBoxModels | 'prop_postbox_01a', 'prop_postbox_01b', 'prop_postbox_02a', 'prop_postbox_02b' |
Config.LetterBoxModels | 'prop_letterbox_01', 'prop_letterbox_02', 'prop_letterbox_03', 'prop_letterbox_04' |
Anti-Spam Limits (Fixed)
The server enforces short cooldowns on player actions to block exploit spam. They are intentionally not configurable — they live in server/main.lua:
| Action | Cooldown (ms) | What it covers |
|---|---|---|
completeDelivery | 5000 | Completing a delivery |
loadBox | 2000 | Loading a box or bag into the van |
clockIn | 2000 | Clocking in |
clockOut | 2000 | Clocking out |
crewInvite | 5000 | Sending a crew invite |
respondToInvite | 2000 | Accepting or declining a crew invite |
vehicleDestroyed | 10000 | Reporting the van destroyed |
grabPackage | 2000 | Grabbing a package from the van |
palletSpawned | 5000 | Pallet spawn sync |
boxPickedUp | 1000 | Box pickup sync |
palletCleanedUp | 5000 | Pallet cleanup sync |
updateVehicle | 5000 | Van network ID update |
cancelTask | 2000 | Cancelling the current round |
Next Steps
Installation Guide
Step-by-step setup for oxide-postaljob — dependencies, start order, the database, first settings, and an in-game check.
Feature Guide
How an oxide-postaljob shift plays — task types, routes, cancelling a round, timers, the van, levels, pay, crews, customer handoffs, phone messages and the Oxide Phone Gigs app, and tutorials.