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:
Everything you need to know about using our products - from finding your purchases to configuring scripts for your server.
Jump straight to the documentation for our most popular products:
After your purchase, all products are delivered automatically to your FiveM Portal account. Here's exactly where to find them.
You don't need to download anything manually. When you complete a purchase, Tebex automatically links the product to your FiveM (Cfx.re) account.
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.
Once payment is confirmed, go to portal.cfx.re and log in with the FiveM account you used during checkout.
In the sidebar of the Portal, navigate to Granted Assets. Your purchased devCon products appear here instantly.
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.
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.
The FiveM Portal is Cfx.re's official platform for managing your purchased assets. This guide walks you through every feature you need.
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.
Go to portal.cfx.re in your browser.
Use the same FiveM account you use to play - this is also your Cfx.re account.
In the left sidebar you'll find all products you own, including those purchased from devCon.
To use a script on your server, you need to link it to a Server Key:
In the Portal under "Server Keys", create a new key for your server. Give it a name you'll recognize.
Open the asset under "Granted Assets" and click Link to Server. Choose your Server Key.
Copy the generated key and add it to your server.cfg:
sv_licenseKey YOUR_KEY_HERE
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.
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.
| 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. |
Everything that affects gameplay is exposed in open config files. You can change:
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.
Every devCon purchase includes dedicated support. Here's the fastest way to get help.
Join our Discord and open a support ticket. This is the fastest way to get help - we usually respond within minutes.
To get help faster, include the following information:
| Channel | Typical response |
|---|---|
| Discord Ticket | Within 10 minutes (business hours) |
| Discord DM | Not recommended - use tickets |
| Within 24 hours |
Complete VIP tier management with automatic expiration, console commands and a clean API. Works out of the box with ESX Legacy and QBCore.
Requires either es_extended or qb-core running on your server. Framework is auto-detected at startup.
Download devCon_vipcheck from your FiveM Portal under Granted Assets.
Unpack the archive into resources/[devcon]/devCon_vipcheck.
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.
# Framework first
ensure es_extended
# VIP system
ensure devCon_vipcheck
# Scripts that depend on VIP status
ensure esx_basicneeds
To use console commands (vip_add, vip_remove, etc.) you need the vipcheck.admin ACE permission. Grant it to your admin group:
add_ace group.admin vipcheck.admin allow
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
All configurable options live in config.lua. The file is escrow-ignored, so you can edit it without breaking the script.
The main settings that control how the script behaves:
| Option | Type | Default | Description |
|---|---|---|---|
Config.Framework | string | "auto" | Framework mode: "auto", "esx", "qbcore" |
Config.Debug | boolean | true | Logs all connects, VIP-checks, exports and commands to the server console |
Config.DataFile | string | "data/vips.json" | Path to the JSON file that stores all VIPs (relative to resource folder) |
Config.AcePermission | string | "vipcheck.admin" | ACE permission required for console commands |
Config.IdentifierType | string | "license" | Which identifier to store: license, steam, discord, fivem |
Config.NotifyTitle | string | "VIP" | Title shown in all notifications |
Config.NotifyDuration | number | 5000 | Notification duration in milliseconds |
Config.ExpiredCheckInterval | number | 3600000 | Interval (ms) between automatic expiration checks. Default = 1h |
Config.CleanupOnStart | boolean | true | Automatically remove expired VIPs when the script starts |
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.VIPTiers = {
['silber'] = { label = 'Silber', priority = 1 },
['gold'] = { label = 'Gold', priority = 2 },
['platin'] = { label = 'Platin', priority = 3 },
}
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.
All player-facing notifications can be customized. %s placeholders are replaced with tier label and remaining time respectively.
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',
}
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.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
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.
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...).
vip_add <server_id|identifier> <tier> <duration>
# 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
Revoke VIP status from a player immediately.
vip_remove <server_id|identifier>
Show detailed VIP info for a player: tier, status, remaining time, who granted it and when.
[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
Lists all VIPs on your server (active + expired) with their tier and remaining time.
Manually removes all expired VIPs from the JSON file. This also runs automatically on startup if Config.CleanupOnStart is true.
Only d (days), h (hours), m (minutes) and permanent are valid. vip_add 5 gold 30 (without unit) will fail with "Ungültige Dauer".
All exports run on the server and take the player's identifier (not server ID). Use GetPlayerIdentifiers(src) to get it.
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
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)
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,
-- }
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
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)
Revoke VIP immediately.
local success = exports['devCon_vipcheck']:RemoveVIP(identifier)
-- returns: boolean (false if no entry existed)
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)
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.
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.
Returns full VIP data for the calling player.
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)
QBCore.Functions.TriggerCallback('devCon_vipcheck:getVIP', function(data)
if data and data.active then
print('Tier:', data.label)
end
end)
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)
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 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.
Fires when any VIP player joins the server - whether their VIP is still active or already expired. Useful for re-applying bonuses or logging.
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)
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.
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.
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)
Automatically grant VIP when a player buys a package on Tebex - use a Tebex command that triggers a server event, then call SetVIP:
-- 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)
How our scripts integrate with ESX Legacy.
This page is being written. Join our Discord for early access.
How our scripts integrate with QBCore.
This page is being written. Join our Discord for early access.