You can change individual values in config.lua


If you see anything wrong and you would like to know more, for example to show in support ticket, you can set Config.Debug = true to see more debug info in client (F8) console ingame, or server console.


Most important thing to do after opening config, is to set your framework, otherwise script won't work correctly.

You can choose from these frameworks:


To add your own framework, you will need to make a framework integration, more here.


This option is purely for people who don't know how to implement their own framework and still want to use some key functions of this script.

However, these features won't work without making your own integration:

  • Anything money related

    • Players will be able to buy all tattoos for free

    • Adding money to business will always work even if player has 0 money

  • Anything job related

    • Job permitted tattoos, Business with society/job

    • Players will all have job unemployed

  • πŸ’Ό Business with job (society)

And this is how you set it in config:

Config.Framework = Frameworks.ESX

Tattoo Lists

In the Config.TattooLists you can check which tattoos will your server support and add your own. Listed files are located at assets/tattooLists/, or at path you set to Config.TattooListsPath.

Config.TattooLists = {
    "BaseTattoos.json",     -- Default GTA tattoos
    "AddonTattoos.json",    -- Addon tattoos
    "DLC_mpvinewood.json",  -- Old DLC - should be supported by default
    "DLC_mpheist3.json",    -- Old DLC - should be supported by default
    "DLC_mpheist4.json",    -- Gamebuild 2189 or higher
    "DLC_mpsecurity.json",  -- Gamebuild 2545 or higher

More info about Game builds here.

Tattoo shops

Config.Shops contains all tattoo shops in GTA that you can customize or add your own to.

All you need to create a tattoo shop is to provide it the location you want it at.

    pos = vector3(1323, -1652, 52.8),
    marker = Config.DefaultMarkerSettings

However you can customize it even more by changing the blip and marker settings


Blip (on map) can be hidden, if you don't want to show the tattoo shop on map, simply don't set blip for particular shop. Useful for gangs etc. To use default blip, set blip = Config.DefaultBlipSettings.

DefaultBlipSettings can be configured in the config too.

To set custom blip for an individual tattoo shop, you can write it like this:

{   -- Tattoo shop with custom blip
    pos = vector3(322.8, 180.8, 103.6),
    blip = {
        name = 'Ink shop',
        options = {
            color = 11,
    marker = Config.DefaultMarkerSettings


Markers are the floating texts/icons shown in-game to open the tattoo menu.

Same as blips, to use a default marker, simple set marker = Config.DefaultMarkerSettings.

To set a custom marker for an individual shop, you can write it like this:

{   -- Tattoo shop with custom marker
    pos = vector3(-1153, -1425, 5.3),
    blip = Config.DefaultBlipSettings,
    marker = {
        text = 'Click E',
        distance = 2

Preview shop

Preview shops are only for browsing tattoos, players can't buy tattoos there.

{   -- Preview for customer to choose from
    onlyPreview = true,
    pos = vector3(1863.5, 3750.9, 33),
    marker = {
        text = 'πŸ“–',
        distance = 3,

Only specific body part

This type of shop will display only menu for a specific body part. Main usage is for API to open the menu from anywhere and with specific body part, if needed.

  • body parts: head, body, left_arm, right_arm, left_leg, right_leg

{   -- Tattoo shop with only one specific body part menu
    specificPart = "right_arm",
    pos = vector3(324.2, 179.7, 103.6),
    marker = {
        text = 'πŸ’ͺ',
        distance = 3,

Tattoo file filter

In the Business Update we added new option to add a fileFilter to each shop you set up. But what is it really?

If you take a look at Config.TattooLists, you will see all files that you load your tattoos from. Well now you will be able to add a tattoo file only for certain shop meaning you can have a shop dedicated to only certain tattoos! How? Let's see!

The file also needs to stay in Config.TattooLists to load properly!

{   -- Tattoo shop with only one specific body part menu
    pos = vector3(324.2, 179.7, 103.6),
    blip = {
        name = 'Movie Tattoos',
    marker = Config.DefaultMarkerSettings,
    fileFilter = {

Job restricted shop

There is also an option for a shop to be only accessible with certain job (and grade). If you want a shop to be only visible for certain jobs, use visibleForJobs for the particular shop.

  • You can restrict it for as many jobs as you need, see example.

  • You can also enable it only from certain job grade (see police job in example), if no grade is set, it will be available for all job grades.

  • The functionality is exactly the same as Tattoo Permissions


    pos = vector3(-3170.1, 1076.2, 20.8),
    blip = Config.DefaultBlipSettings,
    marker = Config.DefaultMarkerSettings,
    visibleForJobs = {
            name = 'police',
            grade = 1, -- available only from grade 1 and up
            name = 'taxi',

Special functions

Henna tattoos

You can set the henna tattoo duration (the time until tattoo dissapears, if henna is used for it) at Config.HennaTattooDuration. Default is 2 (real-life days).

Same as in opacity, you can set additional price for henna tattoo Config.HennaAdditionalPrice.

Animation and teleport

  • Config.EnableShopEnterAnimation and Config.ForcePlayerShopPosition

  • possible values: true/false


  • Both true - Player will walk to certain shop coordinates and take of his clothes with an animation. (✨fancy animations✨)

  • Only EnableShopEnterAnimation - Player will stay at the place they open the shop at and take of clothes with an animation.

  • Only ForcePlayerShopPosition - Player will be teleported exactly at the shop position set in config and take off their clothes immediately without playing animation (fastest way, but players will be stacked in one spot)

  • Both false - Player will stay at the place they open the shop and take off their clothes immediately without animation (fastest and good for more players at one shop)

Naked part ID

If the player doesn't have only underwear after entering the shop, you can change the default "naked" body part IDs at Config.NakedPartsIds.

Payment types

In Config.MoneyAccountTypes you can determine which accounts should the script check when buying a tattoo.

  • accounts will be checked in the order you write them

  • Example: Config.MoneyAccountTypes = {"cash", "dirty_money", "bank"} - cash will be checked first, then dirty_money etc...

Price Multiplier

Config.PriceMultiplier = 1.0

You can simply adjust price of all tattoos by changing this multiplier, deafult = 1.0 (=no price change)

Example: All tattoos with price 300 will cost 600 if PriceMultiplier is set to 2.0 (2x)

Disable tattoo removal

Config.DisableTattooRemoval = false

If true, players won't be able to remove their tattoos in the shop (remove button won't be visible). Can be used for example for roleplay where doctors remove tattoos.

❗ Experimental

Here you can find adjustable values for config, that are not there by default, but can be set by you, if needed. This category exists mostly for developers who know what they are doing and what those values mean.

If you change these values and something stops working, be sure to check what you set, before seeking support :)

If you want to edit any of those values, go to config.lua and add them at the very last line of the file.

  • Config.PPIDCheckTime - value in miliseconds, default is 3000 (= 3 sec)

    • there is a loop to check for change of player model id (e.g. while logging in and changing ped in skin changer) and applying their tattoos

    • this value changes how often is the loop called, it is made editable if you want to change the loop waiting time for any reason

  • Config.JobReloadDelay - value in miliseconds (e.g. 3000 = 3sec)

    • if defined, player job and markers will be reloaded after set delay

    • can be used if some scripts load player later and you need to restart script to show business bossmenu markers

  • Opacity

    You can set the default opacity ranging from 1 to 5 at Config.DefaultOpacity, default is 1. Further more, you can set an additional price for each opacity level Config.OpacityAdditionalPrice

    If you set for example Config.OpacityAdditionalPrice = 100, tattoo costing $500 will cost $800 if player sets opacity to 3. (+3 * 100)


You may have noticed file config_events.lua. This file is used only in case our script has some errors regarding ESX/QBCore events.

Some servers tend to rename crucial scripts to their server name, for example esx_society to kitty_society, which then causes many errors in all scripts that rely on the name esx_society. Don't do this please, it takes credit from authors of those scripts and it just looks dumb.

If for any reason you did this to any script our script depends on (esx framework, qbcore framework, qbcore bossmenu..), take a look into file mentioned above and read instructions in there to configure event names.

Example: Let's say you renamed esx:setJob to kitty:setWork, but our script has no clue you did that, as we can't access your server files. You will have to go to config_events.lua and rename the event there like this:

Config.Events = {
    ... -- some other events here
    ["esx:setJob"] = "kitty:setWork",

Last updated