Category hub
Compare police, mechanic, drug, civilian, and economy systems in the main jobs hub before you commit to a single resource.
Open job scriptsThe best job and roleplay setups depend on more than one script. Use the connected hubs below to compare install-ready products, bundles, and framework fit before you buy.
Category hub
Compare police, mechanic, drug, civilian, and economy systems in the main jobs hub before you commit to a single resource.
Open job scriptsFramework hub
Move into the QBCore landing page to compare verified scripts, framework fit, and install-ready products built for modern FiveM servers.
Open QBCore hubPremium catalog
Move from research into the main shop to compare real products, framework labels, screenshots, and production-ready quality signals.
Open premium shopThe best FiveM inventory scripts in 2026 are ox_inventory as the free open-source default, qs-inventory as the polished premium alternative around 35 to 50 USD, qb-inventory as…
Don’t let the new ESX weight update freeze your inventory—just grab the newest ESX version, add the latest esx‑inventoryhud, restart your server, and your items will work again in no time!
1. Full backup: mysqldump --single-transaction yourdb > backup.sql. 2. Staging env mirroring production schema + data subset. 3.
A stable RP economy depends on scarcity, friction, and meaningful choices. Inventory rules (slots, weight, stack limits, metadata like durability/serials) are the levers that make…


TL;DR: This guide gives you production‑ready weight/slot presets, item budget tables, copy‑pasteable items.lua definitions (ESX/QBCore/ox_inventory), and safe migration playbooks between popular inventories. Use it to eliminate over‑encumbrance drama, stop item bloat, and keep your economy coherent.
This guide is part of our , where you'll find all our script recommendations, framework comparisons, and buying guides.
A stable RP economy depends on scarcity, friction, and meaningful choices. Inventory rules (slots, weight, stack limits, metadata like durability/serials) are the levers that make those choices real. If everyone can carry everything, prices collapse and loops break. Tune inventory first, then iterate your prices, payouts, and sinks. For broader economics, see our pillar: .
Slots-only
Weight-only
maxWeight per container. Strong realism; needs thoughtful defaults.Hybrid (recommended)
Tip: Keep numbers human‑readable. If you model in grams, use whole numbers (e.g.,
water = 500g) and round player caps (e.g.,maxWeight = 120,000).
Below are battle‑tested starting points. Adjust ±10–20% after a week of in‑city telemetry.
| Server Scale | Model | Max Weight (g) | Slots |
|---|---|---|---|
| Notes | New/Small (≤40 pop) | Hybrid | 80,000 |
| 30 | Faster onboarding; fewer early pain points. | Mid (40–150) | Hybrid |
| 120,000 | 35 | Balanced for general RP; good for diverse jobs. | High‑Pop (150+) |
| Hybrid | 150,000 | 32 | Tighten slots to curb hoarding; keep weight fair. |
| Container | Max Weight (g) | Slots | Rationale |
|---|---|---|---|
| Glovebox | 10,000 | 5 | Small stash, encourages planning. |
| Sedans Trunk | 80,000 | 20 | Baseline. |
| SUV/Van Trunk | 120,000 | 25 | Utility vehicles become meaningful. |
| Truck (utility) | 180,000 | 28 | Logistics gameplay. |
| Motorcycle Storage | 8,000 | 3 | Minimal pocketing. |
| Type | Max Weight (g) | Slots | Notes |
|---|---|---|---|
| House Stash (Tier 1/2/3) | 120k / 180k / 240k | 40 / 60 / 80 | Incentivizes housing upgrades. |
| Job Locker | 80,000 | 20 | Prevent carryover exploits. |
| Evidence Locker | 240,000 | 120 | Admin/LEO convenience; audit logging required. |
Use this to assign consistent weights. Think relative friction not realism.
| Class | Examples |
|---|---|
| Suggested Weight (g) | Very Light |
| Lockpick blade, USB, SIM | 5–50 |
| Light | Pistol ammo (10), bandage, snack |
| 100–250 | Medium |
| Water bottle, burger, repair kit | 400–800 |
| Heavy | Rifle ammo box (30), oxy tank, material crate |
| 1,500–4,000 | Very Heavy |
| Weapon crate, money bag (marked) | 6,000–12,000 |
Ammo: Budget per unit for pooled stacks (e.g.,
9mm = 15geach → 30 rounds ≈ 450g) or represent as boxes (e.g.,9mm box (30) = 500g).
stack = 1, unique metadata (serial, durability).Design metadata like a small schema. Keep fields minimal, typed, and validated.
{
serial = "string", -- weapon unique id
owner = "citizenid|identifier",
durability = 0.0, -- 0.0–1.0; decay per use/time
quality = 100, -- 0–100; repairable threshold 25
ammo = 0, -- integer; weapon mags
tint = 0, -- integer (game tint index)
attachments = {"flashlight", "scope"},
expiry = 0, -- unix timestamp; perishable items
notes = "" -- small text; avoid bloat
}
expiry check at use; stale penalty or block.items.lua / item definitions by framework-- esx items.lua (example) — weight in grams; negative weight means not counted in legacy modes
['water'] = { label = 'Water Bottle', weight = 500, stack = true, close = true, description = 'Stay hydrated.' },
['bandage'] = { label = 'Bandage', weight = 150, stack = true, close = true },
['lockpick'] = { label = 'Lockpick', weight = 50, stack = true, close = true },
['pistol_ammo'] = { label = 'Pistol Ammo (30)', weight = 450, stack = true, close = true, description = '9mm, box of 30.' },
['weapon_pistol'] = { label = 'Pistol', weight = 1500, stack = false, close = true, degrade = 0.01, unique = true },
For ESX variants that still use limit instead of
For ESX variants that still use limit instead of weight, set
limit = -1(unlimited) and switch economy balance via weight globally.
shared/items.lua) example-- qb-core shared/items.lua
['water'] = { name = 'water', label = 'Water Bottle', weight = 500, type = 'item', image = 'water.png', unique = false, useable = true, shouldClose = true, description = 'Stay hydrated.',
combinable = nil },
['bandage'] = { name = 'bandage', label = 'Bandage', weight = 150, type = 'item', image = 'bandage.png', unique = false, useable = true, shouldClose = true },
['lockpick'] = { name = 'lockpick', label = 'Lockpick', weight = 50, type = 'item', image = 'lockpick.png', unique = false, useable = true, shouldClose = true },
['pistol_ammo'] = { name = 'pistol_ammo', label = 'Pistol Ammo (30)', weight = 450, type = 'item', image = 'pistol_ammo.png', unique = false, useable = true, shouldClose = true },
['weapon_pistol'] = { name = 'weapon_pistol', label = 'Pistol', weight = 1500, type = 'weapon', image = 'weapon_pistol.png', unique = true, useable = false, shouldClose = true,
info = { serial = '', durability = 1.0, ammo = 12, attachments = {} } },
data/items.lua) examplereturn {
water = {
label = 'Water Bottle',
weight = 500,
stack = true,
client = { status = { thirst = 25000 }, anim = { dict = 'mp_player_intdrink', clip = 'loop_bottle' } },
},
bandage = { label = 'Bandage', weight = 150, stack = true },
lockpick = { label = 'Lockpick', weight = 50, stack = true },
pistol_ammo = { label = 'Pistol Ammo (30)', weight = 450, stack = true },
weapon_pistol = {
label = 'Pistol', weight = 1500, stack = false, allowArmed = true,
consume = 0, -- handled by durability system
ammo = { type = 'AMMO_PISTOL', count = 12 },
metadata = { serial = true, durability = true, attachments = true },
},
}
ox_inventory supports rich client/server behaviors
ox_inventory supports rich
client/serverbehaviors in item definitions—prefer built‑ins over ad‑hoc scripts to standardize behavior.
-- qb-inventory/server/config.lua (illustrative)
Config.PlayerMaxWeight = 120000
Config.PlayerMaxSlots = 35
Config.Vehicle = {
glovebox = { weight = 10000, slots = 5 },
trunk = function(class)
if class == 'sedan' then return 80000, 20 end
if class == 'suv' or class == 'van' then return 120000, 25 end
if class == 'truck' then return 180000, 28 end
return 60000, 18
end
}
-- ox_inventory/server/custom/stashes.lua
lib.addstash('house_tier1', 40, 120000)
lib.addstash('house_tier2', 60, 180000)
lib.addstash('house_tier3', 80, 240000)
Principles
Snapshot DB first. 2) Migrate items/metadata with idempotent scripts. 3) Run side‑by‑side in a staging server. 4) Provide rollback SQL.
A)
qb-inventory→ox_inventoryMap fields
QB items.lua→ox data/items.lua(name,label,weight,stack/unique,client/server behaviors).player inventorytable: convertinfoJSON →metadata(serial, durability, ammo).Pseudocode (Lua/SQL mix)
-- 1) Export QB items to a Lua table/JSON -- 2) Generate ox items.lua entries -- 3) Transform inventories for item in qb_inventory_rows do local meta = json.decode(item.info or '{}') local metadata = { > serial = meta.serial, durability = meta.durability or 1.0, ammo = meta.ammo or 0, attachments = meta.attachments or {}, } insert_into_ox_inventory(item.name, item.amount, metadata) end
SQL example (PostgreSQL/MySQL style)
-- Backup CREATE TABLE backup_playeritems AS SELECT * FROM playeritems;
-- Transform example for a single item family UPDATE playeritems SET metadata = JSON_OBJECT( 'serial', JSON_EXTRACT(info, '$.serial'), 'durability', COALESCE(JSON_EXTRACT(info, '$.durability'), 1.0), 'ammo', COALESCE(JSON_EXTRACT(info, '$.ammo'), 0), 'attachments', COALESCE(JSON_EXTRACT(info, '$.attachments'), JSON_ARRAY()) ) WHERE name IN ('weapon_pistol','weapon_pistol_mk2');
Gotchas Unique items : enforce stack = false ;
Gotchas
- Unique items: enforce
stack = false; ensure duplicates don’t merge.- Ammo systems: reconcile boxed vs. loose ammo conventions.
- Images/icons: re‑path item images to match ox’s naming.
B) ESX (limit‑based) → weight model
- Set global
useWeight = truein config (varies by fork).- Replace per‑item
limitwithweight(g). For items formerlylimit = -1, assign realistic weights.- Migrate stash/vehicle caps accordingly.
Scripted pass
for name, item in pairs(Items) do if item.limit and not item.weight then item.weight = estimateWeightFromClass(name) item.limit = nil end end
Use these internal resources to connect Inventory & Weight Tuning: From items.lua to Metadata with setup, framework, marketplace resources, and server operations.
A slots-only system, where each item occupies a slot or a defined size class, struggles to differentiate between heavy and light items. This can lead to exploits where players carry numerous small, high-value items. A weight-only system, where each item has a weight and players have a maximum weight capacity, is more realistic but requires careful configuration of default weights. A hybrid system, combining global weight and slot caps, prevents both micro-item exploits (many small items) and mega-item exploits (a few very heavy items), making it a more balanced choice for roleplay servers.
The default presets provided are battle-tested starting points. After implementing them, monitor in-city telemetry for about a week. Observe player behavior, resource availability, and economic indicators. Based on this data, adjust the values by ±10–20% to fine-tune the balance to your specific server's needs. Consider factors like the availability of items, the rewards for different activities, and the desired level of scarcity.
The guide provides copy-pasteable `items.lua` definitions specifically designed for ESX, QBCore, and ox_inventory frameworks. Locate your existing `items.lua` file within your inventory script's directory. Carefully integrate the provided definitions, paying close attention to syntax and ensuring you don't overwrite or duplicate existing item definitions unintentionally. Remember to restart your server or inventory script after making changes for them to take effect. Always back up your original `items.lua` file before making modifications.
Launch faster
Bundles shorten the path from planning to launch by grouping the highest-leverage scripts into a cleaner commercial starting point.
qs-inventory / lj-inventory → QBCore/oxinfo → metadata.quality, image, createdAt). Normalize to the canonical schema.expiry for high‑margin consumables.Minimum Telemetry
% time encumbered, avg slots used, top 20 items by count and by total weight, stash utilization percentiles.weight, stack, and clear labels.unique/non‑stack and include serial, durability.name,label,class,weight_g,stack,stack_size water,Water Bottle,consumable,500,true,10 bandage,Bandage,medical,150,true,5 lockpick,Lockpick,tool,50,true,10 pistol_ammo,Pistol Ammo (30),ammo,450,true,5 weapon_pistol,Pistol,weapon,1500,false,1
container,weight_g,slots Glovebox,10000,5 Sedan Trunk,80000,20 SUV/Van Trunk,120000,25 Truck Trunk,180000,28 Motorcycle,8000,3
expiry, crafting input weight friction, or stash fees.notes fields.Have questions about a specific framework fork or a custom inventory? Drop the details and I’ll tailor the exact configs.
Inventory tuning, including managing slots, weight, stack limits, and item metadata, is crucial for creating a stable RP economy. These rules enforce scarcity, introduce friction, and force players to make meaningful choices about what they carry. If players can carry unlimited quantities of everything, it leads to price collapses and breaks economic loops. Tuning the inventory system is a foundational step before adjusting prices, payouts, and economic sinks.