Documentation

Pepper Carwash

Car washes built from stock GTA props – guided setup, blueprints, build mode or zones – with 6 wash programs, wax protection, a self-service bay, ownable businesses with tablet, stock, staff and tasks, business levels 1–100 and NPC customers for ESX, QBCore and Qbox.

Overview

Pepper Carwash lets admins build car washes right in the game and lets players own and run them. A car wash is created with /carwashadmin – with a guided setup, from a blueprint, freely in build mode or as zones inside an existing building. Everything is built from props that ship with the game: no MLO, no addon models.

Customers drive to the entrance, pick one of 6 wash programs and get washed: in a tunnel wash the vehicle is guided through the stations, in a gantry wash the vehicle stands still and the gantry moves over it. A car wash without an owner works as a state-run car wash for everyone. Put up for sale, a player buys it and runs it from the business tablet: business account, own prices, storage, stations, staff, levels 1–100 with upgrades, and NPC customers while staff is on duty.

Note: The tab Default car washes can create five well-known locations. Their coordinates are approximations – check every car wash on site and correct it with Redo zones.

Features

  • Four ways to create a car wash, all in game and without a restart: guided setup, blueprint, build mode (catalog with 49 parts), zones inside existing buildings
  • Quick setup (since 1.1.0): place only the lane – the script sets up stations, gate, terminal, walls, equipment and signs wherever there is room
  • Self-measurement (since 1.1.0): the script reads the model dimensions from the game once and places every part centred and on the ground – custom props too
  • Your own logo on the large billboard (since 1.1.0): drop an image into the folder, enter it in the config, selectable or switched off per car wash
  • 3 types: self-service bay, gantry wash, tunnel wash – built from stock GTA props only
  • 6 wash programs (Basic, Foam, Underbody, Wax, Premium, Showroom finish) and 6 extras (Wheel cleaning, Bug remover, Glass sealant, Hot wax, Nano sealant, Engine bay wash) with particles, sound and a progress display
  • Wax protection keeps a vehicle clean for the time that was bought – stored in the database, survives the garage and a restart
  • Self-service bay: buy 1 to 5 minutes, take the spray gun, wash the vehicle yourself
  • Vacuum spot with self-service vacuuming and the services interior cleaning and hand polish
  • Ownable business: bought at the sale sign, one car wash per player (per character or per license), sell it back or transfer it to another player
  • Business tablet with 14 pages: Overview, Tasks, Level & upgrades, Exam, Finances, Prices, Storage, Stations, Staff, Loyalty cards, Fleets, Statistics, Settings, Help
  • Stock and wear: water, shampoo and wax are used up, stations wear down, faults stop the lane, a technician can be called
  • Staff: hire players on site, 5 ranks with rights, duty, commission, task pay and shift pay from the business account – no framework job needed
  • 8 tasks, 7 of them as mini-games: fix fault, manual pre-wash, hand drying, interior cleaning, hand polish, refill chemicals, service the brushes, pick up delivery – with a performance rating from 80 to 120 % for pay and XP
  • Business levels 1–100 with 90 upgrades (stations, lanes, tanks, speed, advertising and more), a build mode for owners and business exams at level 30, 60 and 90
  • NPC customers while staff is on duty, loyalty cards, company cards and fleet contracts
  • Inactivity rule: an owner who was offline for 30 days loses the car wash (warnings, admin protection, restore within 14 days – all in the config)
  • Admin tools in game: create, change, move and remove car washes, ownership, log, diagnostics
  • Built-in UI for prompts, progress bar, notifications, dialogs and menus – the only dependency is oxmysql
  • Optional inventory items (canisters, spare parts, tablet, loyalty card) with 5 ready-made images
  • In-game help for staff, owners and customers, plus a player guide in English and German to copy into your wiki
  • 6 Discord webhooks, server and client exports
  • German & English, open config, locales, bridges and install files

Requirements

Dependency Required/optional Used for Link
FiveM server build 7290 or newer required Per fxmanifest.lua (/server:7290) https://runtime.fivem.net/artifacts/fivem/
OneSync required Vehicles, props and NPC customers on the server https://docs.fivem.net/docs/scripting-reference/onesync/
oxmysql required 11 tables pepper_carwash_* (MySQL 8 / MariaDB 10.x) https://github.com/overextended/oxmysql
ESX Legacy, QBCore or Qbox required (otherwise standalone mode) Money, name, groups (Config.Framework = 'auto' detects it) https://github.com/esx-framework/esx_core · https://github.com/qbcore-framework/qb-core · https://github.com/Qbox-project/qbx_core
ox_target or qb-target optional Self-service bay on foot, without a target a help text with a key https://github.com/overextended/ox_target
Inventory optional Items for canisters, spare parts, tablet, loyalty card (ox_inventory, qb-inventory, ps-inventory, qs-inventory, ESX inventory) https://github.com/overextended/ox_inventory

