Documentation Welcome

Welcome to devCon Docs

Everything you need to know about using our products - from finding your purchases to configuring scripts for your server.

Popular scripts

Jump straight to the documentation for our most popular products:

Getting Started Where to find products

Where are my products?

After your purchase, all products are delivered automatically to your FiveM Portal account. Here's exactly where to find them.

Good to know

You don't need to download anything manually. When you complete a purchase, Tebex automatically links the product to your FiveM (Cfx.re) account.

Step 1 - Complete your purchase

When you check out, Tebex will ask for your FiveM username or license. Make sure you enter it correctly - this is what links the product to your account.

Step 2 - Log in to FiveM Portal

Once payment is confirmed, go to portal.cfx.re and log in with the FiveM account you used during checkout.

Step 3 - Open Granted Assets

In the sidebar of the Portal, navigate to Granted Assets. Your purchased devCon products appear here instantly.

Don't see your product?

If the asset doesn't appear within 5 minutes after purchase, open a support ticket on our Discord with your order ID. We'll resolve it for you immediately.

Step 4 - Install on your server

Link the asset to your server via the Portal's Server Keys section. Once linked, the script becomes available as a regular resource in your server files.

Getting Started FiveM Portal

FiveM Portal Guide

The FiveM Portal is Cfx.re's official platform for managing your purchased assets. This guide walks you through every feature you need.

What is the Portal?

The FiveM Portal (portal.cfx.re) is where Cfx.re stores and delivers all digital assets you own. Anything purchased through Tebex that uses Escrow appears here.

Logging in

  1. 1

    Visit the Portal

    Go to portal.cfx.re in your browser.

  2. 2

    Sign in with Cfx.re

    Use the same FiveM account you use to play - this is also your Cfx.re account.

  3. 3

    Navigate to "Granted Assets"

    In the left sidebar you'll find all products you own, including those purchased from devCon.

Linking assets to your server

To use a script on your server, you need to link it to a Server Key:

  1. 1

    Create a Server Key

    In the Portal under "Server Keys", create a new key for your server. Give it a name you'll recognize.

  2. 2

    Link the asset

    Open the asset under "Granted Assets" and click Link to Server. Choose your Server Key.

  3. 3

    Add the key to server.cfg

    Copy the generated key and add it to your server.cfg:

server.cfg
sv_licenseKey YOUR_KEY_HERE
Getting Started Asset Escrow

How Asset Escrow works

All devCon scripts use Cfx.re Asset Escrow - Rockstar's official protection system for FiveM resources. It keeps the script safe from piracy while giving you everything you need to run and customize it.

What is Escrow?

Escrow is an encryption system provided by Cfx.re (the company behind FiveM). When an asset is escrowed, parts of its source code are encrypted on Cfx.re's servers. Your server decrypts them on startup using your Server Key, so the script runs normally - but the actual source code stays unreadable on disk.

This means the script cannot be copied, resold, or leaked. At the same time, every part that affects gameplay on your server stays fully open, so you can configure and extend the script however you want.

What's open, what's encrypted

Area Status What it means for you
Core Logic Encrypted Internal implementation - stays protected so it can't be copied.
Config Files Open Every gameplay parameter - items, timers, blips, prices - fully editable.
Framework Bridges Open ESX / QBCore / Standalone adapters - modify them to match your setup.
Locale Strings Open Translate every text in the script to any language you need.
UI / NUI Files Open HTML / CSS / JS for all menus - restyle the interface to fit your server.

What can I customize?

Everything that affects gameplay is exposed in open config files. You can change:

  • Blip sprites, colors, labels and visibility rules
  • Timers, cooldowns, update intervals
  • Item names, labels, weights and inventory integration
  • Notification functions - plug in your own notification system (ox_lib, okokNotify, custom)
  • Framework behavior - ESX, QBCore or your own implementation via the bridge
  • Every UI color, animation and layout in the NUI files
  • Every text string via locale files - full i18n support

Need a new config option?

If there's a gameplay behavior you want to customize that isn't in the config yet, let us know on Discord. We regularly expose new options based on community feedback - often in the next update.

Getting Started Getting Support

How to get support

Every devCon purchase includes dedicated support. Here's the fastest way to get help.

Discord (recommended)

Join our Discord and open a support ticket. This is the fastest way to get help - we usually respond within minutes.

