Troubleshooting
Start with the first failing layer. Do not change UI code to work around a database, framework, resource-order, or manifest problem.
Diagnostic order
Confirm resource start order.
Check the server console for Lua, JavaScript, and SQL errors.
Check the client F8 console.
Verify the selected framework and bridge mappings.
Verify the database schema.
Reproduce with built-in applications before testing a custom application.
Rebuild web assets only when source files changed.
Phone does not open
Check:
src-phoneis started.web/dist/index.htmlexists and is included byfxmanifest.lua./telworks even if the configured key does not.Config.PhoneOpenKeycontains a valid FiveM mapping name.The player does not have a conflicting saved key binding.
The client console does not report a missing phone prop or NUI file.
If /tel works but the key does not, reset or change the local FiveM key binding. Restarting the resource does not overwrite a player's existing local mapping.
Missing-table or unknown-column errors
Cause: install.sql was not imported completely, or an older schema was not migrated.
Resolution:
Stop
src-phone.Back up all
src_phone_%tables.Import the current complete
install.sql.Review the first SQL error rather than continuing through the remaining failures.
Restart the resource.
See Database.
Phone number or mail address is missing
Check that:
Framework player-loaded events are reaching the bridge.
The configured framework identifier is non-empty.
src_phone_dataexists and is writable.Config.PhonePrefix,Config.PhoneNumberLength, andConfig.MailDomainare valid.No unique-value conflict exists from a manually edited number.
Calls connect without voice
Check:
The configured voice resource starts before
src-phone.BridgeConfig.Call.VoiceSystemmatches the running voice integration.Both players have valid phone numbers.
The voice resource supports the channel operations expected by the bridge.
Speaker mode is tested separately from the normal private call channel.
A working call UI does not prove that the voice bridge joined the players to the same channel.
Camera opens but upload fails
Check:
Config.FivemanageApiKeyis set inshared/server_config.lua.The token is active and permitted to upload the requested media type.
The server can reach the upload provider.
Payload limits are not exceeded.
The key has not been placed in client-visible configuration.
Do not post the token in a support message. Rotate it if it has been exposed.
Garage is empty or shows incorrect state
Check BridgeConfig.Garage.SQL against the actual vehicle table:
Table name.
Owner identifier column.
Plate and model columns.
Stored/out/impound state column and values.
Fuel, engine, body, and mods columns when used.
Also verify that the selected garage, key, and fuel resources match their bridge configuration.
App reports no internet
Check:
Airplane mode is disabled.
Wi-Fi is enabled and the character is connected to an authorized router within range.
The router has remaining quota.
Cellular data is enabled, valid, and has remaining quota.
Config.Router.InternetUsageEnabledandConfig.Cellular.Enabledmatch the intended server rules.Streaming usage values are not consuming the quota faster than expected.
An external application with requiresInternet: true uses the same launch gate as supported built-in network applications.
Custom application does not appear
Check:
src-phonestarts before the application resource.The external resource declares
dependency 'src-phone'.config.luadefinesPhoneAppConfigand loads beforeclient.lua.registerAppreturnstrue.The ID is valid, unique, and not reserved.
Config.Appsis not being used for the custom ID.defaultInstalledmatches the expected installation mode.With
defaultInstalled: false, open the phone App Store and install the app.
Print the returned registration error code. Do not discard the second return value from registerApp.
Custom application appears outside the phone
Cause: the external resource uses the real application entry as its FiveM ui_page.
The correct fxmanifest.lua uses the transparent page:
The real application path remains in config.lua:
Also keep the srcPhoneEmbedded=1 guard in web/index.html. Rebuild from web/, then restart the external resource:
Custom application is blank inside the phone
Check:
web/dist/index.htmlexists.Vite uses
base: './'so built asset URLs are relative.uiPageis relative to the resource root, normallyweb/dist/index.html.fxmanifest.luaincludesweb/dist/index.htmlandweb/dist/**/*.The entry-page guard receives
srcPhoneEmbedded=1.Browser code does not require an unrestricted top frame or popup capability.
Open the client console and look for failed cfx-nui asset requests.
Custom application callback never returns
Check every path in the Lua handler calls cb(...) exactly once:
Also confirm the TypeScript SDK has received its resource name from the shell before calling phone.nui.
Changes are not visible after a web edit
The runtime loads web/dist, not web/src.
For an external application:
Restart the resource that owns the changed bundle. Restarting only src-phone does not rebuild or reload an external resource's top-level NUI.
Information to collect for support
Provide:
src-phoneversion.Framework and version.
Voice, garage, keys, fuel, and inventory resources in use.
Exact start order.
The first relevant server error.
The first relevant client F8 error.
Registration error code for a custom app.
Whether the issue reproduces with a new character.
Do not provide API keys, database credentials, password hashes, authentication tokens, or full player records.
Last updated

