Saving a subscription URL in Shadowrocket does not mean nodes have been retrieved or parsed. This guide is for users who already have their own provider and subscription. Check in order: display state, URL, response content, manual update, and automatic update. Keep the original configuration and error details, then run one observable update to pinpoint the issue instead of repeatedly deleting and reimporting the subscription.
First, tell an empty list from a collapsed group or a connection failure
In Home, check the subscription group you just added. Seeing the group name only confirms that an entry was saved locally; it does not mean the subscription request succeeded or that the response contains recognizable nodes. If the group is collapsed, expand it and clear any search filter before confirming that the list is actually empty.
“No nodes” and “nodes won’t connect” are different stages. For an empty list, check the URL, response, and parsing. If nodes are available to select, then troubleshoot the server address, port, credentials, and connection path. Don’t change protocol settings or repeatedly switch Global Routing before the list has loaded.
- Group appears but has no nodes: Record the result of this update and check the subscription request and response content.
- Nodes appear after expanding the group: Check whether only the display state changed; don’t create another subscription with the same name.
- Nodes are listed, but the test fails: Keep the existing list and troubleshoot the connection separately; a latency test does not update the subscription.
- Old nodes remain, but new ones are missing: Check whether the latest update actually completed. The old list does not prove that the latest request succeeded.
Check the URL: copy the subscription link, not the account page
Open your provider’s account page and use its clearly labeled subscription-copy option. Don’t copy the account homepage URL from your browser’s address bar or paste an entire set of sharing instructions. A page that opens in a browser may be a login page, help page, or error page—not subscription content Shadowrocket can parse.
The example below uses a fake value to illustrate URL structure; it is not a usable subscription. Query parameters may be used for authentication. The parameter may not be named token, so don’t replace your actual fields with the example.
https://example.com/sub?token=xxxx
- Check the beginning and end: Make sure the link is complete, with no extra spaces, line breaks, quotation marks, or punctuation.
- Keep the original characters: Don’t change anything after
?,&,=, or%, and don’t decode and reassemble the URL yourself. - Check where you copied it from: Chat messages, email previews, and text recognition from screenshots can truncate long URLs. Go back to the original page and copy the link again.
- Confirm what the URL is for: A subscription URL retrieves a set of nodes. A single-node share link and a Config file are different input types.
- Check your credentials: If you reset your subscription credentials, the old link may no longer work even if its format is correct. Get your current link again.
Step-by-step: run one manual update in Home
Keep the existing entry, then check its type and URL. Home manages nodes and subscriptions; Config manages configuration files. Importing a subscription URL as a Config file is not the right way to troubleshoot an empty node list. Follow the subscription flow in Home below; button labels may vary by app version.
-
Record the current state
In Home, expand the target group and note the current node count, update message, and exact error text. If you already have a working configuration, keep it—don’t delete everything.
-
Check the type
Open the existing subscription’s edit screen. If you need to add it again, go to Home → “+” in the upper-right → Type → Subscribe. Don’t enter a subscription URL as the settings for a single server.
-
Check the URL
Paste your complete subscription URL into the URL field. Use a clear label that contains no credentials, check that the URL hasn’t been truncated, then save.
-
Update manually
Return to Home and pull down to refresh. Wait for the update to finish. If you have multiple subscriptions, check the result for the target group; a successful update in another group doesn’t mean this one succeeded.
-
Check the result
Expand the target group again and check whether nodes have appeared or the list has changed. If it’s still empty, save the exact error and the time it occurred, then check the response content.
Keep the network and configuration unchanged during troubleshooting. Don’t reset the URL, switch networks, change routing, and reimport all at once. Change one thing at a time to determine whether the URL correction or a different network path made a difference.
Check the server response: HTTP success doesn’t mean the content can be parsed
Fetching a subscription and connecting to a node are two separate network operations. Even with an HTTPS subscription URL, the response could be a login form, an access verification page, or an empty body. The HTTP status code indicates how the request was handled; whether nodes appear also depends on the response body and its format. Don’t assume the subscription is working just because the URL opens.
The standard HTTP response phrases below can help you compare details shown in the app with response records from your provider. They are not a guarantee that Shadowrocket will display these exact words. If you only see a generic failure message, record it verbatim rather than guessing the status code.
401 Unauthorized
Cause and fix: The request is missing valid authentication details or authentication was rejected. Ask your provider to confirm that your subscription credentials are valid, copy your current link again, and retry the update.
403 Forbidden
Cause and fix: The server rejected the request, possibly due to account permissions or access restrictions. Share redacted details with your provider so they can check the reason. Don’t rely on switching routing settings and guessing.
404 Not Found
Cause and fix: The requested resource wasn’t found. First check whether the URL was truncated or the old endpoint has been retired, then confirm the current subscription link.
429 Too Many Requests
Cause and fix: The request limit was reached. Stop refreshing repeatedly and wait as directed by the server. If a Retry-After header is provided, follow its instructions.
Bottom line: if the list is still empty after a 200 response, check the response body first
Ask your provider to confirm that the URL returns non-empty subscription content in a format Shadowrocket supports—not a webpage or another format. Troubleshooting parsing is useful only after you’ve received the right content.
Network and parsing: distinguish a request timeout from incompatible content
A request timeout, DNS resolution failure, or TLS verification failure happens before parseable content is received; none can be directly attributed to a particular node protocol. Check the device’s date and time, and whether the current network requires web-based sign-in. Then run one comparison update on another network available to you. If you see a certificate error, don’t work around it by disabling verification or installing a certificate from an unknown source.
| What you observe | What to check first | Next step |
|---|---|---|
| Times out after a long wait | The request path or server response did not complete | Keep the URL unchanged, try once on another available network, and note the time |
| A login or verification page is returned | The response is a webpage, not node data | Confirm that the subscription endpoint allows direct retrieval by the app |
| The request completes, but the response body is empty | The account may have no entries to return | Ask your provider to check the account status, access permissions, and response records |
| The response body is not empty, but the list is empty | Check the content format and entry fields | Confirm the export format is supported by Shadowrocket, and troubleshoot with a redacted sample |
| Some entries appear | This does not necessarily mean the entire subscription is inaccessible | Compare the types and required parameters of missing entries; don’t check only the total count |
Proxy, Direct, Config, and Scene in Global Routing are routing choices, not subscription format converters. If the path used for an update depends on a proxy that is no longer available, it may affect the request. That doesn’t mean every subscription must be updated in a particular mode. Note the current selection, then run a comparison changing one variable at a time based on the error and available networks.
Don’t assume subscription text is damaged just because it “looks encoded.” Subscriptions may use different formats; don’t arbitrarily Base64-decode them, delete lines, or change protocol names and overwrite the original. Check whether the source returns the right format and whether entry parameters are complete, rather than manually assembling a list that merely looks valid.
Update timing: verify a manual update before checking automatic updates
The initial import, a manual refresh, and later automatic updates are separate events. Saving a URL doesn’t mean it was immediately fetched in the background. Having automatic updates enabled also doesn’t prove a request succeeded at any given time. First run an observable manual update in the foreground, then check the subscription’s automatic update settings and interval available in the app. The exact menus and options depend on what the app currently displays.
- The app hasn’t been opened for a while: Open Home and run an update manually. Don’t assume the list should have changed just because the configured interval has elapsed.
- The account was just reactivated: Ask your provider to confirm the change has taken effect, then run an update. What the app displays locally does not prove the server has applied the change.
- Subscription credentials were just reset: Replace the URL saved in the app, then update. Refreshing the old URL repeatedly won’t restore revoked credentials.
- Manual update works, but there’s no change after an automatic update: Note whether the app was in the foreground, the device’s network, and the current update settings. Distinguish between no new content, no update trigger, and a failed request.
- Both manual and automatic updates fail: Go back to the URL and response checks. Don’t just shorten the update interval, as this may trigger rate limits.
What to send for troubleshooting and how to verify recovery
If the list is still empty after these checks, send your provider a reproducible report; it’s more useful than simply saying “the import failed.” Don’t include your full subscription credentials. If your provider needs to check your account, use their existing private support channel. This site does not provide, sell, or recommend nodes or subscriptions; this article only explains how to check information you already have.
- What happened: Say whether the group is empty, some entries are missing, or nodes appear but won’t connect.
- When it happened: Include the date, time, and time zone so the provider can find the corresponding server request.
- What you did: Describe the result of a manual update in Home and whether you changed networks.
- Error: Include the exact error text. If no status code was shown, don’t guess or add one.
- Environment: Note the device, OS, and version information available in the app. Don’t share URLs, passwords, tokens, or complete QR codes.
After the list returns, make sure entries appear in the target group, then select one of your nodes and test the connection. If only one node won’t connect, stop reimporting the subscription and check that node’s settings and service status instead. After a successful manual update, observe the next automatic update to see whether the problem occurs only at a particular time.
Buying the app ≠ buying a connection plan. Shadowrocket is a paid app for Apple platforms, available exclusively on the App Store; purchasing the app does not include a connection service. For system requirements on iPhone, iPad, and other compatible Apple devices, check the App Store listing.