> For the complete documentation index, see [llms.txt](https://code-after-sex.gitbook.io/script-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://code-after-sex.gitbook.io/script-documentation/vip-shop/configuration/catalog.md).

# Catalog & Deliveries

`Config.Catalog` defines every coin priced product. Real money products (coin packs, memberships) are not listed here; they come from Tebex.

## Product shape

```lua
{
    id = 'wpn-schofield',            -- unique, stable id
    category = 'weapons',            -- hot | weapons | cash | horses | passes | packages
    name = 'Schofield Revolver',
    desc = 'Break-action classic with real stopping power.',
    price = 1099,                    -- coins
    oldPrice = 1399,                 -- optional: struck-through price
    stamp = 'popular',               -- optional: sale | bestvalue | popular | new | limitedstock | soldout | owned
    image = '/img/wpnimg_schofield.webp',
    icon = '/assets/items/....webp', -- optional: white game icon instead of a photo
    cover = true,                    -- optional: image fills the card edge to edge
    features = { 'A', 'B' },         -- optional: tick list in the purchase dialog
    stats = {                        -- optional: stat bars (weapons and horses pages)
        { label = 'Power', value = 65 },
    },
    stackable = true,                -- optional: enables the quantity selector (max 25)
    delivery = { ... },              -- what the player actually receives
}
```

## Delivery actions

A product's `delivery` is a list of actions, all executed per purchased unit:

| Action   | Example                                                                                | Notes                                                                                                                         |
| -------- | -------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| item     | `{ type = 'item', vorp = 'bread', rsg = 'bread', count = 5 }`                          | Dual naming; the right name is picked per framework. A plain `item = 'bread'` string also works.                              |
| weapon   | `{ type = 'weapon', weapon = 'WEAPON_REVOLVER_CATTLEMAN' }`                            | Real RDR2 weapon hashes. Uses `createWeapon` on VORP; on RSG the lowercase hash is given as an item.                          |
| ammo     | `{ type = 'ammo', vorp = 'AMMO_REVOLVER_NORMAL', rsg = 'ammo_revolver', count = 100 }` | Bullets API on VORP, ammo item on RSG.                                                                                        |
| cash     | `{ type = 'cash', amount = 500 }`                                                      | In game dollars.                                                                                                              |
| gold     | `{ type = 'gold', amount = 25 }`                                                       | VORP gold; RSG uses `bloodmoney` with a cash fallback.                                                                        |
| horse    | `{ type = 'horse', model = 'A_C_Horse_Arabian_White', name = 'White Arabian' }`        | Written directly into the stable database. See [Horses and Stables](/script-documentation/vip-shop/configuration/stables.md). |
| coins    | `{ type = 'coins', amount = 100 }`                                                     | VIP coin cashback or bonus.                                                                                                   |
| order    | `{ type = 'order', order = 'custom_outfit' }`                                          | Files a commission. See [The Order Book](/script-documentation/vip-shop/guides/orders.md).                                    |
| charslot | `{ type = 'charslot' }`                                                                | VORP: a real `users.char + 1`. RSG: falls back to an order.                                                                   |
| command  | `{ type = 'command', command = 'mycmd %s' }`                                           | Runs a console command, `%s` is the server id.                                                                                |
| event    | `{ type = 'event', name = 'my:event', args = {...} }`                                  | Fires `TriggerEvent(name, source, args)` for custom integrations.                                                             |

## Safety rails, built in

* **Capacity check.** Before any coins are taken, item and weapon deliveries are tested against inventory space (`canCarryItem` and `canCarryWeapons` on VORP, `CanAddItem` on RSG). If it will not fit, the player is told that no coins were taken.
* **Atomic charging.** The balance deduction is a conditional SQL update; two simultaneous purchases can never drive a wallet negative.
* **Server authority.** Product ids and quantities come from the client, but prices, discounts and deliveries are always resolved from `Config.Catalog` on the server.

{% hint style="warning" %}
Verify item names before launch. The shipped names (`bread`, `water`, `bandage`, `medkit`, `AMMO_*` and so on) are common VORP and RSG defaults, but every server's items database differs. Buy one Provisions Crate on your test server and confirm the items arrive.
{% endhint %}

## Stat bars

Products in `weapons` (Power, Range, Handling) and `horses` (Speed, Stamina, Nerve) render `stats` as brush stroke bars. Values are 0 to 100 and purely cosmetic; tune them to match your server's balance philosophy.
