This guide is for cases where v2rayNG stops immediately after you tap Start, reports that it couldn’t load the config, or won’t run after importing a custom config. Save a complete startup log first, then check parsing, fields, listeners, and outbound settings in that order. For a regular subscription node, fix fields in the node editor; inspect the JSON directly only for custom configs. Reinstalling the client shouldn’t be your first step.
Open the logs first: distinguish startup failures from connection failures
Open the side menu from the top-left corner of the v2rayNG home screen and select “Logs.” Stop the service, clear the old logs, return to the home screen, select the failing node, and start it once. Then reopen “Logs” and save the complete record from that startup attempt. Menu locations can vary between versions; use the “Logs” item shown in your app. Don’t capture only the final “startup failed” line—the cause is often above it.
-
Back up the original config
Note the node name and config type. Save a copy of any JSON you maintain manually. For subscription nodes, note the group they belong to so a later update doesn’t overwrite your temporary changes.
-
Record your environment
Note the client version under “About” in the side menu. If the startup log shows the Xray version, save that too. The client version and core version are separate numbers.
-
Reproduce the issue once
Stop the service and clear the logs, then start it once. If Android asks for VPN permission, grant it first so a canceled permission prompt isn’t mistaken for a config error.
-
Follow the error chain
Read past
failed to load configorfailed to start. If the error has multiple layers, keep going until you find the specific field, port, or JSON parsing hint.
If the log has reached the stage where it accepts requests and only then shows connection refused, i/o timeout, or a certificate handshake error, the problem is usually with the connection—not core startup. Repeatedly changing JSON punctuation won’t fix an unreachable remote port or a certificate mismatch.
If one of the first three stages fails, focus on the config and ports covered here. If either of the last two fails, check routing, DNS, node reachability, and TLS. Log wording varies by Xray version; the examples below are common snippets, not exact full-line matches.
1. JSON syntax errors: check brackets and data types first
If a custom config won’t start right after you paste it, check the JSON first. Object keys and string values must use straight double quotes. Don’t leave a trailing comma after the last item in an object or array. To avoid parser differences while troubleshooting, use standard JSON with no comments.
Error: invalid character '}' looking for beginning of object key string
Cause: There may be an extra comma before the end of an object, where the parser is still expecting another key. Fix: Check the item immediately before the reported position, remove any trailing comma, and make sure there are no extra closing braces.
Error: unexpected EOF
Cause: The content was cut off before an object, array, or string was complete. Fix: Check the copied range and restore the missing content; don’t just add a closing bracket to the end of the file.
Error: cannot unmarshal string into Go struct field
Cause: The field’s type doesn’t match what the core expects. Fix: Read the field path that follows the error and change the value to the required type: a number, boolean, array, or object.
This partial object illustrates JSON syntax; it is not a complete proxy config you can import. port is a number, listen is a string, and the last item has no trailing comma. When you find a type error, fix fields one by one instead of converting every number to a string.
{
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks"
}
2. Misspelled fields: valid JSON doesn’t guarantee a valid config
Once the syntax is valid, check field names, nesting, and allowed values. The top level usually contains two arrays, inbounds and outbounds, not singular names. Transport settings go under streamSettings, and network must be set to a value supported by the core. Field-name capitalization matters.
- Wrong nesting: Putting
streamSettingsinsidesettingsdoes not configure the transport layer for the current outbound. - Invalid value: Use
wsfor the WebSocket network value, not an improvised abbreviation likewebsoket. - Mixing up fields: Don’t copy parameter names from a share link and use them as JSON keys. For example, link parameters and TLS fields in the core config don’t necessarily have matching names.
- Version differences: New config fields may require a newer core. After updating the client, check which core version is actually running; the download date alone isn’t enough.
Error: unknown transport protocol: websoket
Cause: The transport protocol name isn’t a recognized value. Fix: Set streamSettings.network to match the server. For a WebSocket server, use ws.
Also note that some unknown fields may be ignored instead of triggering a “misspelled field” error. So the absence of syntax errors doesn’t prove that a setting took effect. For a regular node, return to the home screen, open the node editor, and check the address, port, protocol, and transport settings one by one. Don’t convert the entire node to custom JSON just to fix one field.
3. Inbound listener conflicts: check the address and port
If the log shows bind: address already in use, the local listening endpoint is already occupied. This is a port conflict on your device, not a connection refused by the node server. Stop other proxy services first, then check whether your custom config declares the same listening address, port, and transport protocol more than once.
These numbers illustrate the troubleshooting process; they aren’t default values for every version. For a regular config, look for the local SOCKS port under “Settings” in the side menu. After changing it, stop and restart the service; the exact label may vary by version. For custom JSON, check listen and port in the actual inbounds entry. Don’t assume the general settings override a custom config.
Error: listen tcp 127.0.0.1:10808: bind: address already in use
Cause: Another listener is using this TCP endpoint. Fix: Stop the service using it, or switch to a higher-numbered port you’ve confirmed is free. Then update any apps where you manually entered this proxy port.
Bottom line: change the local port, not the node’s port
If the log mentions listen and bind, start by fixing the local inbound. Don’t also change the remote server port to 10818; it must match the port the server actually listens on.
0.0.0.0 means the listener binds to all interfaces, which may conflict with a specific IPv4 address using the same port. Whether two inbounds conflict also depends on TCP versus UDP and the address family—not just the port number. Don’t enable LAN access just to work around the issue; it makes your local proxy accessible to more devices.
4. Missing outbound parameters: check the required fields for the protocol
The outbound determines which server to connect to, which protocol to use, and how to authenticate. Common VMess and VLESS JSON outbounds define the server under settings.vnext and the user under users. Trojan typically uses settings.servers. Mixing fields from different protocols can make outbound creation fail, even when the JSON is valid.
| Protocol | Config path to check first | Common issues |
|---|---|---|
| VMess | settings.vnext[].address / port / users[].id | Empty address, missing port, or invalid user ID |
| VLESS | settings.vnext[].users[].id / encryption | Invalid UUID; for standard configs, encryption should be none and must meet the current core’s requirements |
| Trojan | settings.servers[].address / port / password | Using the wrong vnext structure, or missing the password or server address |
Error: invalid UUID
Cause: The user ID can’t be parsed in a format accepted by the core. Fix: Copy the full ID again from the original node details. Check for spaces, truncation, or full-width characters; don’t make up a new ID to replace the account issued by the server.
Error: failed to build outbound handler
Cause: This is a high-level message indicating outbound creation failed; it doesn’t identify the missing parameter on its own. Fix: Read the nested error and check the server list, user settings, and transport settings for the specific protocol.
The connection address, TLS server name, and WebSocket Host serve different purposes; don’t swap them just because they all look like domain names. With VLESS and REALITY, also check the public key, server name, and other parameters against the server configuration. Field names and support depend on the core version in use. Ask the configuration provider about missing values instead of copying them from another node.
Restart after each change and keep a record you can roll back
Change one type of issue at a time, then stop and restart the service and check the new logs. Fix syntax first, then fields and parameters, and finally confirm the listener starts successfully. If you change the port, DNS, protocol, and routing all at once, it’s hard to tell which fix worked—even if the connection comes back.
- Regular subscription node: Update the subscription group from its menu first, then check the imported result. If only one node fails, save its logs instead of deleting the entire group.
- Custom config: Keep copies from before and after the change, and note which fields you changed and when. Don’t overwrite your only working config file.
- Known-good node: Compare it on the same device. If it starts successfully, focus on the failing node instead of resetting all settings right away.
- Still won’t start: Share the client and core versions, the complete redacted error chain, the config source type, and your most recent change. A screenshot that only says “Unable to connect” isn’t enough to pinpoint a config error.
If the core has started but Android VPN hasn’t been established, check system permissions and other apps currently using a VPN. Android typically allows only one active VPN per user profile. Troubleshoot this as a system VPN issue; there’s no need to keep changing UUIDs or disable certificate verification.