ox_lib is not needed and not loaded.

Installation

  1. Download the resource from the Cfx.re Portal (Granted Assets)
  2. Extract to resources/[pepper]/pepper_carwash – do not rename
  3. Check config/config.lua (language, currency, prices), config/server.lua for webhooks
  4. Add to your server.cfg after the dependencies:
ensure oxmysql
ensure es_extended        # or qb-core / qbx_core
# ensure ox_inventory     # optional (items) – or qb-inventory / ps-inventory / qs-inventory
# ensure ox_target        # optional (self-service bay on foot) – or qb-target
ensure pepper_carwash

add_ace group.admin pepper_carwash.admin allow
  1. Database: the eleven tables (pepper_carwash_*) are created automatically on start. Without CREATE permission import install/pepper_carwash.sql first
  2. Start the server – the console shows a green line Pepper Carwash 1.1.0 started (…)
  3. In game: open /carwashadmin → tab New and create the first car wash

If another car wash script is running (for example esx_carwash or qbx_carwash), stop it or change Config.Commands.Main – both would otherwise use /carwash.

The complete guide in English and German is INSTALL.md in the resource.

Items (optional)

Without items everything works: canisters and spare parts are counters in storage. With items the wholesaler hands the goods into the inventory and a staff member stocks them at the storage point.

Item Purpose Switch
carwash_cans_shampoo, carwash_cans_wax, carwash_parts canisters of shampoo / wax, spare parts Config.Supply.UseItems ('auto')
carwash_tablet use = opens the tablet of your own car wash Config.Items.Tablet.Enabled (false)
carwash_card loyalty card: use = shows your stamps Config.Items.Card.Enabled (false)

Templates per inventory and the images are in install/items/ (ox_inventory, qb-inventory, ps-inventory, qs-inventory, ESX inventory). Steps: add the items → copy the images → restart the server. The console line [pepper_carwash] Items: … shows which inventory is used; if an item is missing, the business keeps running without items.

First test

  1. /carwashadmin → tab New → Guided setup, choose the status State-run.
  2. With Quick setup, place entrance, start and end of the wash lane and exit, then save.
  3. Stop at the entrance with a dirty vehicle, press E, choose a program and Start wash.
  4. Stay in the vehicle until the wash is done: the dirt is gone.
  5. /carwashadmin → Diagnostics shows version, framework and the chosen models.

Configuration

File Contents
config/config.lua language, currency, commands, admin groups, keys, blips, washing, self-service bay, wax, ownership, economy, levels, NPC customers, tips, loyalty cards, fleets, tablet, inactivity, stock, supply, wear, build mode, limits
config/programs.lua programs, extras, stations with effect and sound candidates, spray gun
config/parts.lua parts catalog with model candidates and dimensions
config/blueprints.lua · config/presets.lua the three blueprints · five well-known locations (approximations)
config/staff.lua ranks and rights, wages, duty, tasks, performance rating and mini-game rules
config/levels.lua · config/exams.lua unlock list level 1–100 with upgrade prices · business exams
config/server.lua webhooks, admin ACE (never sent to clients)
locales/de · locales/en all texts

Key options:

