Installation Guide

Step-by-step setup for oxide-postaljob.

Step-by-step setup for oxide-postaljob.

Prerequisites

Required resources

ResourcePurpose
ox_libLocale, callbacks, timers, UI helpers
oxmysqlDatabase driver
o-linkFramework and system abstraction used by this resource

This resource depends on your server's o-link setup for:

  • player identity and character lookup
  • notifications
  • phone messaging (shift events, crew invites, clock-out summary)
  • money handling
  • clothing and uniform management
  • fuel level setting
  • vehicle keys
  • targeting (NPC interaction, box pickup, van loading, delivery zones)
  • menu support when Config.menuStyle = 'menu'

Installation

Place the resource

Place oxide-postaljob inside your server's resources folder.

Add startup order

Start dependencies before the job resource:

server.cfg
ensure ox_lib
ensure oxmysql
ensure o-link
ensure oxide-postaljob

Install the SQL table

Run sql/install.sql against your database.

This creates the unified progression table used by current Oxide jobs:

sql/install.sql
CREATE TABLE IF NOT EXISTS `job_progression` (
    `char_id`            VARCHAR(60)      NOT NULL,
    `job`                VARCHAR(40)      NOT NULL,
    `level`              TINYINT          NOT NULL DEFAULT 1,
    `total_count`        INT              NOT NULL DEFAULT 0,
    `daily_streak`       INT              NOT NULL DEFAULT 0,
    `last_activity_date` DATE             NULL,
    `complaints`         TINYINT UNSIGNED NOT NULL DEFAULT 0,
    `timeout_until`      DATETIME         NULL,
    PRIMARY KEY (`char_id`, `job`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

oxide-postaljob stores progression rows with job = 'postal'.

Migrate old data if needed

If your server is migrating from an older Oxide job install (for example one that used its own postaljob_progression table), run sql/migrate_unified_progression.sql once before starting the updated resource. It copies player progress from the old per-job tables into the shared table, then removes them. If you are updating multiple Oxide jobs, only run it once total.

Back up your database before running the migration script.

Review configuration

Adjust:

  • shared/config.lua
  • shared/config/job.lua
  • shared/config/levels.lua
  • shared/config/locations.lua
  • shared/config/npcs.lua
  • shared/config/outfits.lua
  • shared/config/vehicles.lua
  • shared/config/visuals.lua
  • shared/config/tutorials.lua

See the Configuration Reference for the full reference.

Verification

Start the server and confirm ox_lib, oxmysql, o-link, and oxide-postaljob all load without dependency errors.
Join the server and verify the GoPostal depot blip appears on the map.
Walk to the supervisor NPC and confirm the third-eye target appears.
Clock in, confirm the delivery van spawns, and pick up a task.
Complete a test delivery and verify the timer, delivery target, and payout work.

Optional Setup

Phone messaging

Shift event messages, crew invites, and the clock-out summary are sent through o-link.phone automatically. o-link supports popular phone resources like qb-phone, lb-phone, gksphone, okokPhone, qs-smartphone, and yseries.

If your server doesn't run a supported phone, the emails simply won't arrive — nothing breaks. Important moments (pay received, van destroyed, etc.) always also show as regular on-screen notifications.

Shift summary mode

The end-of-shift pay breakdown is always emailed to the player's phone at clock-out. Config.shiftSummary controls the on-screen view on top of that email:

  • 'text' (default): shows only a simple clock-out notification on screen
  • 'nui': also shows a pop-up summary on screen (needs the default 'nui' menu style)

Uniforms

Work uniforms are off by default. To turn them on, open shared/config/outfits.lua and set:

Config.uniformsEnabled = true

When enabled, players get a button in the shift menu to put on a GoPostal uniform while clocked in. Their own clothes are restored when they take it off or clock out.

Admin permission for the builder

/postalbuilder (for creating your own depots and delivery routes) is limited to admins. To make someone an admin, add them to the admin group and grant that group the admin ace in your server.cfg:

server.cfg
add_principal identifier.license:<their-license> group.admin
add_ace group.admin admin allow

If you already run QBCore, QBX, or ESX admins, you don't need to do anything extra — your existing framework admins pass automatically. See Admin Tools for how it works.

Notes for UI developers

The packaged web/dist build is already included and referenced by the manifest. Rebuilding the UI is only necessary if you edit files under web/src.

Next Steps