Skip to content
FiveM Phone
All articles

Guide · 7 min read

How to Install a FiveM Phone on ESX, QBCore and Qbox

Step-by-step installation of a FiveM phone resource: requirements, server.cfg order, inventory items, voice, media uploads and the first-start checklist.

· FiveM Phone team

Installing a FiveM phone is mostly about order: the database layer first, then your framework and inventory, then voice, then the phone. This guide walks through a clean install of our phone resource on ESX, QBCore and Qbox, including the phone item, voice, media uploads and a first-start checklist you can run in ten minutes.

Most steps apply to any FiveM phone script, so even if you are still comparing options, the server.cfg order and the checklist are worth bookmarking.

Requirements before you install the FiveM phone

Check these before touching server.cfg:

  • oxmysql, started before the phone. All phone data is stored through it.
  • MariaDB 10.11 or newer. Older MariaDB or MySQL versions are not supported.
  • OneSync enabled. The free OneSync tier is enough.
  • A voice resource for calls: pma-voice 6.6.2 or newer, or FiveM Enhanced Voice. You can also run without voice; the phone degrades cleanly and simply disables calls.
  • screenshot-basic if you want in-game Camera captures.
  • An inventory if you want the phone to be a physical item. ox_inventory and qb-inventory are the primary targets; qs-inventory, ps-inventory, codem-inventory, core_inventory and origen_inventory adapters are included and auto-detected, but those five are statically verified only and not yet tested on live servers.

There is no SQL file to import. On first start the resource applies its own schema with CREATE TABLE IF NOT EXISTS, which is safe to run on every start.

Step 1: Configure and download your build

Our phone is delivered as a ready-to-start build rather than a kit. In the configurator you choose your framework, edition, apps, per-app settings, branding, motion and integrations. After payment you get a private download link by email. The ZIP contains exactly one framework adapter, the apps you selected and your values already injected into config/config.lua.

If you lose the link, the recovery page sends a fresh short-lived link to your checkout email.

Step 2: Place the resource

  1. Unzip the download.
  2. Move the folder into your server's resources/ directory. Keep the layout: fxmanifest.lua must sit at the root of the folder.
  3. You can rename the folder (for example to phone). If you do, remember that exports are called by folder name, such as exports.phone:SendMail(...).

Step 3: server.cfg order per framework

The rule is simple: oxmysql, then your framework, then inventory and voice, then the phone. Here are working examples.

ESX

ensure oxmysql
ensure es_extended
ensure ox_inventory      # optional, if you use phone items
ensure pma-voice
ensure screenshot-basic
ensure phone

The ESX adapter talks to es_extended directly through its export, so no bridge resource is needed. Cash and bank go through xPlayer methods, and jobs and grades come from ESX. More on the ESX framework page.

QBCore

ensure oxmysql
ensure qb-core
ensure qb-inventory
ensure pma-voice
ensure screenshot-basic
# make sure qb-phone is not started
ensure phone

Remove or stop qb-phone before starting the new phone. Running two phones at once leads to duplicate keybinds and item handlers fighting each other. If you are migrating an existing server, read replacing qb-phone first. Framework details are on the QBCore page.

Qbox

ensure oxmysql
ensure ox_lib
ensure qbx_core
ensure ox_inventory
ensure pma-voice
ensure screenshot-basic
ensure phone

The Qbox adapter uses qbx_core exports natively and only falls back to the qb bridge if needed. See the Qbox page.

ox_core, vRP2 and standalone builds follow the same pattern. The ox_core and vRP2 adapters are currently beta, so test them on a staging server first.

Step 4: The phone item

If you enabled "require item" in the configurator, Config.RequireItem is true and players need the phone item to open the phone. A few things to check:

  • The item name your build expects exists in your inventory's item list. The default is phone; QBCore's shared items already define it, and on other inventories you may need to add it.
  • With ox_inventory and qb-inventory, the phone stores a device_id in the item's metadata. Phone state (number, contacts, settings, app data) belongs to that device, not to the character, so handing someone your phone hands them your phone.
  • Inventory selection is auto by default. The resource checks which inventory is started, in this order: ox_inventory, qb-inventory, qs-inventory, origen_inventory, core_inventory, codem-inventory, ps-inventory.

If you do not want physical phones at all, leave "require item" off and everyone can open the phone.

Step 5: Voice

The voice provider is chosen in the configurator and stored in Config.Integrations.voice as pma-voice, fivem-enhanced or none.

  • pma-voice: the phone places both parties into a pma-voice call channel through its server exports. Make sure pma-voice is started before the phone.
  • FiveM Enhanced Voice: the phone creates and manages its own server-side voice channels. This also enables speakerphone audio relayed to nearby players.
  • none: calls are disabled; everything else works.

The Radio app (Pro and up) can use a different backend from calls, configured in config/radio.lua. An adapter for SaltyChat is included for radio. Video calls need extra setup covered in how FiveM video calls work.

Step 6: Media uploads

Photos, voice memos, AirShare and social posts need somewhere to store files. The media provider is either Fivemanage or a generic HTTPS endpoint you run yourself. Credentials are read only from server ConVars, never from config.lua or the UI:

# Fivemanage
set phone_fivemanage_token "your-fivemanage-token"

# or a generic HTTPS provider
set phone_media_endpoint "https://media.example.com/presign"
set phone_media_token "your-media-token"

Use set, not setr. setr replicates the value to every client, which is exactly what you do not want for a token. The phone hands clients short-lived presigned upload URLs, so the token never reaches the browser.

Step 7: First start

Restart the server (or start the resource) and watch the console. On a healthy first start the schema is applied silently and the phone prints no errors or warnings. Then work through this checklist in-game:

  1. Press F1 (the default; command +phone). Players can rebind it in Settings, Key Bindings, FiveM.
  2. Complete the setup assistant on the new phone.
  3. Send a message between two players and restart the resource. The message should still be there.
  4. Call between two players and confirm both can hear each other.
  5. Take a photo with Camera and confirm it shows up in Photos.
  6. If you bought Pro or Ultimate, send a small Wallet transfer and check that the money moved in your framework's account, not just in the phone UI.
  7. Give the phone item to another player and confirm the number and contacts move with it.

Troubleshooting

  • Phone won't open. Check the keybind. F1 is a popular key, so another resource may own it; change Config.OpenKeybind or rebind in game. If RequireItem is on, confirm the player has the item.
  • Nothing is saved. oxmysql is not started before the phone, or the database connection string is wrong.
  • WARNING: server/schema.sql not readable. The schema file is missing from the folder, usually from a partial upload. Re-download the ZIP from your order page.
  • Calls connect but there is no audio. The voice provider in your build does not match the resource you run, or pma-voice starts after the phone.
  • Camera does nothing. screenshot-basic is not started, or the media provider is not configured.
  • Phone opens while another menu is focused. Enable blockWhenNuiFocused in config/system.lua.

Changing settings later

Most values live in config/config.lua and config/<app>.lua. Per-app values you set in the configurator ship in config/overrides.json, which is merged over the Lua defaults on start and wins over them. To change one of those values, edit the JSON, or delete the entry and edit the Lua file. Then run restart phone in the server console.

Next steps

Not bought yet? Try the real phone in your browser on the configurator, pick your framework, and the live preview shows exactly what your build will look like. Compare editions on the pricing page.

Try the phone, not just the article.

Try the real phone in your browser, configure it in two minutes and install it tonight.