A FiveM Discord bot does the paperwork of running an RP city: it takes whitelist applications, shows whether the server is up and how many people are on, links each player's Discord account to their game license, and keeps Discord roles and in-game permissions in step. I build these on your own Discord application, for your framework and your rules, and hand over the code.
Before you pay anyone, check the free and cheap options below. txAdmin, which ships with FXServer, already has a Discord bot with a status embed and a role-based allowlist, and pre-made bots on BuiltByBit sell for $4.99 to $11.99. A custom FiveM Discord bot makes sense when your whitelist, departments and staff tools have outgrown those. Prices and versions on this page were checked in September 2026.
What a FiveM Discord bot does
Here is one full flow for a whitelisted RP server.
- A new member arrives. They read the rules and press an accept button, which opens the application channel to them.
- They apply.
/whitelist applyopens a Discord form. A form holds up to five fields, so a longer application runs over two or three short steps. Discord forms now take text, dropdowns, role and channel pickers, file uploads, radio buttons and checkboxes, which covers age checks and character backstories. - Staff review. The application lands in a private queue with approve, deny and interview buttons. Reviewers can vote, every decision is logged with who made it, and the applicant gets a direct message with the result.
- The player links their account. On approval the bot grants the whitelisted role and gives the player a one-time code. They type it in game, and the bot stores their Discord ID against their game license.
- Roles follow them in. When staff give someone the LSPD role in Discord, a small resource on your game server applies the matching job or group. Remove the role and the in-game access goes with it.
Staff get /whois for any member, an audit log of every approval and role change, and a status panel that tells players whether the city is up before they open FiveM.
Live status and player count
Every FXServer answers three JSON endpoints: /info.json, /dynamic.json and /players.json, on your server's port, usually 30120. /dynamic.json carries the server name, players online and max slots, which is all a status panel needs.
One change matters for any status bot. Since a July 2026 FXServer update, included in the recommended server build as of September 2026, the public /players.json returns every player as an anonymous "Player" with no identifiers. Names and identifiers only come back when the request carries the token you set in sv_playersToken, in an X-Players-Token header. On a current build, a status bot that lists player names shows only anonymous entries until it sends that token.
/info.json and /players.json are also rate limited per IP address, so the bot polls once a minute from one host and every status panel reads from that one result. For Minecraft, status comes from Server List Ping on TCP port 25565, which is on by default, while the richer Query protocol has to be switched on with enable-query. Rust, Valheim, DayZ and CS2 servers answer Valve's server query protocol, which the GameDig library reads; it supports more than 320 games.
Account linking and role sync
FiveM can report a discord: identifier, but only when the player's Discord app has allowed FiveM to read it, so some players connect without one. That is why I link with a one-time code tied to the license: identifier, which comes from the player's Rockstar account.
ESX and QBCore both end up in FiveM's ACE permission system. ESX's setGroup adds the player's license to a group.<name> principal, and QBCore grants levels such as qbcore.admin as ACE principals too. The companion resource calls those same framework functions, so your existing permission setup keeps working. For Roblox groups, where ranks live on Roblox itself, see Roblox Discord bots.
Departments, tickets and ban appeals
PD, EMS, DOJ and whitelisted gangs each get their own application, reviewer role and roster. Tickets for bugs, reports and refunds open private channels with transcripts, the same design as the ticket bots I build for other communities. Ban appeals run from a separate appeals server or a web form, because someone banned from your Discord can't reach a bot inside it.
What it connects to
| System | What moves |
|---|---|
| FXServer (FiveM or RedM) | Server name, players online and max slots from /dynamic.json; player names from /players.json with your token |
| txAdmin | Its allowlist can gate joins by Discord role, so the bot manages who has the role and txAdmin enforces it |
| ESX or QBCore | Groups, jobs and ACE principals, through a small companion resource |
| MySQL via oxmysql | Linked accounts, applications and decisions, in the database both frameworks already use |
| Minecraft | Status over Server List Ping or Query; whitelisting over RCON on the same host, since RCON isn't encrypted |
The Discord side of this is work I have done before. I built a registration bot for a Swedish online esports league with another developer, where captains signed up through buttons and short forms and the bot created 138 channels and 123 roles in under half an hour for 131 teams. Read the league registration bot case study and the one for the ticket bot with transcripts.
Free bot, builder or custom?
| Option | Price (September 2026) | Good at | Watch for |
|---|---|---|---|
| txAdmin built-in bot | Free, bundled with FXServer | /status embed updated every minute; allowlist by Discord membership, Discord role or approved license |
No application forms, departments or tickets; the Discord modes need the player's discord: identifier |
| zdiscord | Free, CC BY-NC-SA 4.0 | Runs inside FiveM; QBCore commands, automatic ACE permissions, staff chat | Last release v7.3.0 in April 2022, built on a forked discord.js |
| DiscordAcePerms | Free, MIT | Maps Discord role IDs to ACE groups | Last code change May 2023, needs Badger_Discord_API |
| BuiltByBit pre-made bots | $4.99 to $11.99 | Status panels, application and whitelist flows, tickets | You host and update it yourself |
| VibeBot | $5 or $10 a month | FiveM template with whitelist, status, departments and tickets, no code | Source export costs $100 each time |
| DiscordSRV (Minecraft) | Free, GPL-3.0 | Chat bridge, account linking, group and role sync | Minecraft only |
| A custom bot from me | From $590 | Your exact flow, framework and data | You pay for the build |
The BuiltByBit listings checked were "FiveM Discord Bot" at $11.99, "Discord Application & Whitelist Bot" at $9.99 and "FiveM Live Status Bot + Public Website" at $4.99. VibeBot's Lite plan is $5 a month and Pro is $10, or $100 a year.
When those are enough, use them:
- You want a status embed and role-gated joins. Turn on txAdmin's bot and set the allowlist to Discord Server Roles. It costs nothing.
- You want a standard application bot and can host it. The $9.99 BuiltByBit application bot is the cheapest route.
- You don't want to host anything and a template fits. VibeBot at $5 to $10 a month.
A custom build pays off when you need things those don't do: interview stages and staff voting, applications that write straight to your database, Discord roles that set framework jobs and groups, a custom or heavily modified framework, several servers sharing one staff team, or code you can hand to the next developer.
What it costs
Most FiveM bots start at the Starter tier, from $590, delivered in 1 to 2 weeks. That covers one system: for example the whitelist application flow with staff review and role grants, or a status panel with txAdmin's allowlist doing the gating.
- Community, from $1,490 (2 to 4 weeks): up to three systems sharing one database, for example whitelist, departments and account linking, plus the companion resource that syncs Discord roles with ESX or QBCore as the one integration.
- Platform, from $3,500 (4 to 8 weeks): a web staff panel, several game servers, or an appeals site.
The quote goes up with two-way sync, more than one framework or server, and moving data out of an old bot. It goes down if txAdmin's allowlist does the gating, and if the application questions are fixed. After launch, Care is $49 a month for hosting and updates, and every build includes the first month. See every tier on the pricing page.
How the build works
- Brief. Tell me your framework, server count and current bots in the quote form. If you'd rather plan first, a $249 Bot Blueprint gets you a written spec and fixed price, credited in full if you order within 30 days.
- Spec. Commands, forms, roles, data and an acceptance checklist we both sign off on.
- Build and test. In a private Discord server and against a test game server, never your live city.
- Launch. On your own Discord application, so you hold the token, with source code and setup docs for your repository.
- After launch. 30 days of bug fixes, then Care if you want me to keep it running.
I take a limited number of builds each month, so the brief also tells me whether I can start when you need it.
Technical notes
- Intents: Guilds and Guild Members. Guild Members is privileged, but since Discord's June 2026 change an app with fewer than 10,000 users only has to switch it on in the Developer Portal. Everything runs on slash commands, buttons and forms, so the bot doesn't need to read message content.
- Permissions: Manage Roles, with the bot's role above the whitelisted and department roles, plus View Channels, Send Messages and Embed Links. Manage Channels only if it opens ticket channels.
- Data stored: Discord user ID, game license, application answers and staff decisions, in your database.
- Status check: the core of a status panel is one request. Tested with Node 22.22.2 and 24.15.0 against a mock server that returns
/dynamic.jsonwith the field names and types from the FXServer source.
// Reads player count and server name from an FXServer's /dynamic.json.
// Node 22 or newer (built-in fetch). FIVEM_SERVER is "ip:port", usually port 30120.
async function getFiveMStatus(server = process.env.FIVEM_SERVER) {
try {
const res = await fetch(`http://${server}/dynamic.json`, {
signal: AbortSignal.timeout(5000),
});
if (!res.ok) return { online: false, reason: `HTTP ${res.status}` };
const data = await res.json();
return {
online: true,
name: data.hostname.replace(/\^\d/g, ''), // strip color codes like ^2
players: data.clients, // a number
max: Number(data.sv_maxclients), // FXServer sends this one as a string
};
} catch (err) {
return { online: false, reason: err.name === 'TimeoutError' ? 'timeout' : err.message };
}
}
module.exports = { getFiveMStatus };If a bot you can add today covers your server, the guide to adding a bot to Discord gets it running in minutes. If it doesn't, send me a brief and I'll reply with a fixed quote.