Check the link prefix before choosing an import method: add HTTPS subscription URLs to a subscription group, and import vmess:// or vless:// node links from the clipboard. This guide covers saving, updating, selecting a server, and connecting on desktop and Android, along with how to identify Base64 subscriptions, troubleshoot update errors, and reuse a subscription across devices. For first-time setup or when a subscription appears to be added but the server list is empty.
First, tell subscription URLs and node links apart
A subscription URL is a web address used to retrieve a list of servers, and usually starts with https://. After saving the URL, the client must fetch it and parse the response to build the server list. A web dashboard login, a plan page, and a subscription URL are different things. Copy the link labeled “subscription URL” or the one marked as compatible with your client.
By contrast, vmess:// and vless:// usually describe a single node. They contain connection parameters and aren’t meant to be opened as web pages. Pasting a node URI into a subscription URL field may trigger an unsupported URL scheme error; importing an HTTPS subscription URL as a regular node may result in a “no servers found” message.
HTTPS subscription URL
RecommendedSave it to a subscription group, then update the group. Updates can retrieve changes such as added or removed nodes and URL changes, depending on the subscription provider.
Best for: ongoing use and regularly updated server lists.
VMess / VLESS share link
Copy the complete URI and import it from the clipboard or a QR code. The imported connection details are a snapshot; they won’t update automatically if the original node changes.
Best for: testing a single node, a temporary transfer, or connection details provided individually by an administrator.
v2rayN: Add a subscription group and update servers
v2rayN is a desktop client. These steps apply to macOS and can also help you navigate the Windows and Linux interfaces. Button locations and labels may vary between releases, but the basic flow is always the same: create a group → enter the URL → save → update. The menu names below are common in the Chinese interface. If “Update without proxy” is labeled “Direct” in your version, choose the equivalent option.
-
Open subscription groups
In the main window, go to “Subscription Group” → “Subscription Group Settings,” then click “Add” or “+.” Don’t open the manual VMess/VLESS server settings.
-
Enter the URL
Enter a recognizable name in “Alias,” such as “Daily subscription.” Paste the full HTTPS URL into “Optional address (Url)” or the subscription URL field. Make sure it has no surrounding quotes, spaces, or line breaks, then save.
-
Run an update
Return to the main window and select “Subscription Group” → “Update all subscriptions (without proxy).” Try this first if you don’t have a working server yet. If the URL is only reachable through an existing proxy and you have a working connection, choose the option to update through the proxy instead.
-
Check the server list
Switch to the group you just created and confirm that server entries appear. Check that the protocol, address, and port are complete, then right-click a server and choose “Set as active server.” Some versions let you select one by double-clicking.
-
Enable the proxy
Make sure the core is running, then choose “System Proxy” → “Automatically configure system proxy.” Test access in a browser and check the logs for connection errors. A successful import only means the server list was parsed; it doesn’t mean system traffic is going through the proxy.
If you received one or more node URIs rather than a subscription URL, copy the complete text and use “Server” → “Import bulk URLs from clipboard.” You don’t need to create a subscription group. Bulk imports usually put one URI on each line. Don’t include explanatory text, code fences, or ellipses from a chat message.
v2rayNG: Subscription settings and update options
v2rayNG is an Android client that uses the Xray core. Its menus differ from desktop v2rayN, but the process is the same: save the subscription, then update it. Don’t confuse “Import from clipboard” with subscription management: the former is mainly for node links, while the latter saves a URL that can be fetched again later.
- Open subscription management. Open the top-left side menu, select “Subscription Group Settings,” and tap “+” in the top-right corner. Enter a remark, paste the subscription URL in “Optional address (URL),” then tap the confirm button in the top-right corner to save.
- Return to the update list. Go back to the main configuration screen, open the top-right menu, and select “Update subscription.” Wait for the update to finish, then check the configuration list. Saving a URL in subscription settings alone doesn’t mean it has been fetched successfully.
- Select a node and connect. Tap the configuration you want to use, then tap the connect button in the bottom-right corner. The first time you connect, Android will show a VPN connection request. Approve it so the client can create a local tunnel to handle traffic.
- Check the connection status. Review the client status and logs, then test access. The Android VPN icon means a tunnel has been established; it doesn’t guarantee the remote server is reachable or that DNS, authentication, and transport settings are correct.
To import a single node, tap “+” in the top-right corner of the main screen, then “Import from clipboard.” To scan a QR code, tap “+” → “Scan QR code.” A QR code is just a way to encode text, not a separate proxy protocol. After scanning, check whether it contains a node URI or a subscription URL; add the latter through subscription management.
- Network error during update: Confirm the device can reach the subscription provider; if needed, retry over an existing working connection.
- No nodes after updating: Check the group filter in case you’re still viewing a different group.
- A node works, but one app bypasses the proxy: Check whether per-app proxying is enabled and whether that app is excluded.
How Base64, vmess://, and vless:// formats relate
Base64 is an encoding for representing binary data as text, not encryption or a proxy protocol. Traditional universal subscriptions often combine multiple node URIs into one text block and Base64-encode the whole block. The client decodes it, then parses the URIs line by line. Some subscriptions return plain-text URIs or different content depending on the client, so subscription formats don’t all look the same.
A common VMess share link has a vmess:// prefix followed by Base64-encoded JSON containing the server address, port, user ID, and transport settings. VLESS share links usually use a URI structure, with the user ID, host, and port in the main part and TLS or transport options in the query string. Don’t assume a VLESS URI can be decoded by treating everything after the prefix as Base64.
HTTPS subscription URL
→ Fetch subscription content
→ Identify the outer encoding (such as Base64)
→ Get one or more vmess:// or vless:// URIs
→ Parse them into server entries in the client
vmess:// share link
→ Commonly Base64-encoded JSON
→ Read the address, port, identity, and transport settings
vless:// share link
→ Parse the URI body, query parameters, and remark
→ Read the address, port, identity, and transport settings
- Padding with equals signs at the end isn’t necessarily an error. Standard Base64 may use
=for padding, though some implementations omit it. Don’t judge a subscription’s validity by whether it ends with an equals sign. - URL encoding and Base64 are different. Values such as
%20in a URI use percent encoding. Blindly replacing characters or decoding repeatedly can corrupt remarks or query parameters. - A full configuration file isn’t a list of URIs. JSON configurations and other structured files may not work with a subscription import option. Use a format supported by the provider rather than simply changing the file extension.
If the response starts with an HTML page, it’s often a login page, access verification page, or error page—not a parseable node subscription. A successful HTTP request and a successful subscription parse are separate steps. Even a 200 status can return a body with no nodes at all.
Subscription update failed? Check the network, response, and nodes
Read the update log before deciding to recreate the group. Repeatedly deleting and adding the same broken URL won’t fix access or format issues. Keep any working nodes, and identify whether the failure happened while fetching the subscription or later, when connecting.
| Symptom | What to check first | Next step |
|---|---|---|
| Request timed out or DNS lookup failed | The client hasn’t received the subscription response yet; this is a network access issue. | Check the network and DNS, then compare updates made directly with updates made through an existing proxy. |
| Returns 401 or 403 | Common causes include an expired token, access restrictions, or a security check. | Copy the subscription URL again from the provider’s platform and check your account status. Don’t assume the exact cause from the status code alone. |
| Parsing failed or 0 nodes detected | The response may be a web page, an incompatible format, or empty. | Choose a subscription format compatible with v2rayN/v2rayNG, then check the group filter and update log. |
| Nodes appear, but authentication fails | The subscription was fetched successfully; the issue is with the node settings or server. | Update the subscription and select the node again. Check the account’s validity period, identity settings, and device time. |
| Client starts, but the browser can’t connect | Possible causes include system proxy settings, per-app rules, DNS, or node connectivity. | Check local traffic routing and connection logs separately. Don’t classify the issue as “subscription not imported” again. |
Using a subscription on Mac and Android: what syncs and what doesn’t
Whether you can use one subscription on multiple devices depends first on the provider’s device, concurrency, and access limits. Saving the same URL in multiple clients doesn’t mean your account allows simultaneous connections. Check the service terms, then import the URL on each device. You don’t need to copy the entire runtime configuration from your Mac to Android.
Use the same subscription on both devices; update each separately
Desktop v2rayN
- Save the provider’s URL in a subscription group.
- Choose an active server after updating.
- Configure system proxy and routing rules separately.
- If auto-update is enabled, check the update interval and when it runs.
Android v2rayNG
- Save the same URL in subscription group settings.
- Return to the main screen and update the subscription.
- Choose nodes and per-app proxy settings separately.
- If the provider resets the token, update the URL on this device too.
What’s shared is the subscription source, not every local setting. The server lists may still differ depending on update times, client compatibility, and the content returned by the provider.
Subscriptions usually sync node connection details, but not local routing, DNS, system proxy status, per-app lists, or the currently selected node. QR code sharing usually copies static details for a single node. To keep up with updates from the provider, save the subscription URL. Use a node URI or QR code only when you need to transfer a temporary configuration.
- Update once after importing. Confirm the group has nodes before troubleshooting connections or routing.
- After the provider changes the subscription, update both devices. A successful update on one device won’t refresh the other device’s cache.
- Replace the URL on every device after resetting it. An old URL left on another device may continue to fail during updates.
- Use clear group names. Label groups by provider or purpose so temporary nodes aren’t mistaken for long-term subscription entries.