Before You Begin#
Before installing Dog Walker Job, make sure your server meets the minimum requirements. Only two resources are mandatory; everything else is optional and only used when it is running.
Requirement | Status | Notes |
|---|---|---|
| Required | Database access. The tables are created on the first start. |
| Required | Callbacks, and the scheduler that refreshes and resets the leaderboard. |
Framework | Optional |
|
Target | Optional |
|
| Optional | Draws the floating prompts when |
| Optional | Only for its quest system ( |
| Optional | When it is running, walk payouts go through it instead of the player's cash. |
Downloading Dog Walker Job#
After purchasing Dog Walker Job, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Dog Walker Job. Signed in with any other account, the asset does not appear.
After extracting the download, you should have the following folder:
qs-dogwalker/
├── config/ -- config.lua and translations.lua: what you edit
├── client/framework/ -- ESX and QBCore bridges (editable)
├── server/framework/ -- ESX, QBCore and standalone bridges (editable)
├── client/target.lua -- ox_target / qb-target options (editable)
├── server/missions.lua -- qs-inventory quests (editable)
├── assets/dogs/ -- the pictures on the dog cards
├── web/build/ -- the interface, ready to use
└── qs-dog-walker.sql -- optional: the same schema the script creates itselfThe folder must be named
qs-dogwalker. Every event the interface and the client rely on carries that name, so the script refuses to run under any other: a renamed copy prints You have renamed the script! and then deliberately freezes the server.
Installing the Resource#
Move the qs-dogwalker folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-dogwalker/Once copied, open your server.cfg and make sure every dependency — and everything it should detect — starts before Dog Walker Job:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Optional
ensure ox_target
# ensure qs-textui
# ensure qs-inventory
# ensure qs-job-management
ensure qs-dogwalkerThe loading order matters. The framework is detected by looking for a resource that is already started, so a framework that starts after Dog Walker Job is not found and the job falls back to standalone — no job check and no money.
The Database#
There is no SQL file to import. Dog Walker Job creates its own tables on the first start, and on every start after that it checks them and adds anything an older install is missing.
Table | Holds |
|---|---|
| One row per character: level, experience toward the next level, and the all-time, season and daily experience and earnings the leaderboard ranks by. |
| A single control row recording when the daily and season boards last reset, so a restart can never pay a board twice. |
| Leaderboard rewards banked for winners who were offline at the reset. Paid, then deleted, the next time they load in. |
| The last top three of each board, shown as Last winner in the Statistics view. |
It also lines up the collation of its identifier columns with your framework's users or players table. On MariaDB 11.4 and newer the two differ out of the box, and without this the leaderboard fails with Illegal mix of collations.
Registering the job#
With Config.RequireJob on (the default), only players holding a job listed in Config.DogWalkerJob can walk dogs. The default job is dog_walker.
Nothing to do. On the first start the job is written to jobs with a grade 0 Novice in job_grades — for every job in Config.DogWalkerJob, and only when it does not exist yet.
To prepare the database by hand instead, import qs-dog-walker.sql from the resource folder. Every statement in it is IF NOT EXISTS or INSERT IGNORE, so it is safe to run twice.
INSERT IGNORE INTO `jobs` (name, label) VALUES
('dog_walker','Dog Walker');
INSERT IGNORE INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
('dog_walker',0,'novice','Novice',10,'{}','{}');QBCore keeps its jobs in a file, not in the database, so add the job to qb-core/shared/jobs.lua:
['dog_walker'] = {
label = 'Dog Walker',
defaultDuty = true,
offDutyPay = false,
grades = {
['0'] = { name = 'Novice', payment = 10 },
},
},Qbox also keeps its jobs in a file. Add the job to qbx_core/shared/jobs.lua:
['dog_walker'] = {
label = 'Dog Walker',
defaultDuty = true,
offDutyPay = false,
grades = {
[0] = { name = 'Novice', payment = 10 },
},
},Would rather let anyone walk dogs? Set Config.RequireJob = false and skip this step.
Updating from an older version? Replace the whole folder — the old
html/folder no longer exists — and start the server. Levels and experience are kept, and the leaderboard columns an olderqs_dog_walkertable never had are added automatically.
Configuring the Resource#
Everything is configured in files that are left open for you to edit:
File | Contents |
|---|---|
| Who can work, how players interact, notifications, blips, the owners and their dogs, the walk rules, dog care, walking off the leash, the leaderboard, levels, the marker, debug and Discord webhooks. |
| The language selector and every line of text, in eleven languages. |
| The bridges to ESX, QBCore and standalone: identifiers, jobs, names and money. |
| The ox_target and qb-target options on owners, dogs and poop. |
| The qs-inventory quests. |
The values worth reviewing first:
-- config/translations.lua
Config.Language = "en" -- en, es, it, fr, pt, de, ru, tr, nl, cn, zh-tw
-- config/config.lua
Config.RequireJob = true -- false lets anyone walk dogs
Config.DogWalkerJob = { -- jobs allowed to walk dogs
['dog_walker'] = true,
}
Config.Target = false -- true = third-eye targeting, false = press a key nearby
Config.TargetScript = "ox" -- "ox" or "qb"
Config.CurrencyPosition = "suffix" -- "prefix" → $500, "suffix" → 500 $
Config.Debug = false -- explains every step in both consoles
config/config.luais the single source of truth. A dog's pay, experience and level requirement are read from it on the server when the walk is paid, so editing them there — and restarting the resource — is all a change takes.
Verifying the Installation#
Restart your server and read the console. A clean install is quiet; these lines are the ones you may see, and all of them are good news:
[qs-dogwalker] Registered the ESX job "dog_walker" -- ESX, first start
[qs-dogwalker] Added missing column qs_dog_walker.total_experience -- updating an older install
[qs-dogwalker] aligned 4 identifier column(s) to utf8mb4_uca1400_ai_ci, matching users.identifierThen join your server and walk your first dog:
Get the job
Give your character the
dog_walkerjob —/setjob <id> dog_walker 0on ESX and QBCore — or turnConfig.RequireJoboff. The dog blips appear the moment you hold the job.Find an owner
The owners stand at their doors around Mirror Park, each with a blip and a blue marker floating over their head. Walk up and press
E— or third-eye them if you use a target.Walk Rocky
Rocky is a two-minute walk at level 1. Press Start walk, keep moving until the timer reaches zero, go back to his owner and press Return dog. From there, Usage covers everything a walk can do.
Something not working? Set
Config.Debug = true: the server console and the F8 console then explain what the script is doing, including exactly why a walk ended. Turn it off again on a live server — it prints a lot.



