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 | fiShips 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 billsOn 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 billedCommands & 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 },
},
}| Field | Description |
|---|---|
description | Short note shown on the bill |
price | Amount charged |
expireDays | Days 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)
endYou can likewise change how a player is charged when they pay:
function ChargePlayer(src, amount)
return Bridge.RemoveAccountMoney(src, R.Account, amount)
endNotifications
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 yourselfTurn 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.