Guide · Updated 14 Sep 2026
How to set up jobs on a RedM server: names, grades, duty and the scripts that use them
Jobs are the most-edited setting on a RedM server and the most common cause of "the script does nothing". A deputy who is not receiving witness reports, a doctor who cannot open the clinic stash, a badge that will not attach: nine times out of ten it is a job name spelt one way in the character and another way in a config. This guide explains how VORP jobs actually work, how to name them so every script agrees, and which scripts add the pieces the framework does not have.
How a VORP job works
A character has three fields: job, the internal name a script compares against; jobgrade, a number; and joblabel, the text players see. They live on the character row in the database and in memory while the player is online. Setting a job through the framework changes both. There is no central list of valid jobs: a job exists because a character has it and a config mentions it.
That last point is the whole problem. Nothing stops one script expecting sheriff while another expects Sheriff and your admin command sets sheriffdept. Most scripts compare the name exactly.
Naming rules that avoid every ticket
- Lowercase, no spaces, no department suffix.
sheriff,marshal,doctor,rancher. Use the label for the pretty version. - Grades start at 0 and go up. Recruit 0, deputy 1, senior deputy 2, sheriff 3. Scripts that check a minimum grade assume higher means more senior.
- One job per role, not one per rank. The rank is the grade. A separate
sheriff_captainjob means every script's job list needs one more entry. - Write the list down once and paste it into every config that wants jobs. When a script's config says
LawJobs = { 'sheriff', 'marshal' }, it means those exact strings.
Which scripts care, and what they need
| Script | What it reads | Where you set it |
|---|---|---|
| Witnesses (from $6.99/mo) | Police and sheriff job names, rank filters, on-duty status | Its config: the jobs that receive reports and the minimum rank |
| Poggy Badges ($20) | Job and grade, mapped to a badge image and prop | Badge sets in its config: a Deputy and a Sheriff on the same job carry different badges |
| Poggy Util (Free) | Law jobs for the duty count; medical jobs come from poggy_core | Config.DutyCount.LawJobs in poggy_util; MedicalJobs in poggy_core |
| Poggy Storage (Free) | Job and minimum grade for shared stashes | Per storage, so the evidence locker opens for sheriff grade 1 and up |
| Poggy Transform ($9.99) | Optional job lock per transformable | Its config: leave open, or gate an entry behind a job |
Every Poggy script reads jobs through Poggy Core (Free), and which jobs count as law or medical is set once in poggy_core/config.lua rather than in code. Change it there and every script that asks "is this player law" gets the same answer, on VORP Core, RSG Core and QBCore RedM alike.
The same on RSG Core and QBCore RedM
RSG Core keeps a shared jobs table, RSGShared.Jobs, with a label and named grades for every job, and duty is part of the job itself. poggy_core reads that table, so a Poggy script asking for a player's job gets the same shape as on VORP, with the grade label filled in. Two things to know: setting a job that is not in the table is refused rather than invented, and RSG's stock law jobs are named by town (vallaw, rholaw, blklaw, strlaw, stdenlaw), so add them to LawJobs in poggy_core/config.lua or the duty count and witness alerts will not count them. QBCore RedM works the same way: a shared jobs table with named grades and duty on the job, read through poggy_core's QBR adapter, so the same config applies and the job names you write in LawJobs and MedicalJobs are the only thing to check.
On duty and off duty
vorp_core has no idea whether a deputy is on duty. That comes from vorp_police and vorp_medic, which set state bags and expose exports when a player clocks in. A script that filters alerts by duty needs one of those running; otherwise duty is unknown, and a well-behaved script treats unknown as off duty rather than alerting everyone with the job. Witnesses routes reports to on-duty law with rank filters for exactly this reason. If your deputies get no alerts, check they are clocked in before you check the config. On RSG Core duty is a field on the job, so the answer is always yes or no and the same scripts work without an extra resource.
More than one job per character
Stock VORP is one job per character, which on a small server means the deputy cannot also run the ranch. Poggy Multijob (Free) lets a character hold up to five jobs with one active at a time, switched with /multijob or /mj 2. It sets the active job through poggy_core, persisted to the framework's own job columns, so every other script sees it as normal on VORP Core, RSG Core or QBCore RedM. The admin panel is the reason to install it even on a one-job server: every player with jobs, online and offline, editable in place, with ready-made presets grouped by department that you apply in one click. Set the presets in its config to the exact names from your list above and hand out jobs without ever typing a name again.
Making rank visible
A job nobody can see is a line in a database. Poggy Badges ($20) pins a 3D badge prop to law, marshal and medical characters, mapped from job and grade, with a live editor to place it on the outfit and a pocket-watch animation to flash it at nearby players. Twenty-one badge images ship, and you can drop in your own. Job and grade come through poggy_core, so it works the same on VORP Core, RSG Core and QBCore RedM.
A starting job list
sheriff 0 Recruit, 1 Deputy, 2 Senior Deputy, 3 Sheriff
marshal 0 Deputy Marshal, 1 Marshal
doctor 0 Nurse, 1 Doctor, 2 Chief Physician
rancher 0 Hand, 1 Foreman, 2 Owner
unemployed 0
Paste the names into poggy_core's law and medical lists, Witnesses' alert jobs, Util's duty count, your Storage presets and Multijob's job presets, and every script on the server agrees on who is who.