Skip to main content
The sh-society resource is a complete job-society and business management platform for your RedM server. Every configured job gets its own NUI management panel where bosses handle payroll, manage employees, run a society ledger, set up in-world stores, place crafting stations, and post advertisement boards — all from one interface. An admin panel gives server staff oversight of all societies. Billing and invoice tools let businesses charge players in-character. A public job center NPC lets players self-hire into designated open jobs. Discord webhooks log every financial and management action across configurable channels.

Framework Support

sh-society supports both VORP and RSG frameworks. Set the framework in your server-side config.lua:
config.lua
Config.Framework = 'auto'  -- 'auto', 'vorp', or 'rsg'
Setting 'auto' (the default) lets the resource detect your running framework automatically.

Commands

CommandConfig keyDescription
/societyConfig.Commands.SocietyOpen the society boss/employee panel
/socadminConfig.Commands.SocietyAdminOpen the admin society overview panel
/billsConfig.Commands.BillsView your outstanding bills and invoices
/invoiceConfig.Commands.InvoiceIssue a quick invoice to a nearby player

Features

Each society has an isolated ledger showing the current balance, a full paginated transaction history, and action buttons for deposits and withdrawals. Every ledger movement is timestamped and attributed to the acting employee’s character name. The ledger balance is independent per society — money in the lawman society does not affect any other society.
An automatic payroll loop pays on-duty employees at a configurable interval (Config.Payroll.IntervalMinutes, default 15 minutes). Each rank has its own salary set by the boss from the management UI. Bosses can also trigger manual wage payments from the panel. The payroll interval per society can be further tuned in-game by bosses within the server-wide min/max range.
Bosses hire, fire, promote, and demote characters from the society panel. Hiring requires the target player to be within Config.Society.HireDistance (default 12.0 m). A hire offer is sent to the target and expires after Config.Society.HireOfferTimeoutSeconds (default 30 seconds). All hire, fire, promote, and demote actions are Discord-logged.
Any employee with the invoice permission can issue a payment request to a nearby player using /invoice. The target receives the bill in their bills panel (/bills) and can pay it there. Invoice creation, viewing, and payment are all logged to the configured billing webhook.
Each society can have a placed in-world storage stash accessible to on-duty employees of the required grade. Storage positions, slot counts, and weight limits are configurable. The interaction style (drawtext, native prompt, or ox_target zone) is set globally via Config.Mode.
Bosses can place up to Config.Store.MaxPerSociety (default 2) in-world storefronts. Each store has a configured prop, stock levels, and sell prices managed from the society panel. Players can browse and purchase items from stores at any time.
Bosses can place a crafting station prop for their society. Job-keyed recipes are defined in crafting_config.lua. Each recipe specifies required ingredients, output item, quantity, and crafting duration. Only jobs with recipes defined can place a crafting station.
Bosses can place up to Config.Advertising.MaxPerSociety (default 5) advertisement prop boards in the world. Each board can display an image URL and description. Props stream to nearby players automatically.
A single configurable NPC at Config.JobCenter.Coords serves as a self-hire board for public jobs defined in Config.JobCenter.DefaultPublicJobs. Players can switch to an open job from the board, subject to a cooldown (Config.JobCenter.SwitchCooldownHours, default 1 hour). Public job salaries are config-driven rather than boss-managed.

Configuration

Core Settings

config.lua
Config.Framework = 'auto'  -- 'auto', 'vorp', or 'rsg'
Config.Locale    = 'en'    -- 'en', 'es', 'de', or 'fr'
Config.Mode      = 'ingame' -- 'drawtext', 'ingame', or 'target'

Society Rules

config.lua
Config.Society = {
    MaxRanks               = 15,
    DefaultRankCount       = 5,
    DefaultTaxPercent      = 10.0,   -- % of ledger deposits reserved as tax
    UnemployedJob          = 'unemployed',
    HireDistance           = 12.0,
    HireOfferTimeoutSeconds = 30,
}

Payroll

config.lua
Config.Payroll = {
    Enabled            = true,
    IntervalMinutes    = 15,
    MinIntervalMinutes = 1,
    MaxIntervalMinutes = 240,
    MoneyType          = 'cash',
}

Job Center

config.lua
Config.JobCenter = {
    Enabled = true,
    Model   = 'u_m_m_valtownfolk_01',
    Coords  = vector4(-784.26, -1347.35, 43.75, 90.71),  -- Blackwater default
    SwitchCooldownHours = 1.0,
    DefaultPublicJobs = {
        { jobName = 'hunter', label = 'Wildlife Hunter', grade = 0, salary = 15,
          payrollIntervalMinutes = 15, description = 'Hunting wildlife for a living.' },
    },
}

Admin Access

config.lua
Config.Admin = {
    Ace = {
        Enabled    = true,
        Permission = 'sh.society.admin',
    },
    UserGroups = { admin = true, god = true, superadmin = true, mod = true },
}

Discord Webhooks

sh-society supports per-channel webhook URLs so you can route different event types to separate Discord channels:
config.lua
Config.Webhooks = {
    Enabled  = true,
    Username = 'sh-society',
    Default  = '',  -- fallback URL when a channel URL is blank
    Channels = {
        admin     = '',   -- society create/update/delete
        boss      = '',   -- boss management actions
        billing   = '',   -- invoice creation/payment
        payroll   = '',   -- payroll payout/skip cycles
        stores    = '',   -- store setup, stock, sales
        adverts   = '',   -- advert create/update/delete
        employees = '',   -- hire/fire/promote/demote
        ranks     = '',   -- rank name/salary/permission updates
        ledger    = '',   -- ledger deposits/withdrawals
        taxes     = '',   -- tax reserve movement
        security  = '',   -- denied/failed security logs
    },
}
Bosses can also set their own society-level Discord webhook from the in-game UI if Config.IngameWebhook.Enabled = true.

Installation

1

Add the resource

Copy the sh-society folder into your server’s resources directory.
2

Add to server.cfg

Ensure sh-society after your framework and before any job resource that references it:
server.cfg
ensure vorp_core    # or rsg-core
ensure sh-society
ensure sh-doctorjob
3

Import the SQL files

Run the SQL files from the sql/ folder of the resource against your database to create the society accounts, ledger, and transaction history tables.
4

Configure

Edit config.lua to set your framework, interaction mode (Config.Mode), job center location, and Discord webhook URLs. Edit crafting_config.lua to define per-job crafting recipes for any society that should have a crafting station.
5

Set admin ACE

Add the sh.society.admin ACE node to your admin group in server.cfg so that server staff can access the admin society panel:
server.cfg
add_ace group.admin sh.society.admin allow
6

Restart and test

Restart the resource, log in with a character assigned to a job, open the society panel with /society, and verify the ledger and employee list load correctly.
Removing a society entry from the database does not remove its associated employees, ledger records, or placed world objects immediately. Archive or clean up related database records manually before deleting a society to avoid orphaned data.