Configuration
Configure the Oxide Shops economy, rate limits, shop types, weapon licenses, auctions, wholesale catalog, templates, tablet integration, and map mode.
oxide-shops is configured in-game, not by editing files. Nearly every setting on this page can be changed live with the /shop settings menu, and your changes are saved to your database.
How Configuration Works
This is the most important thing to understand about configuring oxide-shops:
- Your settings live in your database, not in the config files. The first time the resource starts, it reads the starting values from its config files and copies them into a database table called
oxide_settings. From that point on, the database is the source of truth. - To change a setting, open
/shop settingsin-game (admins only). Pick a setting, change it, and save. The change takes effect immediately and is remembered across restarts. - Editing the config
.luafiles after the first start usually does nothing. Because the database already holds your values, hand-edited file changes are ignored — except for a brand-new setting added by a future update, which is copied in the first time it appears. Use/shop settingsinstead. - Each setting has a "Reset to default" button in the menu, which restores that setting to the value the resource shipped with.
The /shop settings menu is organized into the same groups shown below, split into Basic (shown upfront) and Advanced (behind a toggle) tiers.
The tables below cover the settings you'll normally change, with each one's type, shipped default, and what it changes in-game. The Config. names are the internal keys; in the menu they appear with friendly labels.
Advanced sub-settings not in the menu
A handful of deeper tuning values are not in the /shop settings menu — for example the barber's seating scene (Config.BarberShop.scene), the tattoo shop's animations, seating scene, and clothing-strip amounts (Config.TattooShop.anims, .scene, .undress — the last one notes "adjust per your clothing pack"), the service display labels (serviceLabels), and the clothing slot definitions and icons (Config.ClothingShop.components / .props).
Because the database becomes the source of truth after the first start (see above), these values are effectively frozen at their first-boot values — they're not in the menu, and editing the config files later has no effect. If you genuinely need to change one of these, you must edit it in the config file and clear this resource's saved settings so the file values are re-imported on the next boot. That procedure is in Troubleshooting → I want to wipe all settings back to the file defaults. For almost every server, the shipped values are fine and you can ignore this section.
General
| Setting | Type | Default | Description |
|---|---|---|---|
Config.MaxShopsPerPlayer | number | 3 | How many shops a single player may own at once |
Config.AllowPlayerRename | boolean | true | When on, owners can rename their shop from the management panel. Admins can rename any shop in /shop admin either way. See Renaming a Shop |
Config.MaxShopNameLength | number | 32 | Longest name (in characters) an owner may give their shop |
Config.StartingStock | number | 25 | Quantity each item starts with when a shop first becomes player-owned |
Config.InteractionDistance | number | 2.5 | How close (in metres) a player must be to open a shop |
Config.DefaultPedModel | string | 's_m_y_ammucity_01' | Shopkeeper model used when a shop has none set |
Config.ServerInteractDistance | number | 12.0 | Anti-cheat guard: the server rejects a shop action from farther than this (metres). Keep it generous |
Config.Debug | boolean | false | Prints extra [oxide-shops] lines to the server console. Leave off on a live server |
Config.MapMode | string | 'inherit' | How the /shop admin map shows the mainland and Cayo Perico. See Shared map mode |
Economy
| Setting | Type | Default | Description |
|---|---|---|---|
Config.TaxRate | number | 0.05 | Sales tax added on top of item purchases at general and weapon shops (0.05 = 5%). It does not apply to services (barber/tattoo/mask/clothing), the pawn shop, or the auction house — those add no tax |
Config.WholesaleMarkup | number | 1.5 | Multiplier from an item's base price to the owner's wholesale cost (1.5 = 150%) |
Config.WeaponRegistrationFee | number | 500 | Cash fee charged per firearm a player registers at a weapon shop |
Config.AllowResale | boolean | true | When on, owners can list a shop for another player to buy at the shop |
Config.ResaleFeePercent | number | 0.05 | Cut taken from a shop resale before paying the seller (0.05 = 5%) |
Config.AutoRestock.Enabled | boolean | true | Whether player-owned inventory shops auto-restock on a timer |
Config.AutoRestock.Interval | number | 600000 | Time between auto-restock sweeps, in milliseconds (600000 = 10 minutes) |
Config.Transactions.RetentionDays | number | 30 | How many days of shop transaction history to keep |
Config.Transactions.PruneInterval | number | 3600000 | How often old transactions are cleaned up, in milliseconds (1 hour) |
Rate Limits
Config.RateLimits sets a minimum wait (in milliseconds) between repeats of each action, per player — an anti-spam guard. Each key is one action. Raise a value to slow an action down; lower it to allow faster repeats. When an update adds a new action, it uses its default value from the next start; your existing values are kept.
| Key | Default (ms) | Action it limits |
|---|---|---|
buyItem | 1000 | Buying an item (also pawn buy/sell, service purchases, auction actions) |
registerWeapon | 3000 | Registering carried firearms |
updatePrice | 1000 | An owner changing an item's price |
wholesaleOrder | 3000 | Placing a wholesale order |
transferItem | 1000 | Moving items from pockets into the shop |
withdraw | 3000 | Withdrawing from the shop balance |
deposit | 3000 | Depositing to the shop balance |
purchaseShop | 5000 | Buying a shop |
adminCreate | 3000 | Admin creating a shop |
adminEdit | 2000 | Admin editing a shop |
adminDelete | 5000 | Admin deleting a shop |
adminReclaim | 5000 | Admin reclaiming a shop |
getShopData | 500 | Opening a shop's item list |
getManagementData | 1000 | Opening the management panel |
getAdminData | 1000 | Opening the admin panel |
setResalePrice | 1000 | Listing/unlisting a shop for resale |
setAutoRestock | 1000 | Setting an auto-restock target |
renameShop | 5000 | An owner renaming their shop |
Blips
Each shop style has a default map blip. A blip has a sprite (icon ID), color (color ID), scale (size), and label (name on the map). Individual shops can override or hide their blip in /shop admin.
| Setting | Style | Default (sprite / color / scale / label) |
|---|---|---|
Config.Blip | General store | 52 / 2 / 0.7 / Store |
Config.WeaponBlip | Weapon shop | 110 / 1 / 0.8 / Ammunation |
Config.MaskBlip | Mask shop | 362 / 4 / 0.7 / Mask Shop |
Config.PawnBlip | Pawn shop | 617 / 46 / 0.6 / Pawn Shop |
Config.AuctionBlip | Auction house | 269 / 2 / 0.8 / Auction House |
Config.BarberBlip | Barber shop | 71 / 25 / 0.7 / Barber Shop |
Config.ClothingBlip | Clothing store | 73 / 47 / 0.7 / Clothing Store |
Config.TattooBlip | Tattoo parlor | 75 / 1 / 0.7 / Tattoo Parlor |
Weapon Shop
| Setting | Type | Default | Description |
|---|---|---|---|
Config.WeaponModels | table | (per weapon) | Maps each weapon item name to the 3D prop model shown on the weapon shop display shelf. A weapon with no entry simply shows no prop. Edited from the Weapon Shop section of /shop settings |
Config.RequireWeaponLicense | boolean | false | Require a weapon license. When on, players need a firearms license to buy from a weapon shop, except items exempted by the two lists below. If your framework has no license system, sales go through as normal and a warning is printed to the server console |
Config.WeaponLicenseType | string | 'weapon' | License type — the license name that is checked. weapon matches QBCore and QBX out of the box; on ESX it must match a type in your user_licenses table |
Config.WeaponLicenseExemptCategories | list | { 'Melee' } | Categories sold without a license — shelf categories that never need the license. Not case-sensitive |
Config.WeaponLicenseExemptItems | list | five melee weapons | Items sold without a license — item names that never need the license. Ships with the five melee weapons from the default Ammunation catalog: weapon_knife, weapon_bat, weapon_crowbar, weapon_hammer, weapon_nightstick. Not case-sensitive |
An item is sold without a license when either its name is in the items list or its shelf category is in the categories list. Items placed with Add item in /shop admin, restocked from wholesale, or transferred from a player's inventory have no category, so exempt those by name. Clear both lists to require the license for everything in the shop.
A player without the license sees "You need a weapon license to buy this item" (shop_weapon_license_required in locales/en.json) and is not charged.
Both lists ship pre-filled, so melee weapons sell without a license even while the requirement is on. Clear both lists if every item should need the license.
Weapon stats shown in the UI (damage/accuracy/range/fire-rate) ride on the individual template items inside Config.ShopTemplates. Like all top-level settings, the shop templates become database-backed after the first start — so editing shared/config/templates.lua later has no effect, and there is no stats field in the settings menu. In practice the stats are frozen at their first-boot values unless you change them the hard way: edit the template rows and re-import the settings using the wipe procedure in Troubleshooting.
Mask Shop
| Setting | Type | Default | Description |
|---|---|---|---|
Config.MaskShop.maskPrice | number | 500 | Default mask price (player-owned shops set their own) |
Config.MaskShop.supplyItem | string | 'mask_blank' | Item consumed per mask sold (player-owned shops only) |
Config.MaskShop.supplyPerService | number | 1 | Units of the supply item used per mask |
Config.MaskShop.startingSupply | number | 25 | Supply seeded into the shop when a player buys it |
Barber Shop
Config.BarberShop.prices sets the default price charged per category the customer changes.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.BarberShop.prices.hair | number | 35 | Haircut (hair style) price |
Config.BarberShop.prices.hairColor | number | 25 | Hair color + highlight price |
Config.BarberShop.prices.beard | number | 20 | Facial hair price |
Config.BarberShop.prices.eyebrows | number | 15 | Eyebrows price |
Config.BarberShop.prices.eyeColor | number | 20 | Eye color price |
Config.BarberShop.supplyItem | string | 'hair_product' | Item consumed per styling (player-owned shops only) |
Config.BarberShop.supplyPerService | number | 1 | Units of supply used per changed category |
Config.BarberShop.startingSupply | number | 25 | Supply seeded when a player buys the shop |
Tattoo Shop
| Setting | Type | Default | Description |
|---|---|---|---|
Config.TattooShop.prices.apply | number | 500 | Price to apply one tattoo |
Config.TattooShop.prices.remove | number | 750 | Price to remove one tattoo |
Config.TattooShop.supplyItem | string | 'tattoo_ink' | Item consumed per apply/remove (player-owned shops only) |
Config.TattooShop.supplyPerService | number | 1 | Units of supply used per apply/remove |
Config.TattooShop.startingSupply | number | 25 | Supply seeded when a player buys the shop |
Config.TattooCatalog | table | (10 collections) | The collections and tattoos offered. Editable in the Tattoo Shop section of /shop settings; per-tattoo preview cameras are set with the in-game camera editor in /shop admin |
Clothing Shop
Config.ClothingShop.components and Config.ClothingShop.props define the garment/prop slots and their default per-slot prices. A few examples:
| Slot | Default price |
|---|---|
Shirt (component_11) | 200 |
Arms (component_3) | 200 |
Undershirt (component_8) | 100 |
Pants (component_4) | 150 |
Shoes (component_6) | 120 |
Armor (component_9) | 300 |
Hat (prop_0) | 80 |
Glasses (prop_1) | 60 |
Watch (prop_6) | 100 |
| Setting | Type | Default | Description |
|---|---|---|---|
Config.ClothingShop.prices | table | (per-slot) | Default price charged per changed clothing/prop slot. Editable in /shop settings |
Config.ClothingShop.supplyItem | string | 'fabric' | Item consumed per changed slot (player-owned shops only) |
Config.ClothingShop.supplyPerService | number | 1 | Units of supply used per changed slot |
Config.ClothingShop.startingSupply | number | 25 | Supply seeded when a player buys the shop |
Pawn Shop
Controls how the pawn shop's buy and sell prices are derived and how they move with demand. See Features → Pawn Shop for how these interact.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.PawnShop.sellRatio | number | 0.5 | Base sell price as a fraction of buy price (50%) |
Config.PawnShop.decayPerSale | number | 0.05 | Sell price drop per sale of the same item (−5%) |
Config.PawnShop.recoveryPerMinute | number | 0.01 | Price recovery per minute toward base (+1%/min) |
Config.PawnShop.minSellMultiplier | number | 0.1 | Sell price floor as a fraction of base (10%) |
Config.PawnShop.demandMultiplier | number | 0.03 | Buy price rise per unit of demand (+3%) |
Config.PawnShop.maxBuyMultiplier | number | 1.5 | Cap on buy price as a multiple of base (150%) |
Auction House
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Auction.listingFeePercent | number | 0.05 | Fee to list, as a fraction of the starting price (5%) |
Config.Auction.completionFeePercent | number | 0.05 | Fee taken from a completed sale (5%) |
Config.Auction.minBidIncrement | number | 100 | Smallest allowed absolute bid increase |
Config.Auction.bidIncrementPercent | number | 0.05 | A bid must also beat the current bid by this fraction (5%) |
Config.Auction.maxActiveListings | number | 10 | Most auctions one seller may have active at once (a per-character cap, not a server-wide total) |
Config.Auction.checkInterval | number | 30000 | How often auctions are checked for expiry, in milliseconds (30 seconds) |
Config.Auction.durations | table | { 1, 6, 12, 24 } | Auction lengths in hours that sellers can choose. This one is not editable in the settings menu, and because the whole Auction setting is database-backed after the first start, it's effectively frozen at its first-boot value. To change it you must edit shared/config/auction.lua and re-import settings via the wipe procedure |
Wholesale Catalog
Config.WholesaleCatalog is the list of items that player-owned shop owners can restock from wholesale. Each entry has:
| Field | Type | Description |
|---|---|---|
basePrice | number | The base price. Owner's cost per unit = basePrice × Config.WholesaleMarkup |
minOrder | number | Smallest allowed order quantity |
maxOrder | number | Largest allowed order quantity |
category | string | Grouping label shown in the wholesale UI |
You add, remove, and edit wholesale items in the Wholesale section of /shop settings using the item picker. The four service supply items (hair_product, tattoo_ink, mask_blank, fabric) are included so owners can restock service shops.
Shop Templates
Config.ShopTemplates is the list of ready-made shops that /shop admin can create from a picker. Each template carries a shop ID, name, ped model, style, location, optional chairs (for barber/tattoo), an optional purchase price, and an item list. The default templates place all the standard GTA stores at their familiar locations.
Templates are advanced and are edited in the Shop Templates section of /shop settings (including placing the location in-world). For everyday use you'll create and edit live shops directly in /shop admin rather than editing templates.
Tablet
These settings only do something when Oxide Tablet (oxide-tablet) is installed. Without it, or with Tablet apps switched off, the shop manager and auction house open in their own window at the shop exactly as they always have.
With it, an owner gets a Shop Manager tile and, if your server runs an auction house, an Auction House tile, plus a My Shops widget for the home screen showing each shop they own and its till.
The settings live in Config.Tablet (shared/config/tablet.lua) and appear in /shop settings as Tablet integration, under the Tablet group.
| Setting | Menu label | Type | Default | Description |
|---|---|---|---|---|
UseTablet | Tablet apps | toggle | true | Show the Shop Manager and Auction House tiles and the My Shops widget |
AllowCashActions | Allow remote withdraw/deposit | toggle | false | Allow Withdraw and Deposit from the tablet. Off by default — see below |
Notifications | Tablet notifications | toggle | true | Push sales, low-stock warnings and auction results (outbid, won, sold, expired) to the owner's tablet. Needs Tablet apps on as well |
LowStockThreshold | Low stock warning at | number | 5 | A sale that leaves this many or fewer of an item warns the owner (one notification per item per shop, replaced rather than repeated). 0 turns the warning off |
SessionTtl | Remote session timeout | number | 600 | Seconds (60–7200) a remote management session stays valid if the game never reports the desktop closed — a crash, or the player quitting mid-session |
Why withdraw and deposit are off by default
Moving the till is the one shop action that puts cash straight in a player's pocket, and the shop counter has always been the thing that kept it local. Opening the manager from a tablet anywhere on the map would quietly turn that into withdraw-from-anywhere, which is a real change to your economy — so it is opt-in.
Everything else works remotely: price changes, auto-restock targets, wholesale orders, restocking from your own inventory, listing the shop for resale, and the transaction ledger. Those move shop balance and stock, never a player's cash.
Turn AllowCashActions on if you'd rather have the convenience. When it's off, the buttons are hidden while the panel is open on a tablet, and the server refuses the action either way, so nothing slips through.
Shared map mode
Config.MapMode picks how the shop map in /shop admin shows the mainland and Cayo Perico. The map itself comes from o-link, which owns the artwork and calibration, so this setting only chooses a mode.
| Value | What you see |
|---|---|
inherit | Default. Follow the server-wide default set in o-link |
combined | Mainland and Cayo Perico on one combined map |
separate | Separate mainland and Cayo Perico views, with a region selector |
disabled | Mainland only — Cayo Perico and its markers are hidden |
Config.MapMode = 'inherit'The value is saved in the oxide_settings table like every other setting: the config file only seeds it when nothing is saved yet. Change it live in either of these ways:
- Map mode under General in
/shop settings. oxide-shops:mapmode <value>from the server console, or/oxide-shops:mapmode <value>in game as an admin. Run it without a value to print the current mode to the server console.
inherit follows the server-wide default, which you set once for every Oxide resource with olink:mapmode <value> (combined, separate or disabled; o-link ships with combined). Open maps pick up a new mode without a restart.
The shared map needs o-link 1.8.0 or newer. Update o-link and oxide-shops together, then do a full server restart rather than restarting o-link on its own.
Next Steps
- Admin — using the
/shop adminand/shop settingsmenus - Features — how each setting plays out in-game
- Troubleshooting — if a change doesn't seem to apply