First identify what you have: a subscription URL, a single share link, or a core runtime config. This guide helps you migrate nodes and troubleshoot subscription format errors. Learn to distinguish Base64 encoding from protocol parameters, import subscriptions and export nodes in v2rayN, and spot routing, DNS, and multiple-outbound settings that won't survive converting JSON to a share link.
First, tell apart subscription URLs, share links, and runtime configs
Check the start of the text before changing its file extension. A URL starting with https:// might be a subscription endpoint—or just an account page. Text starting with vmess:// or vless:// is usually a single-node share link. JSON that starts with a brace and contains inbounds and outbounds may be a core runtime config. Check the contents too; a filename alone isn't enough to identify the format.
Subscription URL
RecommendedThe client requests this URL to retrieve the provider's current list of nodes. You can refresh it as nodes change, but the response must still be in a format the client supports.
Best for: Ongoing use and receiving node or parameter updates.
Single-node share link
Packages a server address, identity, and transport settings into one line of text. Once imported, it becomes a standalone node and won't update automatically if the original provider changes its settings.
Best for: Quick testing, moving a few nodes, or checking parameters one by one.
Native JSON config
Defines how the core runs, and may include listening ports, DNS, routing, and multiple outbounds. Make sure the config syntax matches the core you use.
Best for: Preserving the full runtime setup or using a custom config supplied by its maintainer.
A subscription URL is recommended here for everyday use that needs ongoing updates—not because it's more complete than JSON. Subscriptions usually distribute nodes; full configs define runtime behavior. They serve different purposes.
Base64 subscriptions: Node lists, not encrypted tunnels
A common legacy V2Ray subscription joins multiple share links, one per line, then Base64-encodes the resulting text. Decoding it may reveal a mix of VMess and VLESS links, or links that all use the same protocol. Base64 simply encodes bytes as printable characters. It doesn't protect node credentials or change the protocol used to connect.
A long string returned by a subscription doesn't mean the content is corrupted. Conversely, being able to open the subscription URL in a browser doesn't mean the response is valid. If the server returns a login page, expiration notice, or access verification page, the client still can't parse it as a node list.
- Check where the URL came from: Copy it from the provider's subscription page in its client, not from the browser's address bar on an account page.
- Check the response: Inspect the returned content locally. If it contains
<htmlor a login prompt, resolve the account or URL issue first. - Distinguish the two encoding layers: A legacy subscription may have an outer Base64 layer; individual legacy VMess share links inside it may also have a Base64-encoded payload.
- Don't keep decoding: Stop once you have readable share links. Repeated decoding can damage parameters or make valid text look like garbled data.
What VMess and VLESS share links contain
A common legacy VMess share link consists of vmess:// followed by a Base64-encoded JSON payload. The JSON uses fields such as add, port, id, and net. This is JSON containing share details—not a full core config with inbounds and routing. The v in a share link usually denotes the share format version, not the v2rayN app version.
VLESS share links usually use a URI structure: identity details come before the address, transport and security options go in the query string, and the remark follows #. The example below is for learning only; it uses a sample domain and demonstration UUID and does not provide a working connection.
vless://[email protected]:443?encryption=none&security=tls&type=ws&host=node.example.com&path=%2Fgateway&sni=node.example.com#format-demo
| Field | Example value | What to check |
|---|---|---|
| Server and port | node.example.com:443 | The server's listening address—not the local proxy port. |
| encryption | none | Specifies encryption at the VLESS protocol layer. In this example, TLS provides additional transport security. |
| security and sni | tls、node.example.com | Set the transport security and TLS server name. Both must match the server's requirements. |
| type and path | ws、%2Fgateway | Selects WebSocket; the decoded path is /gateway. |
| host | node.example.com | The Host value for WebSocket in this example. Don't assume it should match the server address in every deployment. |
Don't copy only the server, port, and UUID. If SNI, the transport path, or Host is missing, the node may import successfully but fail during the handshake. REALITY configs also use parameters such as a public key and short ID. Preserve them from the original link and make sure your chosen core supports them; changing only the security value doesn't convert the config.
Choose the right import method in v2rayN
Keep a copy of the original text before importing it. The steps below use common menu labels in the Chinese v2rayN interface; depending on the version, commands may be in the top menu or a context menu. If the wording differs slightly, look for the options for subscription groups, bulk import from clipboard, or custom configs. Don't mix up these different import methods.
- Import a subscription URL: Open “Subscription Group” → “Subscription Group Settings,” add a group, enter a remark and subscription URL, then save. Next, open “Subscription Group” and select “Update current subscription (without proxy).” If the subscription server requires an existing working proxy, choose “Update current subscription (through proxy)” instead.
- Import share links: Copy the complete
vmess://orvless://text, then open “Servers” → “Import bulk URLs from clipboard.” When importing multiple links, put each one on its own line. Don't include chat timestamps, numbering, or other text. - Import a full JSON config: First check whether the config is for Xray or V2Fly. Then use “Add custom config server” under “Servers” to select the config file and verify the core type. Don't paste a full JSON config into the subscription URL field.
- Verify the result: Check the number of nodes in the list, then open a node's edit window to review its address, port, transport, and security settings. Select a node as the active server and check the logs for config parsing or handshake errors.
What you can—and can't—convert between share links, Base64, and JSON
First decide which information you need to preserve. Converting a node list to Base64 usually changes only how the text is wrapped. Converting a full JSON config to a single share link, however, reduces an entire runtime setup to one node. These are two different kinds of conversion.
| Conversion | How to do it | What may be lost |
|---|---|---|
| Share links → Base64 list | Join the complete links, one per line, then Base64-encode the UTF-8 text. | Encoding shouldn't remove fields, but it won't create an updateable subscription service. |
| Base64 list → share links | Decode the outer layer locally and keep each line's protocol prefix and parameters intact. | Manual line breaks, truncation, or character substitution can break links. |
| Share link → core JSON | Have the client parse it, then generate a runtime config using the local inbounds, DNS, and routing settings. | The output depends on client settings; there isn't one fixed result. |
| Core JSON → share link | Select a representable proxy outbound and map it to the matching share-link format. | Listeners, DNS, routing, and relationships between multiple outbounds usually can't be fully preserved. |
Export nodes from v2rayN for migration
Select the node in the server list, open the context menu, then choose “Share URL to clipboard” under “Share server.” Some versions put the share command directly in the context menu. After sharing multiple nodes, check the line count in a local text editor before importing them on the target device. Custom-config nodes may not support export to a standard share link.
- Test one before exporting in bulk: Export a single node, import it into a test group, and compare its transport type, SNI, path, and remark.
- Keep nodes and subscriptions separate: Importing a share link usually creates a standalone node; it doesn't carry over the original subscription URL or update schedule.
- Don't just change the protocol prefix: Changing
vmess://tovless://doesn't convert the protocol. The server must also provide the matching protocol and identity settings.
Why you can't turn any JSON into vmess://
Using JSON doesn't mean the field structures match. The snippet below is an outbound from an Xray config—not a complete working config or a legacy VMess share payload. Even if you Base64-encode it and add the protocol prefix, clients won't get the correct share-link fields.
{
"outbounds": [
{
"tag": "proxy",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "node.example.com",
"port": 443,
"users": [
{
"id": "b85a420b-f879-44e5-88eb-7ddc1d26908e",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"tlsSettings": {
"serverName": "node.example.com"
},
"wsSettings": {
"path": "/gateway",
"headers": {
"Host": "node.example.com"
}
}
}
}
]
}
Migrating between desktop and Android: reuse the source, check compatibility on each device
If you use multiple devices, save the original subscription URL from the provider and import it separately on each one. v2rayN is a desktop client. On Android, v2rayNG uses the Xray core, while v2flyNG uses the V2Fly core. A subscription being parseable and every node in it being supported by the current core are two separate things.
Migration plan: handle standard nodes and custom configs separately
Standard subscriptions and share links
- Add the original subscription URL again on the target device.
- If you're moving only a few nodes, export their complete share links.
- Configure system proxy, per-app proxy, or routing separately.
Full JSON configs and custom routing
- First check which config import methods the target client supports.
- Check the core type, file paths, and listening ports.
- Check core support for VLESS, REALITY, and other features individually.
Using the same subscription source doesn't mean using the same settings. Verify each device's entry point, DNS, and routing separately.
A full config may also reference absolute file paths or local resources on the desktop. You can't copy those paths as-is to Android. Even when both devices use the same core, check that the core versions and config fields are compatible. Don't treat “the file opens” as proof that it works.
Common subscription format issues and how to troubleshoot them
Why is the list empty even though the subscription update succeeded?
Switch to the relevant subscription group and clear any list filters, then check the logs for the number of valid nodes. A successful download can still yield no importable nodes if the response is a login page, empty content, or an unsupported config format. Go back to the provider's page and copy a subscription URL for your client.
Where do I paste a long Base64 string?
Decode it locally first and check the contents. If the result is a list of share links, one per line, copy the complete decoded list and choose “Servers” → “Import bulk URLs from clipboard.” If it's a full JSON config, use the custom config option for the corresponding core. Don't add a protocol prefix to it.
Why does an imported converted link still fail to connect?
Open the original and new nodes in their edit windows and compare the security type, SNI, Host, path, and related protocol parameters one by one. In particular, check whether %2F was encoded again as %252F, and whether a chat app truncated the query parameters after &.
Can a subscription update overwrite manually edited nodes?
Nodes in the same subscription group may be replaced or recreated during an update. To keep your changes, export the share links first, import them into a separate manual group, and check the result after the next update. Don't rely on subscription entries as a stable backup of local configs.
Will Base64-encoding a node list make it update automatically?
No. Base64 changes only the text representation. Automatic updates also require a subscription URL the client can access and compatible content that's kept up to date at that URL. A locally encoded text file is just a static node list; it won't receive later changes from the provider.
Troubleshoot in this order: confirm the source is correct → check that the response is compatible → verify all fields are present → confirm core support. Fix the format before investigating the connection. Keeping the original subscription and a redacted error log is more useful than repeatedly trying different conversions.