> For the complete documentation index, see [llms.txt](https://visionstore.gitbook.io/visionstore-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://visionstore.gitbook.io/visionstore-docs/scripts/advanced-clothing/configuration/prices-and-payment.md).

# Prices and payment

Clothing prices, item overrides, job discounts, tax, cash / bank, ownership and the barber, tattoo and surgeon price profiles.

{% hint style="info" %}
Prices shown in the interface are for display only. The **server recalculates every total** at checkout with the same pricing code, so players can't change what they pay.
{% endhint %}

## Clothing prices

`config/prices.lua`. One base price per clothing category:

```lua
Config.Prices = {
    tops        = 65,
    undershirts = 39,
    torso       = 0,      -- arms / torso follow the top automatically, so they are free by default
    bottoms     = 55,
    footwear    = 45.75,
    bags        = 75,
    armor       = 100,
    decals      = 15,
    neckwear    = 30,
    masks       = 29.25,
    hats        = 26,
    glasses     = 35,
    earrings    = 30,
    watches     = 45,
    bracelets   = 30,
}
```

A category with no entry costs `Config.DefaultPrice` (`65`, in `config/config.lua`).

### Per-item overrides

Price one specific item. Keys are item keys: `"c:<component>:<drawable>"` for clothing and `"p:<prop>:<drawable>"` for props (hats, glasses, watches...). A `male` / `female` table wins over the global entry for that gender.

```lua
Config.ItemPrices = {
    ["c:11:15"] = 0,    -- "no top"
    ["c:8:15"]  = 0,    -- "no undershirt"
    ["c:3:15"]  = 0,    -- bare arms
    ["c:4:21"]  = 0,    -- underwear
    male = {
    },
    female = {
        ["c:11:15"] = 0,
        ["c:8:14"]  = 0,
        ["c:3:15"]  = 0,
    },
}
```

Use overrides to make "nothing" items free or to price a premium item, for example `["p:6:12"] = 900`.

### Job discounts

Ships empty. Add a fraction between 0 and 1 per framework job name:

```lua
Config.JobDiscounts = {
    police = 0.25,   -- 25 % off
}
```

### How a clothing price is calculated

1. Free session (admin, event, wardrobes) or a shop with `free = true`: **0**.
2. Ownership on and the item is owned: **0**.
3. Taking something off (no hat, no mask...) is never charged.
4. The item override, else the category price, else `Config.DefaultPrice`.
5. × the shop's `priceMultiplier`.
6. × (1 − the job discount).
7. Rounded to 2 decimals.
8. Tax on the cart subtotal (see below).

The cart only charges what actually changed, holds at most one item per slot and at most 24 items.

## Tax

`config/config.lua`:

```lua
Config.Tax = {
    enabled = true,
    percent = 8.25,
    display = "suffix",        -- "suffix" => "$225 + TAX"  |  "included" => "$243.56"
    roundToWhole = true,       -- ceil the final total to a whole currency unit (keep true on ESX/qbx: their money functions round)
}
```

| Option         | What it does                                                                                  |
| -------------- | --------------------------------------------------------------------------------------------- |
| `enabled`      | Apply sales tax. A shop with `tax = false` skips it.                                          |
| `percent`      | Tax percentage (`8.25` = 8.25 %).                                                             |
| `display`      | `"suffix"` shows `$140.75 + TAX` on the TOTAL COST strip; `"included"` shows the final total. |
| `roundToWhole` | Round the final total **up** to a whole unit and adjust the tax. Keep `true` on ESX and Qbox. |

Tax examples (8.25 %, `roundToWhole = true`):

| Shop                               | Cart                               | Subtotal | Tax    | Total |
| ---------------------------------- | ---------------------------------- | -------- | ------ | ----- |
| Sub Urban (×1.0)                   | top 65 + shoes 45.75 + neckwear 30 | $140.75  | $12.25 | $153  |
| Binco (×0.8)                       | top 65                             | $52      | $5     | $57   |
| Ponsonbys (×2.5)                   | top 65                             | $162.50  | $13.50 | $176  |
| Binco, police with a 25 % discount | top 65                             | $39      | $4     | $43   |
| Any shop with `tax = false`        | top 65                             | $65      | $0     | $65   |

## Paying

```lua
Config.Payment = {
    order = { "cash", "bank" },   -- accounts tried in order ("cash-then-bank"). Use { "bank" } for bank only.
    allowChoice = false,          -- true => UI shows a CASH / BANK selector before confirming
}

Config.FreeTextureChanges = false  -- true => changing only the texture of an item you already wear is free
Config.FreeShopLabel = "FREE"      -- shown instead of $0 in free modes
```

| Option                | What it does                                                                       |
| --------------------- | ---------------------------------------------------------------------------------- |
| `Payment.order`       | Accounts tried in order. The first one that covers the **whole** total pays.       |
| `Payment.allowChoice` | Show a CASH / BANK selector. Only the chosen account is tried.                     |
| `FreeTextureChanges`  | Changing only the colour (texture) of the item worn when the store opened is free. |
| `FreeShopLabel`       | Shown on the TOTAL COST strip instead of `$0` in free modes.                       |

`cash` and `bank` map to your framework's accounts: `cash` / `bank` on QBCore and Qbox, `money` / `bank` on ESX, the ox\_inventory `money` item and the character account on ox\_core.

## Clothing ownership (optional)

```lua
Config.Ownership = {
    enabled = false,
    ownedAreFree = true,
}
```

With `enabled = true`, purchased items are remembered per character. With `ownedAreFree`, an item a character already bought costs nothing in every shop. Owned items carry an **OWNED** badge, and the **OWNED** filter in the item grid lists them.

## Barber, tattoo and surgeon prices

Appearance services don't use the clothing cart. They use a **pricing profile**, set in `config/sections.lua`:

```lua
Config.PricingProfiles = {
    clothing = { kind = "items" },
    tattoos  = { kind = "tattoos", price = 100, removal = 0, overrides = { --[[ ["TAT_AR_000"] = 250 ]] } },
    barber   = { kind = "changes", prices = { hair = 50, beard = 25, eyebrows = 25, overlays = 25 } },
    surgery  = { kind = "changes", flat = 500 },
    cosmetic = { kind = "changes", prices = { face_adjustments = 150, face_body = 250, overlays = 50 } },
}
```

| Kind      | Charges                                           | Fields                                                                                                   |
| --------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `items`   | The clothing cart (everything above on this page) | None                                                                                                     |
| `changes` | Each thing that changed since the menu opened     | `prices = { key = price }`, or `flat = 500` to charge once for any change                                |
| `tattoos` | Each added tattoo, plus removals                  | `price` per tattoo, `removal` per removed tattoo, `overrides = { ["TAT_AR_000"] = 250 }` per tattoo name |

Change keys for `prices`: `hair`, `face_adjustments`, `face_body`, any overlay id (`beard`, `eyebrows`, `makeUp`, `blush`, `blemishes`, `ageing`, `complexion`, `sunDamage`, `lipstick`, `moleAndFreckles`, `chestHair`, `bodyBlemishes`) and `overlays`, used for any overlay without its own price.

Per shop you can also override (see [Shops and locations](/visionstore-docs/scripts/advanced-clothing/configuration/shops-and-locations.md)):

* `price = 750`: one flat charge for any change made there.
* `tattooPrice = 250`: one price for every tattoo applied there.
* `priceMultiplier`: multiplies every line, like for clothing.
* `tax = false`: no tax there. Otherwise `Config.Tax` applies to every profile.
* `pricingProfile = false`: charge nothing there.

The player sees an itemised **TOTAL COST** strip (HAIRCUT, FACIAL HAIR, TATTOO...) before confirming.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://visionstore.gitbook.io/visionstore-docs/scripts/advanced-clothing/configuration/prices-and-payment.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