Join Discord

What to include in your ticket

To get help faster, include the following information:

  • Your Tebex order ID or transaction email
  • The product name and version
  • Your server framework (ESX, QBCore, or Standalone)
  • A clear description of the issue
  • Any relevant server console logs (txAdmin or F8)

Response times

ChannelTypical response
Discord TicketWithin 10 minutes (business hours)
Discord DMNot recommended - use tickets
EmailWithin 24 hours
devCon_vipcheck Installation

devCon_vipcheck - Installation

Complete VIP tier management with automatic expiration, console commands and a clean API. Works out of the box with ESX Legacy and QBCore.

Dependencies

Requires either es_extended or qb-core running on your server. Framework is auto-detected at startup.

1. Download from Portal

Download devCon_vipcheck from your FiveM Portal under Granted Assets.

2. Extract to resources

Unpack the archive into resources/[devcon]/devCon_vipcheck.

3. Add to server.cfg

Start devCon_vipcheck after your framework (es_extended or qb-core). If you use esx_basicneeds or other scripts that should react to VIP status, start vipcheck before them.

server.cfg
# Framework first
ensure es_extended

# VIP system
ensure devCon_vipcheck

# Scripts that depend on VIP status
ensure esx_basicneeds

4. Grant ACE permission

To use console commands (vip_add, vip_remove, etc.) you need the vipcheck.admin ACE permission. Grant it to your admin group:

server.cfg
add_ace group.admin vipcheck.admin allow

5. Restart & verify

Restart your server. You should see in the console:

[devCon_vipcheck] Framework: esx
[devCon_vipcheck] Neue VIP-Datei erstellt.
[devCon_vipcheck] Gestartet! Befehle: vip_add, vip_remove, vip_info, vip_list, vip_cleanup
devCon_vipcheck Configuration

devCon_vipcheck - Configuration

All configurable options live in config.lua. The file is escrow-ignored, so you can edit it without breaking the script.

Core Settings

The main settings that control how the script behaves:

Option Type Default Description
Config.Frameworkstring"auto"Framework mode: "auto", "esx", "qbcore"
Config.DebugbooleantrueLogs all connects, VIP-checks, exports and commands to the server console
Config.DataFilestring"data/vips.json"Path to the JSON file that stores all VIPs (relative to resource folder)
Config.AcePermissionstring"vipcheck.admin"ACE permission required for console commands
Config.IdentifierTypestring"license"Which identifier to store: license, steam, discord, fivem
Config.NotifyTitlestring"VIP"Title shown in all notifications
Config.NotifyDurationnumber5000Notification duration in milliseconds
Config.ExpiredCheckIntervalnumber3600000Interval (ms) between automatic expiration checks. Default = 1h
Config.CleanupOnStartbooleantrueAutomatically remove expired VIPs when the script starts

VIP Tiers

Define your own tier hierarchy. Each tier has a label (shown to players) and a priority (higher = more access). You can rename, add or remove tiers - exports are generated dynamically from this table.

config.lua
Config.VIPTiers = {
    ['silber'] = { label = 'Silber', priority = 1 },
    ['gold']   = { label = 'Gold',   priority = 2 },
    ['platin'] = { label = 'Platin', priority = 3 },
}

Priority matters

When checking HasVIPTier(id, 'gold'), the script compares priorities. A player with platin (priority 3) will pass because 3 >= 2. This lets you build permission hierarchies without if-chains.

Messages

All player-facing notifications can be customized. %s placeholders are replaced with tier label and remaining time respectively.

config.lua
Config.Messages = {
    ['vip_welcome']  = 'Dein VIP-Status: %s (läuft ab in: %s)',
    ['vip_expired']  = 'Dein VIP-Status (%s) ist abgelaufen',
    ['vip_granted']  = 'Du hast %s erhalten (läuft ab in: %s)',
    ['vip_removed']  = 'Dein VIP-Status wurde entfernt',
}

Custom Notify Handler

The Config.ServerNotify function controls how notifications are sent. By default it uses QBCore:Notify for QBCore servers and fare_hud:pushNotify for ESX. You can replace this with your own notification system:

config.lua
Config.ServerNotify = function(targetSource, title, message, type, duration)
    -- Example: use ox_lib
    TriggerClientEvent('ox_lib:notify', targetSource, {
        title = title,
        description = message,
        type = type,
        duration = duration,
    })