Option Default Meaning
Config.Locale 'de' language (de / en), applies to all players
Config.Framework 'auto' auto, esx, qbcore, qbox, standalone
Config.Economy.IncomeMultiplier 1.0 the main dial: scales all money from NPC customers. It does not change prices for players
Config.Economy.UpgradeMultiplier 1.0 scales all upgrade and decoration prices
Config.Level.XpMultiplier 1.0 levelling speed (2.0 ≈ half the time)
Config.Level.Exams.Enabled true business exams at level 30 / 60 / 90
Config.Ownership.Scope 'character' one car wash per character or ('license') per player
Config.Ownership.DefaultPrice 40,000 / 80,000 / 150,000 suggested purchase price for self-service bay / gantry wash / tunnel wash
Config.Inactivity.Enabled / Days true / 30 owners who were offline that long lose the car wash; the business account is forfeited
Config.Npc.Enabled / Visible true / true NPC customers on or off · Visible = false: customers as bookings only, no vehicles
Config.Wash.StaffRequired false true: players can only wash at owned car washes while staff is on duty
Config.Wash.Guide 'auto' how the vehicle is guided through the tunnel: 'task', 'speed', 'conveyor'
Config.SelfService.PricePerMinute / MaxMinutes 15 / 5 self-service bay
Config.Interact.Mode 'auto' self-service bay: ox_target, otherwise qb-target, otherwise help text + key · 'textui' = never use a target
Config.Interact.KeyMapping true keys via FiveM key bindings (players can rebind them) instead of fixed keys
Config.Notify.Mode 'pepper' built-in notifications · 'framework' = notification of ESX / QBCore / Qbox
Config.Inventory 'auto' detect the inventory for the optional items or set it explicitly · 'none' = never use one
Config.Supply.UseItems 'auto' canisters / spare parts as items once inventory and items exist · false = always counters in storage
Config.Effects.Sounds 'auto' 'nui' forces the UI sounds, 'off' disables sound
Config.Dirt.Mode 'native' 'custom' = your own dirt system via bridge/client/dirt.lua
Config.Signs.Enabled · Image true · 'pepper' image on the large billboard (default: Pepper Scripts logo). Put your own image into html/img/ and enter it in Config.Signs.Images · Enabled = false = the sign stays empty
Config.Measure.Enabled true self-measurement of the models · false = only the shipped dimensions apply
Config.World.AutoRebuild 'ask' after an update with a changed blueprint: 'ask' = report it, one button in the admin menu resets all affected car washes · 'auto' · 'off'
Config.Guide.MaxStep · AvoidRoads 0.6 · true room check of the quick setup: allowed unevenness in metres · never place anything on a road

Restart the resource after every change. In config/levels.lua do not change the key of an upgrade after the first start – the purchase is stored in the database under that name.

Economy and levels

Config.Economy = {
    IncomeMultiplier = 1.0,
    UpgradeMultiplier = 1.0,
}

Program prices live in config/programs.lua, wages in config/staff.lua. IncomeMultiplier is the main dial for all money from NPC customers, Config.Level.XpMultiplier sets how fast a business levels up.

Creating a car wash

/carwashadmin → tab New. Each way first asks for name, purchase price and status.

Way For Procedure
Guided setup (recommended) any plot choose the type and a build level → Place in game. Quick setup (default, since 1.1.0): you only place the lane – entrance, start and end of the wash lane, exit (gantry wash 2 points, self-service bay 1) – and the script sets up everything else, only where there is room, with a summary as a preview. Place everything myself: an assistant asks for every slot one by one. Nothing is built until you save
Blueprint open ground choose a blueprint and a build level, rotate the preview, place it
Zones an existing building mark entrance, start and end of the wash line and exit – no props of its own
Build mode built from single parts place the origin, then set, move and remove parts from the catalog

Status of a car wash: For sale (a sale sign appears, a player buys it there), State-run (usable by everyone, not for sale, the money disappears) or Locked. The car wash name is also the map blip name.

Every part has a list of model candidates in config/parts.lua: the client uses the first model your game knows. If none loads, the station still works with effects, sound and light. /carwashadmin → Diagnostics shows which models were chosen.

How a wash works

  1. Drive up: stop at the entrance, press E and choose a program and extras. Locked programs state the reason (level, missing station, empty stock)
  2. Pay: with Start wash the money is taken at once. Stay in the vehicle
  3. Wash: in a tunnel wash the vehicle is guided through the stations, in a gantry wash the gantry moves over the standing vehicle. The display shows program, station and time left
  4. Done: the dirt is gone; a wax program keeps the vehicle clean for the time shown
  5. Cancel: press X twice – no refund. If the car wash itself stops because of a fault, the customer gets money back (all of it if less than half had run, otherwise half)

The server decides prices, duration, completion, wax and permissions and checks every call (place, state, time, rate limit).

Self-service bay: choose 1 to 5 minutes ($15 per minute), take the spray gun, hold the left mouse button to spray. The vehicle only gets cleaner while the jet hits it. Vacuum spot: vacuuming yourself costs $10; interior cleaning ($60) and hand polish ($120) are done by an employee – if nobody takes the job in time, the customer gets the money back.

