Documentation
R_Billing

r_billing Configuration

Every r_billing config.lua option: framework, jobs and permissions, bill limits, overdue reminders, premade templates, company banking and logs.

Almost everything lives in config.lua. Edit it, run restart r_billing, and reconnect.

config.lua is the only file you usually need to edit. It's left open (escrow-ignored) so you can tweak it freely. Company banking and notifications live in two more open files (server/sv_custom.lua and client/cl_custom.lua).

Framework

R.Framework = 'auto' -- 'auto' | 'esx' | 'qb' | 'qbox'

Leave it on auto unless detection guesses wrong.

Language

R_Billing uses the ox_lib locale system. Set the language with a convar in server.cfg:

setr ox:locale "en"   # en | fi

Ships with English and Finnish. Add your own by dropping a locales/<code>.json file in and pointing the convar at it.

Currency

R.Currency = {
    symbol    = '€',   -- currency symbol
    after     = true,  -- false -> €1,000   |   true -> 1,000€
    separator = '.',   -- thousands separator: "," | " " | "." | "" (none)
}

For dollar servers, set symbol = '$', after = false, separator = ',' to get $1,000.

Jobs & permissions

R.Account      = 'bank'            -- account bills are charged from
R.AllowedJobs  = { 'police', 'ambulance' } -- jobs that can send bills
R.BossGrade    = 'boss'            -- ESX grade NAME treated as boss
R.UnemployedJob = 'unemployed'     -- this job can never send bills

On QBCore / QBX, the boss is detected from the grade's isboss flag as well as the R.BossGrade name.

Bills & limits

R.MaxBillAmount = 500000 -- hard cap for a single bill
R.PlayerRadius  = 4.0    -- how close a target must be to get billed

Commands & keybind

R.Commands = {
    open    = 'bills',   -- everyone: My Bills
    send    = 'billing', -- working jobs: Send Bill
    company = 'company', -- bosses: Company
}

R.OpenKey = 'F7' -- default keybind ('' to register none)

R.OpenKey is only the default bind. Each player can change it in FiveM → Settings → Key Bindings → FiveM.

Overdue reminders

Bills are never force-charged. Once past their expiry they show as OVERDUE in the panel, and (optionally) the player is reminded.

R.Overdue = {
    remind          = true, -- ping players who have overdue bills
    intervalMinutes = 15,   -- how often to run the check
}

Premade templates

Per-job invoice templates. Bosses can also create more in-game (those are stored in the database).

R.Bills = {
    ['police'] = {
        ['Speeding ticket']  = { description = 'Exceeding the posted speed limit.', price = 1200, expireDays = 7 },
        ['Reckless driving'] = { description = 'Dangerous operation of a vehicle.',  price = 2500, expireDays = 7 },
    },
}
FieldDescription
descriptionShort note shown on the bill
priceAmount charged
expireDaysDays until the bill goes overdue

Company banking

When a player pays a bill, the money is credited to the job's company / society fund. The default covers the common banking resources; override it for anything else in server/sv_custom.lua:

function CreditSociety(job, amount)
    -- ESX society, Renewed-Banking, qb-banking, etc. handled by default.
    -- Wire your own banking resource here:
    -- exports['your-banking']:addAccountMoney(job, amount)
end

You can likewise change how a player is charged when they pay:

function ChargePlayer(src, amount)
    return Bridge.RemoveAccountMoney(src, R.Account, amount)
end

Notifications

R.Notify = 'auto' -- 'auto' | 'esx' | 'ox_lib' | 'qb' | 'okok' | 'quasar' | 'codesign'

auto picks the right one for your framework. Add your own type in client/cl_custom.lua.

Logs

R.Logs = {
    enabled = true,
    type    = 'webhook', -- 'webhook' | 'ox_lib'
}

Put your Discord webhook URL in server/sv_custom.lua (it's kept out of config.lua so it never ships inside the protected bundle).

Development

R.Debug = false -- when true, you appear in the billing list so you can bill yourself

Turn R.Debug back to false on a live server. It's a testing convenience only.

Interface Colours

Every R-Scripts resource shares the same colour tokens, so you can match the UI to your server's branding without touching any code:

R.UI = {
    Accent = "#9a27ea",        -- icons, bars, badges and highlights
    Primary = "#ffffff",       -- main action buttons (buy / play / confirm)
    PrimaryText = "#000000",   -- text on those buttons
    NavActive = "",            -- selected tab background, "" keeps the neutral default
    NavActiveText = "#ffffff", -- selected tab text
}

Leave a value empty to keep the shipped look — the defaults above are exactly what you see out of the box. Accent stays a signal colour (icons, progress bars, badges); Primary is the solid button colour, so setting it to your brand colour turns every confirm button at once.