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
- Download the resource from the Cfx.re Portal (Granted Assets)
- Extract to
resources/[pepper]/pepper_carwash– do not rename - Check
config/config.lua(language, currency, prices),config/server.luafor webhooks - Add to your
server.cfgafter 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
- Database: the eleven tables (
pepper_carwash_*) are created automatically on start. Without CREATE permission importinstall/pepper_carwash.sqlfirst - Start the server – the console shows a green line
Pepper Carwash 1.1.0 started (…) - 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
/carwashadmin→ tab New → Guided setup, choose the status State-run.- With Quick setup, place entrance, start and end of the wash lane and exit, then save.
- Stop at the entrance with a dirty vehicle, press E, choose a program and Start wash.
- Stay in the vehicle until the wash is done: the dirt is gone.
/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
- Drive up: stop at the entrance, press
Eand choose a program and extras. Locked programs state the reason (level, missing station, empty stock) - Pay: with Start wash the money is taken at once. Stay in the vehicle
- 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
- Done: the dirt is gone; a wax program keeps the vehicle clean for the time shown
- Cancel: press
Xtwice – 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 inconfig/server.lua→ServerConfig.AdminAce) – the reliable way on every framework - a group from
Config.AdminGroups(defaultadmin,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.