Installation
Install Oxide Shops, add its service-supply items, and verify all required integrations.
This guide takes you from a fresh copy of oxide-shops to a working shop system. You do not need to know how to program. Follow each step in order, and read the notes — they head off the most common mistakes.
Prerequisites
Before you start, make sure these resources are already on your server and working.
Required Resources
| Resource | Minimum Version | Purpose |
|---|---|---|
| ox_lib | v3.0.0+ | Utility library and translations (the words shown in menus) |
| oxmysql | latest | Lets the resource save shops and sales to your database |
| o-link | latest | The bridge that makes this resource work on any framework |
| ox_target (or another supported target resource) | latest | The on-screen prompt you press (usually the middle mouse button or E) to talk to a shopkeeper. Interactions route through the bridge, so any target resource the bridge supports will work |
| A clothing/appearance resource | latest | Applies and saves clothing, hair, and tattoo changes (see note below) |
What is a "clothing/appearance resource"? It is the script your server already uses to let players change their outfit and looks (for example
illenium-appearance,fivem-appearance,rcore_clothing, or your framework's built-in clothing).oxide-shopsdoes not replace it — it asks it to save the changes a player buys at a barber, tattoo parlor, clothing store, or mask shop. The general store, weapon shop, pawn shop, and auction house do not need a clothing resource; only the four "styling" shops do.Barber and tattoo shops need a bit more. They require a backend that exposes a rich appearance (hair and face detail) through the bridge.
illenium-appearance,fivem-appearance, andrcore_clothingare verified to work. On a backend that only handles outfits, the barber and tattoo shops refuse gracefully (with a clear message) rather than wiping a player's look — clothing and mask shops still work fine.
Supported Frameworks
oxide-shops works with any framework that o-link supports. You install it once and it adapts to whatever you run.
| Framework | Support |
|---|---|
| QBCore | Full |
| ESX | Full |
| QBX (qbx_core) | Full |
| Custom | Via o-link |
Installation Steps
-
Extract the resource into your server's
resources/folder. If you keep Oxide resources together, a folder named[oxide]is a good home for it. The folder must be named exactlyoxide-shops. -
Add it to your
server.cfg— this is the text file that tells your server which resources to start. Add this line in the correct place (see Load Order below):ensure oxide-shops -
Register the supply items in your framework so player-owned barber/tattoo/mask/clothing shops can restock. See Adding the Supply Items.
-
Start (or restart) your server. On its first start,
oxide-shopsbuilds its own database tables automatically. You do not need to import any SQL by hand (see Database Setup). Note that a fresh install has no shops yet — the tables are empty until you add shops in the next step. -
Create your shops in-game. As an admin, open
/shop adminand create each store you want from the built-in template picker (all the familiar GTA stores — supermarkets, gas stations, gun shops, barbers, tattoo parlors, and more — are ready-made templates). Creating a shop is what places its shopkeeper and blip on the map. See Admin → The Admin Panel. -
Configure anything you want to change in-game with
/shop settings. There are no config files you need to edit for normal setup.
Load Order
Every Oxide resource follows the same four-tier load order in server.cfg. Use this structure exactly — the resource will misbehave if o-link starts after it.
# 1. Framework — everything your framework needs (qb-core, es_extended, qbx_core, etc.)
ensure qb-core
# 2. Scripts — your other resources (inventory, clothing, ox_target, etc.)
ensure ox_target
ensure illenium-appearance
# 3. o-link — the bridge. Starts after your framework/scripts, before any Oxide resource.
ensure o-link
# 4. Oxide resources — keep these together, ideally in a folder named [oxide]
ensure oxide-shops- The only hard rule is that
o-linkcomes after your framework and other scripts, and beforeoxide-shops. - If you run several Oxide resources, put them all in a folder named
[oxide]and you can start them together withensure [oxide].
Adding the Supply Items
Player-owned service shops (barber, tattoo, mask, and clothing stores) run on a "supply" item — each haircut, tattoo, mask, or garment change uses up one unit of a small consumable, and the owner buys more from wholesale. Static (server-run) shops do not use supply, but you should still register these items so ownership works if you enable it.
Register these four items in your framework's item list. Icons for them ship inside oxide-shops/itemimages/ — copy those PNGs into your inventory resource's image folder if it uses one.
| Item name | Used by | Suggested label |
|---|---|---|
hair_product | Barber shops | Hair Product |
tattoo_ink | Tattoo parlors | Tattoo Ink |
mask_blank | Mask shops | Blank Mask |
fabric | Clothing stores | Fabric |
ox_inventory (data/items.lua):
['hair_product'] = { label = 'Hair Product', weight = 100, stack = true, close = true },
['tattoo_ink'] = { label = 'Tattoo Ink', weight = 100, stack = true, close = true },
['mask_blank'] = { label = 'Blank Mask', weight = 100, stack = true, close = true },
['fabric'] = { label = 'Fabric', weight = 100, stack = true, close = true },QBCore (qb-core/shared/items.lua):
hair_product = { name = 'hair_product', label = 'Hair Product', weight = 100, type = 'item', image = 'hair_product.png', unique = false, useable = false, shouldClose = true, description = '' },
tattoo_ink = { name = 'tattoo_ink', label = 'Tattoo Ink', weight = 100, type = 'item', image = 'tattoo_ink.png', unique = false, useable = false, shouldClose = true, description = '' },
mask_blank = { name = 'mask_blank', label = 'Blank Mask', weight = 100, type = 'item', image = 'mask_blank.png', unique = false, useable = false, shouldClose = true, description = '' },
fabric = { name = 'fabric', label = 'Fabric', weight = 100, type = 'item', image = 'fabric.png', unique = false, useable = false, shouldClose = true, description = '' },ESX (run once in your database, then restart):
INSERT INTO items (name, label, weight, rare, can_remove) VALUES
('hair_product', 'Hair Product', 1, 0, 1),
('tattoo_ink', 'Tattoo Ink', 1, 0, 1),
('mask_blank', 'Blank Mask', 1, 0, 1),
('fabric', 'Fabric', 1, 0, 1);The stores also sell ordinary items — water, bread, lockpicks, weapons, armor, and so on. Those items must already exist in your framework for a store to display and sell them. If a store shows an item by its raw name (like
weapon_pistolinstead of "Pistol") or refuses to sell it, that item is not registered in your framework. You can also change any store's item list in/shop adminto match the items you actually have.
Database Setup
In most cases you do nothing here. On its first start, oxide-shops creates all of its database tables automatically. Your database (the place your server stores saved data) just needs to be connected through oxmysql, which it already is if your framework works. (The tables start empty — you add the actual shops yourself in /shop admin, as described in the Installation Steps above.)
A ready-made SQL file is included at oxide-shops/sql/install.sql for reference or for admins who prefer to create the tables by hand. You only need it if your database user is not allowed to create tables automatically — in that case, import sql/install.sql into your database using your database tool (for example phpMyAdmin or HeidiSQL) before starting the resource.
Verification
- Start your server and watch the console for errors mentioning
oxide-shops. A clean start means the tables were created. - Join the server as a character.
- As an admin, type
/shop admin— the admin panel should open. If it says you do not have permission, see Permissions. - In the admin panel, create at least one shop from the template picker (for example a 24/7 supermarket). Confirm it saves without errors.
- Open your map — the shop you just created should now show a blip.
- Walk up to that shopkeeper (or into the store zone, for clothing/mask shops) and press your interaction key. You should see a Browse Shop option; selecting it opens the shop menu.
If a step fails, see Troubleshooting.
Next Steps
- Configuration — every setting and what it changes
- Features — how each shop type works
- Admin — the admin panel and commands