end
devCon_vipcheck Commands

Console Commands

All commands can be executed from the server console or by players with the vipcheck.admin ACE permission. Duration accepts 30d (days), 12h (hours), 45m (minutes) or permanent.

vip_add

Grant a VIP tier to a player. The target can be either a server ID (e.g. 5) or a full identifier (e.g. license:abc123...).

Syntax
vip_add <server_id|identifier> <tier> <duration>
Examples
# Grant Gold VIP for 30 days to player with server ID 5
vip_add 5 gold 30d

# Grant Platinum VIP permanently to a specific license
vip_add license:abc123def456 platin permanent

# 12 hours of Silber VIP
vip_add 12 silber 12h

vip_remove

Revoke VIP status from a player immediately.

Syntax
vip_remove <server_id|identifier>

vip_info

Show detailed VIP info for a player: tier, status, remaining time, who granted it and when.

Example output
[devCon_vipcheck] === VIP INFO ===
  Identifier:   license:abc123def456
  Stufe:        Gold
  Status:       AKTIV
  Verbleibend:  14 Tag(e), 8 Std.
  Vergeben von: Console
  Vergeben am:  06.04.2026 23:44

vip_list

Lists all VIPs on your server (active + expired) with their tier and remaining time.

vip_cleanup

Manually removes all expired VIPs from the JSON file. This also runs automatically on startup if Config.CleanupOnStart is true.

Duration format

Only d (days), h (hours), m (minutes) and permanent are valid. vip_add 5 gold 30 (without unit) will fail with "Ungültige Dauer".

devCon_vipcheck Exports

Server Exports

All exports run on the server and take the player's identifier (not server ID). Use GetPlayerIdentifiers(src) to get it.

HasVIP

Check if an identifier has any active VIP tier.

local hasVIP = exports['devCon_vipcheck']:HasVIP(identifier)
-- returns: boolean

if hasVIP then
    print('Player is a VIP')
end

HasVIPTier

Check if an identifier has at least the given tier (based on priority). Useful for "Gold or better"-checks.

local hasGold = exports['devCon_vipcheck']:HasVIPTier(identifier, 'gold')
-- returns: boolean (true if player has gold, platin or higher)

GetVIP

Get full VIP data for an identifier. Returns nil if not found.

local data = exports['devCon_vipcheck']:GetVIP(identifier)
-- returns table or nil:
-- {
--     tier      = 'gold',          -- internal tier key
--     label     = 'Gold',          -- display name
--     priority  = 2,               -- priority number
--     active    = true,            -- is VIP still valid?
--     expires   = 1234567890,      -- unix timestamp or -1 (permanent)
--     remaining = '14 Tag(e), 8 Std.',  -- human-readable
--     grantedBy = 'Console',
--     grantedAt = 1234567000,
-- }

GetAllVIPs

Get all VIPs as a table keyed by identifier. Useful for admin panels or stat dashboards.

local vips = exports['devCon_vipcheck']:GetAllVIPs()
for identifier, data in pairs(vips) do
    print(identifier, data.label, data.remaining)
end

SetVIP

Programmatically grant a VIP tier (e.g. when a user subscribes on your website or buys on Tebex).

local success = exports['devCon_vipcheck']:SetVIP(
    identifier,      -- e.g. 'license:abc123...'
    'gold',          -- tier key
    '30d',           -- duration: '30d', '12h', '45m', 'permanent'
    'Tebex'          -- optional: who granted it (defaults to 'Export')
)
-- returns: boolean (false if tier unknown or duration invalid)

RemoveVIP

Revoke VIP immediately.

local success = exports['devCon_vipcheck']:RemoveVIP(identifier)
-- returns: boolean (false if no entry existed)

Per-Tier Exports (dynamic)

For each tier defined in Config.VIPTiers, a matching export is generated automatically. The name follows the pattern hasVIP<Tier> with the first letter uppercased.

-- With default tiers: silber, gold, platin
local isSilber = exports['devCon_vipcheck']:hasVIPSilber(identifier)
local isGold   = exports['devCon_vipcheck']:hasVIPGold(identifier)
local isPlatin = exports['devCon_vipcheck']:hasVIPPlatin(identifier)
-- each returns: boolean (true only if player has EXACTLY that tier)