Running a business

  • Business account: every wash, self-service minute, vacuum use and service is booked to it; wages, supplies and the technician are paid from it. Daily report and ledger on the tablet
  • Prices: the owner sets every price between 50 % and 130 % of the base price (upgrades raise the upper limit). NPC customers react to it
  • Stock: water comes by tanker, canisters and spare parts are picked up at the wholesaler (a paid task) or delivered from level 7 with a 20 % surcharge. An empty tank disables the programs that need it
  • Wear: every wash wears down the stations it uses. Below 50 % condition a wash can stop with a fault, below 5 % the station is out of order. Staff services the station, or a technician ($400) repairs it
  • Staff: 2 staff slots at the start, up to 12 with upgrades. Commission (default 15 %), task pay and shift pay come from the business account
  • Levels: every wash and every task earns the business XP. Some levels apply at once, others are upgrades bought from the business account; stations, spots and lanes then have to be built on site
  • Business exams: at level 30, 60 and 90 the team has to pass an exam – a list of exam tasks such as customer washes, hand work, fixed faults and business days
  • NPC customers only come while someone is on duty (default). The server calculates money and XP; the visible vehicle is presentation only

All values are defaults from the config. The tablet page Help and the files PLAYER-GUIDE.md (English) and SPIELER-ANLEITUNG.md (German) in the resource explain every task with the values of your server.

Webhooks

In config/server.lua ('' = off):

Key Contents
admin car washes created, changed, moved, removed; changes to ownership and business account
ownership purchase, sale, transfer, renaming by the owner
inactivity warnings and releases because of inactivity
milestones level 10, 20, … 100 and passed business exams
washes finished washes (optional, can be a lot)
security suspicious cases from the plausibility check

Framework bridge

