Advanced
Custom Shops
One-off shops with their own items, not tied to a catalog.
Most shops should use the catalog + location system. But sometimes you want a single, unique shop with its own items that no other shop shares — for example a police armory.
That's what Config.CustomShops is for. Each entry defines its own categories and items inline.
config.lua
Config.CustomShops = {
['police_armory'] = {
label = 'Police Armory',
coords = vector4(452.3, -980.0, 30.7, 90.0),
jobs = { 'police' },
paymentMethods = { 'card' },
marker = { enabled = true, color = { r = 50, g = 120, b = 255, a = 180 } },
blip = { enabled = false },
categories = { { id = 'gear', label = 'Gear' } },
items = {
{ name = 'bandage', label = 'Bandage', price = 0, category = 'gear', image = 'bandage.png' },
},
},
}
Fields
| Field | Type | Description |
|---|---|---|
key (['police_armory']) | string | The unique shop id. |
label | string | Shop name in the UI. |
coords | vector4 | Position + heading. |
categories | table | Its own category list (same shape as a catalog). |
items | table | Its own item list (same shape as a catalog). |
blip | table | Optional blip (set enabled = false to hide). |
marker | table | Optional marker override. |
jobs / minJobGrade | — | Optional job restrictions. |
paymentMethods | table | Optional payment override. |
Catalog vs. custom shop — which to use?
Use a Catalog + Location
When several shops sell the same things (LTD, 24/7, etc.). Edit prices once.
Use a Custom Shop
When a single shop has a unique item list nothing else shares (armory, dealer, etc.).
categories and items use the exact same fields as catalogs — see Catalogs & Items for the field reference.Custom shops are merged into the live shop list at start, alongside the catalog-based locations. They support jobs, payments and markers just like normal shops.