HasVIPTier vs. hasVIPGold

hasVIPGold returns true only if the player has exactly Gold. HasVIPTier(id, 'gold') also returns true for higher tiers like Platin. Use the first for tier-exclusive perks, the second for permission gates.

devCon_vipcheck Callbacks

Client Callbacks

Client-side callbacks let you query the player's own VIP status. Works with both ESX Legacy and QBCore callback systems - the script auto-detects which one to use.

devCon_vipcheck:getVIP

Returns full VIP data for the calling player.

Client (ESX Legacy)
ESX.TriggerServerCallback('devCon_vipcheck:getVIP', function(data)
    if data and data.active then
        print('Your VIP: ' .. data.label .. ' - ' .. data.remaining)
    else
        print('No active VIP')
    end
end)
Client (QBCore)
QBCore.Functions.TriggerCallback('devCon_vipcheck:getVIP', function(data)
    if data and data.active then
        print('Tier:', data.label)
    end
end)

devCon_vipcheck:hasVIP

Simple boolean check - is the player currently a VIP?

ESX.TriggerServerCallback('devCon_vipcheck:hasVIP', function(isVIP)
    if isVIP then
        -- show VIP UI badge etc.
    end
end)

devCon_vipcheck:hasVIPTier

Checks if the player has at least the given tier (priority-based).

ESX.TriggerServerCallback('devCon_vipcheck:hasVIPTier', function(hasAccess)
    if hasAccess then
        -- open gold+ feature
    end
end, 'gold')
devCon_vipcheck Events

Server Events

devCon_vipcheck triggers a server event whenever a VIP player connects. Other resources can hook into this to apply bonuses, log analytics or sync with external systems.

devCon_vipcheck:playerConnected

Fires when any VIP player joins the server - whether their VIP is still active or already expired. Useful for re-applying bonuses or logging.

Server
AddEventHandler('devCon_vipcheck:playerConnected', function(source, identifier, tier, active, expires)
    -- source:     player server ID (number)
    -- identifier: player identifier (e.g. 'license:abc...')
    -- tier:       tier key (e.g. 'gold')
    -- active:     boolean - still valid?
    -- expires:    unix timestamp or -1 (permanent)

    if active and tier == 'platin' then
        -- Example: give 5000 cash to Platinum VIPs on login
        local xPlayer = ESX.GetPlayerFromId(source)
        if xPlayer then
            xPlayer.addMoney(5000)
        end
    end
end)

When does it fire?

The event fires on playerConnecting - before the player has fully spawned. Store the data and act on it from playerSpawned or esx:playerLoaded if you need the player's xPlayer object ready.

Integration Example: esx_basicneeds

Here's how the author of devCon_vipcheck uses the exports to bypass hunger/thirst for Platin VIPs. This pattern can be applied to any ESX script.

esx_basicneeds/server/main.lua
CreateThread(function()
    while true do
        Wait(Config.HungerRate)
        for _, playerId in ipairs(GetPlayers()) do
            local src = tonumber(playerId)
            local identifiers = GetPlayerIdentifiers(src)
            local license = identifiers[1]

            -- Skip hunger/thirst drain for Platin VIPs
            local isPlatin = exports['devCon_vipcheck']:hasVIPPlatin(license)
            if not isPlatin then
                -- apply normal drain
            end
        end
    end
end)

Tebex Integration

Automatically grant VIP when a player buys a package on Tebex - use a Tebex command that triggers a server event, then call SetVIP:

Your Tebex-handler script
-- Tebex ruft diesen Command: vip_tebex_grant [license] [gold|platin] [30d|perm]
RegisterCommand('vip_tebex_grant', function(source, args)
    if source ~= 0 then return end -- only from console/Tebex

    local license  = args[1]
    local tier     = args[2] or 'gold'
    local duration = args[3] or '30d'

    exports['devCon_vipcheck']:SetVIP(license, tier, duration, 'Tebex')
end, true)
IntegrationsESX Legacy

ESX Legacy Integration

How our scripts integrate with ESX Legacy.

Documentation coming soon

This page is being written. Join our Discord for early access.

IntegrationsQBCore

QBCore Integration

How our scripts integrate with QBCore.

Documentation coming soon

This page is being written. Join our Discord for early access.