bridge/server/*.lua provide money, name and groups per framework, bridge/server/inventory.lua connects the inventories for the optional items, bridge/client/target.lua connects ox_target / qb-target for the self-service bay, bridge/client/frameworks.lua the framework notification and bridge/client/dirt.lua your own dirt system. Without a framework the resource starts in standalone mode (red box in the console); money is then the ox_inventory item money. All bridges are open.

Commands and permissions

Command Who Function
/carwash everyone owners and staff: tablet of their own car wash · everyone else: waypoint to the nearest open car wash
/carwashduty staff start or end duty (only at the duty point of your own car wash)
/carwashadmin admin create, change, move and remove car washes; build mode; zone editor; ownership and inactivity; log; diagnostics
/cwdev admin test tool: inspect single parts, effects and sounds, print model dimensions, adjust effect direction and spray gun

All names can be changed in Config.Commands (empty text = off). There are no console commands.

Permissions

A player is an admin if one of these is true – checked on the server for every single call:

  • ACE permission pepper_carwash.admin (name in config/server.lua → ServerConfig.AdminAce) – the reliable way on every framework
  • a group from Config.AdminGroups (default admin, superadmin, god)
add_ace group.admin pepper_carwash.admin allow
add_ace identifier.license:YOUR_LICENSE pepper_carwash.admin allow

Inside a business the owner assigns 5 ranks (default names, can be renamed per car wash):

Rank From business level Adds
Helper 1 duty and tasks
Employee 1 pick up deliveries, refill
Shift lead 10 order supplies, call the technician, place decoration
Manager 25 prices, hiring, upgrades, build mode, finances
Deputy 60 manage staff, deposit and withdraw, ledger, settings

Only the owner can sell, transfer or rename the car wash.

Keys

Key Function
E interact: choose a program, self-service bay, points of the business, start a task
X cancel a wash (press twice), cancel a progress bar, hang the spray gun back
Left mouse button spray (self-service bay), hold in the mini-games
W A S D, space mini-games "Service the brushes" and "Refill chemicals"
ESC cancel a mini-game – the task stays open

"Interact" and "Cancel wash" are FiveM key bindings: every player can rebind them in the GTA settings under Key Bindings → FiveM, and the prompts show the player's key. Config.Interact.DefaultKey and Config.Wash.AbortDefaultKey are only the default for players who never loaded the resource before.

In the guided setup, press R to aim yourself instead of taking the suggestion (Config.Build.AimKey, control ID 45).

Exports and events

-- server
exports.pepper_carwash:getWashes()
exports.pepper_carwash:getWash(id)
exports.pepper_carwash:getWashOf(src)                 -- { id, label, owner, grade }
exports.pepper_carwash:isOnDuty(src)
exports.pepper_carwash:addBalance(washId, amount, info)
exports.pepper_carwash:addXp(washId, amount, reason)  -- returns the XP credited
exports.pepper_carwash:hasWax(plate)                  -- expiry time or false
exports.pepper_carwash:setWax(plate, minutes)
exports.pepper_carwash:removeWax(plate)

-- client
exports.pepper_carwash:isWashing()
exports.pepper_carwash:nearestWash()
exports.pepper_carwash:openTablet()

Server events (listen with AddEventHandler, not RegisterNetEvent): pepper_carwash:washed, pepper_carwash:renamed, pepper_carwash:ownerChanged, pepper_carwash:levelUp, pepper_carwash:examPassed.

FAQ

The resource does not start, the console names a missing dependency.

oxmysql must start before pepper_carwash, OneSync must be on and the server build must be 7290 or newer.

The console shows a red box "standalone mode".

No framework detected: start es_extended, qb-core or qbx_core before pepper_carwash or set Config.Framework explicitly.

"Pepper Carwash is still starting" does not go away.

The server start did not finish: the database is unreachable (check mysql_connection_string) or the user may not create tables. Then import install/pepper_carwash.sql.

Do I need to import the SQL file?

No. The eleven tables pepper_carwash_* are created automatically on start. You only need install/pepper_carwash.sql without CREATE rights.

/carwashadmin says "You do not have permission to do that."

Add add_ace group.admin pepper_carwash.admin allow to your server.cfg and restart the server.

/carwash does something unexpected.

A second script (e.g. esx_carwash, qbx_carwash) uses the command. Stop it or change Config.Commands.Main.

Do I need an MLO or addon models?

No. Every part is a prop that ships with the game. You can swap any model in config/parts.lua, for example for props of a map pack running on your server.

Does it need ox_lib, a target script or an inventory?

No. The only dependency is oxmysql. ox_target / qb-target and an inventory are optional and detected automatically.

Does it work with the car washes of the game or with my MLO?

Yes, use Zones: you mark entrance, wash line and exit, and no props are placed.

A part looks wrong, floats or sinks.

First check /carwashadmin → Diagnostics → model measurement, otherwise press Measure again. Then swap the model or zOffset in config/parts.lua, or rotate the part in build mode. /cwdev → Inspect a part shows model and dimensions.

The vehicle drives badly through the tunnel wash.

Set Config.Wash.Guide to 'speed' or 'conveyor'. If a vehicle is rejected as "too large", adjust Config.Wash.MaxVehicle.

NPC vehicles get stuck.

Config.Npc.Visible = false: the business then runs entirely without visible vehicles, customers still count as bookings.

No sound during the wash.

Config.Effects.Sounds = 'nui' forces the sounds of the interface.

An effect is not visible or sprays in the wrong direction.

/cwdev → Test an effect or Adjust effect direction, then enter the candidates or the noted values (rot = { x, y, z }) in config/programs.lua.

Office, duty or storage point is inside a wall.

/carwashadmin → car wash → Set points.

The console says Items: … Lagerbetrieb ohne Items.

Not an error: no supported inventory is running or the items are not set up. The business then runs with counters in the stock.

Is there passive income?

Not by default: NPC customers only come while someone is on duty.

What happens to car washes of inactive owners?

Owners who have not been online for 30 days lose the car wash and the business account expires. Warnings go out 7, 3 and 1 day before. Config.Inactivity.Enabled = false turns the rule off.

What happens on a server restart?

Running washes end and are refunded according to the rule of the car wash. Car washes, business account, stock, levels and wax protection are stored in the database.

After the update, /carwashadmin says "Blueprint was updated".

An update changed a blueprint. Press "Reset all affected car washes" once; the script rebuilds nothing by itself (Config.World.AutoRebuild = 'ask').

How do I switch to English or change texts?

Config.Locale = 'en' in config/config.lua, the language applies to all players. Texts live in locales/de and locales/en.

Support

Discord → ticket (category "Script Support") at https://discord.gg/6NaFJWKDYu, link your purchase with /verify first.

Permanently tested on the Pepper Scripts dev server.

Changelog

Current version: 1.1.0 (2026-10-11). Prepared since then (not released yet): "aim yourself" in the guided setup is on R instead of H. All changes are listed in CHANGELOG.md in the resource.


Found a mistake? Report it on Discord.