WORLD_HUMAN_STAND_IMPATIENT = Standing, looking around
Cash Registers (Optional)
If your shop doesn't have physical registers, just use:
Shop Items
Note: This is ignored if BaseProducts is enabled in config.lua (it is by default). When enabled, all shops of the same type share the same items.
Player Ownership
If you don't want players to own this shop:
Item Display Overrides
Any item can override its display name, description, and image in the shop UI. These work in BaseProducts, individual shop items (configs/shops.lua), and ProductWhitelist entries (configs/management.lua).
Field
Description
label
Custom display name (overrides the auto-fetched inventory label)
description
Custom description text (overrides the auto-fetched inventory description)
image
Custom image — either a filename (e.g., 'lockpick_gold.png') resolved via your inventory's image directory, or a full path (e.g., 'nui://my_resource/images/custom.png' or a URL)
In BaseProducts or shop items:
In ProductWhitelist:
These overrides apply across the entire UI — shop display, management menu, stock ordering, analytics, and transaction history.
Item Metadata
You can assign metadata to any item sold through shops (owned and unowned). Metadata is passed to the inventory system when a player purchases the item — this is useful for things like durability, quality, or any custom field your server uses.
In BaseProducts or shop items:
In ProductWhitelist:
For weapons, configured metadata is merged with weapon serial metadata (weapon fields take priority on conflict).
Display Metadata (ox_inventory only)
If you're using ox_inventory, you can register custom metadata keys so they appear in the item tooltip. Add a displayMetadata table to any item.
There are two formats:
String format — the key is shown with a simple label (booleans display as "Yes"/"No", numbers display as-is):
Table format — for booleans, you can customize what "true" and "false" display as:
You can combine both formats on the same item:
Note: Do NOT add ox_inventory built-in keys like durability, description, ammo, serial, components, weapontint, type, or label to the displayMetadata table — ox_inventory handles those already and they will be ignored.
ApplyMetadata Groups
Instead of adding metadata to every item individually, you can define global metadata groups in configs/config.lua that automatically apply metadata to purchased items based on rules.
How priority works:
Groups are applied in order (top to bottom) — later groups override earlier ones for the same key
Per-item metadata (from BaseProducts/shop items/ProductWhitelist) overrides group values
Weapon serial metadata (serial, registered) always takes highest priority
So if a lockpick is purchased: it first gets durability = 100 from the 'all' group, then that's overridden to durability = 50 by the specific group. If the lockpick also had metadata = { durability = 75 } in its item config, that would win over both groups.
Item Variants
You can sell multiple variants of the same item, each as a completely separate product. Items with different metadata are treated as entirely separate items by the resource — they have their own stock, their own sales tracking, and their own display.
For example, if you have a single water item in your inventory system, you can sell a regular version and a premium version side by side, each with different prices, labels, images, and metadata.
In BaseProducts or shop items:
In ProductWhitelist (for owned shops):
For owned shops, each variant gets its own independent stock — ordering, withdrawing, and transferring from inventory all respect variant boundaries. In the management UI, variants display as water: Premium Spring Water so you can easily tell them apart.
Another example — a weed shop selling different strains, all using the same base weed item:
Each strain shows up as its own product with its own price, image, and metadata — but they all use the same weed item in the inventory system.
['shop_id'] = { -- Unique ID (no spaces, no duplicates)
name = 'Shop Name', -- Displayed to players
subtitle = 'Shop Description', -- Shown under the name
shopType = '247store', -- What products it sells (see list above)
location = vector3(x, y, z), -- Where the blip appears on the map
blip = {
sprite = 52, -- Icon type (set to 0 to hide from map)
color = 2, -- Icon color
scale = 0.7, -- Icon size
display = 4 -- Keep at 4
},
ped = {
enabled = true, -- true = spawn a ped, false = no ped
model = 'mp_m_shopkeep_01', -- Ped appearance
coords = vector3(x, y, z), -- Where the ped stands
heading = 180.0, -- Direction they face (0-360)
scenario = 'WORLD_HUMAN_STAND_MOBILE' -- What they're doing
},
registers = {
enabled = true, -- true = players can interact with registers
coords = {
vector3(x, y, z), -- Position of register 1
vector3(x, y, z), -- Position of register 2 (optional)
}
},
ownership = {
enabled = true, -- Can players buy this shop?
coords = vector3(x, y, z), -- Where they access the management menu
price = 50000 -- How much to buy it
}