FiveM server economy balance: paychecks, money sinks and inflation
How to balance a FiveM server economy: paychecks, starting money, prices, money sinks like repairs, fuel, taxes and housing, black money, and SQL to watch inflation.
The symptom: new players buy everything in a day, prices stop meaning anything, and the richest players have more money than the whole shop catalogue costs.
An economy is two flows: money entering the game (faucets) and money leaving it (sinks). When faucets win for long enough, you get inflation. This article shows where the money comes from, how to remove it again, and how to measure it with the database.
Faucets: where money enters
List every source before you change any number:
- Paychecks: a regular payment per job and grade, whether the player works or stands still.
- Starting money: what a new character receives.
- Job and activity rewards: deliveries, missions, robberies, selling items to NPCs or a pawn shop.
- Admin commands and gifts: money you give by hand.
Paychecks are the quietest faucet, because they run on a timer. In QBCore the paycheck interval and the starting cash and bank values live in the core config; in ESX Legacy the interval and the starting accounts are in the core config as well, and the amount comes from the job grade. Find them in your version rather than guessing, and read the grade pay in the job setup (ESX, QBCore).
Tip: many servers pay a high paycheck to attract players, then wonder why money is worthless. A low paycheck with real activity rewards keeps players doing something.
Setting prices
Anchor everything to one number: what a player earns in an hour of normal work. Then price things in hours:
| Item | Reasonable price |
|---|---|
| A basic car | Several hours of work |
| A good car | A day or two of play |
| Food and drink | Minutes of work |
| A house or apartment | Many hours, with ongoing costs |
You do not need exact values. You need an order: cheap things are cheap, status items take real time. Revisit it after the first week with real data.
Money sinks
A sink takes money out and gives nothing in return. The good ones also add gameplay:
- Repairs: the mechanic charges, or the player pays at a workshop. See the mechanic job.
- Fuel: a small recurring cost that every driver pays.
- Taxes: on vehicles, property, shop purchases or company profits.
- Housing: rent, utilities or a purchase price. See housing and apartments.
- Licences and fines: driving licence, weapon licence, police fines.
- Insurance and impound fees for vehicles.
Do not overdo one of them. A small cost that happens often is better than one huge cost that feels like a punishment.
Cash, bank and black money
Money exists in several accounts, which matters when you measure. Cash and bank are normal money. Black money (dirty money) is a separate account or item, usually earned from illegal activity and washed into clean money. Keep it under control with a conversion rate, so it is worth less than clean money, and see cash, bank and black money for how each type is stored and spent.
Watching inflation with queries
You do not need a dashboard. A query on the characters table, run daily, shows the trend. The money is stored as JSON in one column, so extract the values:
-- ESX Legacy: users.accounts holds {"money":..,"bank":..,"black_money":..}
SELECT
COUNT(*) AS characters,
SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(accounts, '$.money')) AS DECIMAL(20,0))) AS cash,
SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(accounts, '$.bank')) AS DECIMAL(20,0))) AS bank,
SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(accounts, '$.black_money')) AS DECIMAL(20,0))) AS black
FROM users;-- QBCore and QBox: players.money holds {"cash":..,"bank":..,"crypto":..}
SELECT
COUNT(*) AS characters,
SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(money, '$.cash')) AS DECIMAL(20,0))) AS cash,
SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(money, '$.bank')) AS DECIMAL(20,0))) AS bank
FROM players;Check the column names in your own database first, because some servers customise them. Store the result in a small table with a date, so you can graph it later:
CREATE TABLE IF NOT EXISTS economy_snapshots (
id INT AUTO_INCREMENT PRIMARY KEY,
taken_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
characters INT,
cash BIGINT,
bank BIGINT
);Two other queries are worth running now and then: the top ten richest characters (a huge outlier points at an exploit), and the average money per character. Compare these with how many characters are active, since a total divided by active players is a more honest number than the total alone. For help with queries from Lua, see oxmysql queries.
What to do when it inflates
- Find the faucet: a new job, a robbery payout, a bug. Compare the dates.
- Lower the faucet before you add sinks.
- Add or raise a sink that touches everyone (fuel, taxes).
- For a runaway exploit, fix it first and then deal with the money, because removing money while the leak is open is pointless.
Wiping balances is a last resort, because players lose trust. Gentler options are taxes on large balances, a bank interest cut, or limited-time luxury items that absorb money.
Checklist
| Symptom | Fix |
|---|---|
| Everything affordable in a day | Lower the paycheck and the starting money |
| Total money rises every week | Lower faucets, add sinks that touch everyone |
| One character has absurd money | Look for an exploit, check the logs |
| Prices feel meaningless | Price in hours of work |
| Black money too strong | Add a loss when washing it |
| No data to decide with | Snapshot the totals daily |
Quick answers
How do I know if my economy is inflating?
Sum the money of all characters in the database on a schedule, for example once a day, and compare the numbers. If the total keeps rising faster than your player count, more money is coming in than going out.
What is a money sink?
Anything that takes money out of the game for good: repairs, fuel, taxes, rent, licences, fines. Without sinks, money only accumulates.
Where do I change the paycheck and the starting money?
In the core config of your framework. ESX and QBCore each have settings for the paycheck interval and for the money a new character starts with, and the job pay is defined per grade.


