A practical checklist for v2rayN, v2rayNG, and v2flyNG users seeing “update failed” or an empty list after import. First distinguish download errors from parse errors, then check the URL, response body, Base64 encoding, and node fields. Finally, test a single node to narrow down the cause without mistaking a subscription issue for a core or DNS problem.
First, identify the failure: request, parsing, or connection
A subscription update has several separate steps: the client requests the subscription URL, the server returns content, the client recognizes the format and creates nodes, and the core uses each node’s settings to connect. An empty list only means there are no entries to display; it does not prove the server is offline. “Update succeeded, but no nodes appeared” can also mean the group is filtered, the response is empty, or every entry was discarded.
| What you see | Check first | Avoid for now |
|---|---|---|
| Timeout or DNS lookup failure | Subscription domain, current network, and whether updates use a proxy | Changing node protocols repeatedly |
| Content received, but format error reported | Response body, encoding, and formats supported by the client | Importing a webpage as node data |
| List is empty after an update | Whether the response is empty, group and filter settings, and subscription access | Deleting all existing nodes right away |
| Nodes appear, but connections fail | Node settings, core support, security layer, and server status | Continuing to troubleshoot Base64 |
Back up your current settings and note the full update error. If you already have working nodes, don’t delete the existing group just to retry. Create a test group instead to compare results and avoid disrupting your everyday setup if an update goes wrong.
Check the URL: a subscription URL is not a single-node share link
Subscription URLs usually point to a resource and start with https://. Single-node share links may start with vmess://, vless://, or trojan://. Add the former to a subscription group and update it; import the latter through the client’s share-link option. If you enter a node link in the subscription URL field, the client may reject it or fail when making the request.
-
Copy it again
Copy the full URL again from your provider’s subscription page, then paste it into a plain-text editor and check both ends. Remove any stray quotation marks, line breaks, or punctuation, but don’t delete query parameters by hand.
-
Check the right menu
In v2rayN, the usual path is “Subscription Group” → “Subscription Group Settings” → “Add.” Enter a name and URL, then save. Labels may vary slightly by version; use the subscription group editor, not the single-node editor.
-
Update it on its own
Go back to “Subscription Group” and test with “Update Current Subscription (without proxy).” If your version says “Selected” instead of “Current,” make sure the test group you just added is selected.
-
Note the result
Record the update time, the exact message, and whether the node count changed. On Android, check the URL under v2rayNG’s “Subscription Group Settings,” then test from the main menu using “Update Subscription.”
In a query string, &, =, and % may be part of a token or parameter; don’t remove them just because they look unnecessary. If copying from page source or a forwarded message leaves the literal text & in the URL, use the original copy button again rather than treating HTML-escaped text as the actual URL.
Check the response first: HTTP success doesn’t mean the subscription is valid
When inspecting a response in a trusted local environment, check both the status code and the response body. Opening a login page in a browser only shows that the site is reachable; the client needs recognizable node data. A response containing a web challenge, login redirect, or error message may be impossible to parse even if the status code is 200. Browsers may also send login cookies, so success in a browser doesn’t guarantee that the client’s request will work.
- Body starts with HTML: For example,
<!DOCTYPE html>. It’s probably a webpage, so don’t try to decode it as Base64. - Body contains a JSON error: Read the error message first. A file extension or response type that looks like data doesn’t make it a node list.
- Body is empty: Check whether the subscription is enabled, your plan permissions, and your provider’s status. Also check whether a network device truncated the response.
- Status code 429: Too many requests. Stop refreshing and try again later, following your provider’s guidance or the wait time in the response.
Bottom line: verify the response before checking the encoding
If the response is a login page, an access-denied message, or empty, re-encoding it won’t produce valid nodes. Fix subscription access first, then test the client’s parser.
Troubleshoot Base64: check the encoding layers, don’t add characters blindly
One common subscription format encodes multiple share links together as Base64; others return plain-text share links. A VMess share link often contains JSON that is itself Base64-encoded, so seeing vmess:// after decoding the outer subscription is normal and doesn’t mean decoding failed. Whether a particular format is accepted depends on the client’s subscription parser.
- Standard Base64: Uses
+and/in its character set and may use trailing=padding. - URL-safe variant: Uses
-and_instead. Whether the parser recognizes it automatically depends on the client. - Check the length: After removing whitespace that can be ignored, a length with a remainder of 2 or 3 when divided by 4 may simply be missing padding. A remainder of 1 usually means the content is incomplete or isn’t Base64.
- Decoding doesn’t mean the data is valid: Even if decoding succeeds, the result must still be node data the client supports. Base64 is an encoding, not encryption.
Whitespace handling varies: some subscription parsers strip it, while strict decoding tools may not. Save the original content, then inspect a copy locally. Don’t globally replace characters in node URIs or remove every =. If the content was truncated during copying, adding padding may make it look syntactically correct, but it can’t restore missing data.
illegal base64 data at input byte 0
Cause: Go’s Base64 decoder encountered a character that isn’t in the selected alphabet at the start of the input, such as a webpage that begins with an angle bracket.
Fix: Check the start of the response and its original format. If it’s a webpage, fix how you’re accessing the subscription instead of adding padding. The client may show only a simplified “parse failed” message.
unexpected end of JSON input
Cause: The JSON parser received empty or incomplete data. This can happen while parsing fields after decoding VMess share data.
Fix: Retrieve the complete content again and check that the decoded result is intact. Don’t guess at the node settings by manually adding a closing brace.
Protocol compatibility: decoding may work even when no node can be created
Subscription format compatibility and core protocol support are two different things. A graphical client first converts the subscription into its own node configuration, then passes it to the core. v2rayNG uses the Xray core, while v2flyNG uses the V2Fly core. In v2rayN, check which core is actually selected. Two clients recognizing VMess doesn’t mean they support the same transport settings and security-layer combinations.
| Check | What to verify | Common impact |
|---|---|---|
| Server port | Must be an integer from 1 to 65535; 443 is common, but not required | Missing or out-of-range values may prevent import |
| Credentials | Check the UUID for VMess and VLESS; check the password format for other protocols | Incorrect credentials may import successfully but fail authentication |
| Transport settings | The transport type, WebSocket path, Host, and other settings must match the server | Unsupported fields may be dropped; incorrect values cause connection failures |
| Security layer | TLS serverName; REALITY public key, shortId, and related settings | Must be supported by both the client parser and the core |
REALITY is a security-layer mechanism, not a standalone outbound protocol. Renaming a node to “REALITY” doesn’t make it compatible. If your provider offers subscription URLs for specific clients, choose the format explicitly intended for your client. Don’t assume structured configuration files can be imported as a list of share links.
- Keep the original subscription in a test group and import one complete share link provided by your service separately.
- If a single node imports but the full subscription fails, check the outer encoding, subscription response format, and whether the content was truncated.
- If only certain node types are missing, check whether their protocols and transport fields are supported. Don’t remove required settings just to force an import.
- If nodes appear but the core reports an error on startup, check the core configuration logs and distinguish unsupported settings from network connection failures.
Subscription expiration and update routing: run one controlled retest
An expired subscription URL and a failed node connection aren’t necessarily related. Resetting a token may disable the old URL immediately while cached nodes remain visible. An expired plan may return an empty list, an explanatory message, or an access-denied response, depending on the provider. Check your account’s validity period, remaining access, and latest URL instead of repeatedly importing the same old link.
Check the network route used for subscription requests separately. “Update through proxy” depends on the current proxy working; if the node in use is down, the update can get stuck in a dependency loop. Conversely, proxying the update only helps if direct access to the subscription domain fails and you already have a confirmed working node. Change one setting at a time so you can tell what made the difference.
- Test direct access once: In v2rayN’s “Subscription Group,” use the update option without a proxy. Record the result; don’t click repeatedly.
- Test through a proxy once: First confirm the selected node connects, then choose “Update Current Subscription (through proxy).” The menu wording may vary by version.
- Check the system clock: A badly incorrect date can cause HTTPS certificate validity checks to fail. Restore automatic time sync instead of disabling certificate verification.
- Check what’s displayed: Select the correct group and clear search terms and filters. A hidden list doesn’t necessarily mean the data wasn’t imported.
Bottom line: report details from the stage that failed
If the problem persists, send your provider the client name and version, update time, request status, and a redacted error message. Explain how direct and proxied updates differ. Don’t send your full subscription token or node credentials.
After a successful retest, check that node fields are complete, the core starts, and the connection actually works. These steps verify three separate things: “subscription parses,” “configuration runs,” and “connection succeeds.” Don’t stop at an update-success message. For help organizing imports, see the subscription guide. For format conversion, read the subscription conversion guidelines first, and don’t share access credentials with untrusted services.