If your Shadowrocket subscription list is empty, first confirm that you saved the complete subscription URL. Then check that your provider returns parseable subscription content and verify that the update finished. This guide assumes you already have your own provider and subscription. It distinguishes an incorrect URL, a failed request, invalid content, and a display issue. Keep existing entries, change only one condition at a time, and don’t confuse a failed subscription fetch with a connection failure.
Identify where the process fails
A subscription update has three steps: reading the saved URL, sending a request to that URL, and parsing the response into entries. An empty list only means no usable entries are visible; it doesn’t prove that a protocol is unsupported or that all connection settings are invalid. First check whether the subscription group and any existing entries are still visible in Home, and note the message shown during the update.
Bottom line: check the response before changing connection settings
If the subscription hasn’t produced any entries, check the URL, request result, and response format first. Changing a single entry’s port, password, or protocol won’t fix a subscription server that returns a login page or empty content.
If existing entries remain but the update fails, keep the subscription and note the error first. If entries appear but won’t connect, troubleshoot their connection settings and network path instead. These are different issues; repeatedly deleting and re-adding the subscription is no substitute for identifying the cause.
Check the complete subscription URL
Copy the URL intended for Shadowrocket from your own provider account. Your account homepage, help page, and subscription URL may use the same domain but return different content. A URL starting with https:// isn’t necessarily a subscription URL. Check its path, query parameters, and the purpose specified by your provider.
https://example.com/sub?token=xxxx
The example above shows the structure only; don’t use it to import a subscription. example.com is a sample domain, and xxxx is a dummy value. The token in an actual URL is often used for authentication, so keep the complete value supplied by your provider. Parameter names can vary; don’t copy names or values from this example into your URL.
-
Copy the complete URL
Use the copy subscription URL feature in your provider account to avoid transcribing it from a chat preview or screenshot. Check that there are no spaces, line breaks, Chinese punctuation, or explanatory text at either end.
-
Check the import type
Go to Home → “+” in the top-right corner → Type → Subscribe. This adds a subscription URL. Config is for configuration files; don’t mix up the two import options.
-
Check the URL
Paste the complete URL into URL, then check that
?,&,=, and all parameter values are intact. If the URL contains percent-encoded characters, use the original copied URL; don’t decode or edit it manually. -
Save and update
After saving, return to Home, start an update for that subscription, and wait for the result. You can pull down to refresh in Home; use the update control shown in your version of the app. Note the message and any changes to the entries, and avoid submitting repeated requests.
Pay special attention to URLs copied from webpage source or rich text: a parameter separator may have been converted to the literal &, while a real URL usually uses &. Don’t rely on appearances alone. Copy the URL again from your provider account, then compare it character by character with the saved URL in the app.
Check the provider’s response
Even a correct URL can fail to fetch. Sign in to your provider account and confirm that your subscription access is active, that it hasn’t expired, and that the URL hasn’t been reset. If your provider recently generated a new URL, the old one may no longer work. The old URL saved in the app won’t update automatically; check it against the current URL in your account.
The HTTP statuses below are shown in their original English form to help identify server responses. They don’t mean Shadowrocket will necessarily display the same wording. Follow a status-specific step only if you see that status in an actual message, response record, or provider reply. If you can’t obtain the status, don’t guess based on an empty list.
Error: 401 Unauthorized
Cause and fix: The request wasn’t authorized by the endpoint; a parameter may be missing or the credentials may have expired. Copy your current subscription URL again, check its authentication parameters, and confirm your subscription access with your provider.
Error: 403 Forbidden
Cause and fix: The server refused the request. The reason depends on its access policy. Note when it happened and which network you were using, then ask your provider to check the relevant restrictions. Changing protocol settings won’t resolve this.
Error: 404 Not Found
Cause and fix: The server couldn’t find a resource at the requested path. Check whether the URL was truncated or its path has changed, then copy the complete URL again from your provider account.
Error: 429 Too Many Requests
Cause and fix: The server is rate-limiting requests. Stop refreshing repeatedly. If the response includes Retry-After, wait for the specified time; otherwise, ask your provider how often you can update.
A successful HTTP request doesn’t guarantee successful parsing. For example, the server may return 200 OK but provide a login page, account notice, or maintenance page that the app can’t parse as subscription entries. Ask your provider to confirm the content type returned by the subscription endpoint. A page opening in a browser doesn’t prove the subscription is usable.
Distinguish invalid format from empty content
The subscription’s container format and the protocols used by its entries are separate things. Shadowsocks, VMess, VLESS, Trojan, Hysteria2, and WireGuard are protocol names; their presence doesn’t mean a subscription response can be imported. Even if the app supports a protocol, the response must use a subscription format the app can recognize and contain valid entries.
| What you observe | Check first | Next step |
|---|---|---|
| The response is an HTML login page | Check whether you copied the account page URL by mistake or were redirected to a login page | Get the dedicated subscription URL again and ask your provider to confirm that the endpoint doesn’t require a browser login session |
| The response body is empty | Check whether the account has entries to return and whether the endpoint is working | Ask your provider to check the subscription content for your account, and keep existing entries |
| The response has content but can’t be parsed | Check the export format, encoding, and content integrity | Confirm that you selected an output format supported by Shadowrocket |
| Only some entries appear after updating | Check the number of entries returned by the server and any filters in the app | Clear the search, expand the group, and compare the list with what your provider expects to return |
Don’t repeatedly encode or decode the subscription body without knowing why, and don’t delete line breaks or separators just because they look unnecessary. Doing so can alter the original format and turn a server-side issue into a new parsing problem. First get an unedited subscription URL again, then ask your provider to check the original response.
A rules file isn’t the same as a node subscription. DOMAIN-SUFFIX, GEOIP, IP-CIDR, and FINAL are used for rule matching and policy selection. Configuration content containing these keywords won’t necessarily create connection entries in the Subscribe group in Home. If you’re unsure about the format, confirm whether your provider supplied a subscription or a configuration file.
Check the update timing
After your provider changes account permissions, resets the URL, or updates subscription content, the app needs to send another request to retrieve the latest result. Saving a URL, starting an update, and completing parsing are separate actions. Check the completion message and whether the entries changed. An unchanged list doesn’t necessarily indicate a failure; the server may have returned the same content.
- Check once after saving: Confirm that the URL was saved, then update the intended subscription. Don’t refresh again while the request is still in progress; that can make the results harder to distinguish.
- Check after a permission change: Confirm with your provider that the change has taken effect, then update. If the URL was also reset, replace it first; refreshing the old URL won’t work.
- Check after changing networks: Try the same URL on available Wi-Fi and cellular networks, and note which one completes the update. Change only the network during each test; don’t also change the URL or protocol.
- Stop retrying if rate-limited: Wait as directed by the server. There’s no single refresh interval that works for every subscription, and repeatedly tapping refresh isn’t a solution.
Record the connection mode as well. Home → Global Routing options such as Proxy, Direct, Config, and Scene affect routing choices; Settings → On Demand controls connections based on conditions. Neither parses subscription content. On Demand may affect the connection state during testing, so check the actual state before comparing results. Don’t mistake it for a scheduled subscription update setting.
Bottom line: test one variable at a time using the same URL
If the same subscription updates on one network but fails on another, first check the failing network’s path to the subscription domain. If both networks receive a response but neither can parse it, ask your provider to check the output content and format.
Check whether the empty list is a display issue
If there’s no clear error after an update but Home shows no entries, rule out display filters before concluding that the server returned an empty list. Check for text in the search field, a collapsed subscription group, or a different group than the one you just updated. When several subscriptions have similar names, it’s easy to mistake one group’s update result for another’s list.
- Clear the search in Home, expand the target subscription group, and make sure you’re not viewing only matching results.
- Check that the URL saved for the target group matches the one you just copied. Don’t share screenshots showing sensitive parameters.
- Record the number of entries and the message before and after the update. If no update time is shown, don’t treat the device’s current time as the app’s reported completion time.
- Ask your provider which entries this account should return. If the server returns an empty response, refreshing locally can’t add content that isn’t there.
If entries appear but an individual entry won’t connect, check its protocol, server address, port, and authentication details separately. Subscription requests usually use HTTPS on port 443, but a URL can specify another port. That port isn’t necessarily related to the connection port of each server in the subscription, so don’t change every entry to 443.
Keep evidence before contacting support
If the checks above don’t identify the cause, put together a record that can be reviewed. The goal is to help your provider confirm whether the request reached the server, whether authentication succeeded, and what content was returned—not just to report that “it doesn’t work.” Accurate timing, symptoms, and reproduction steps reduce back-and-forth and help prevent a connection issue from being mistaken for a subscription issue.
- Where it happened: Was it a subscription update in Home → Subscribe or a configuration import in Config? Describe them separately.
- Exact message: Record the error exactly as shown. Don’t report a suspected HTTP status as if the app displayed it.
- When it happened: Include the date, time, and time zone so your provider can match the request to its logs. This is the time of the issue, not an app update date.
- Conditions tested: Record whether you used Wi-Fi or cellular, the actual connection state, whether the URL had just been reset, and the one change made in each test.
- What changed: Note whether entries were present before and after the update, whether old entries remained, whether you cleared the search, and what your provider expected to return.
Shadowrocket is a closed-source commercial app for Apple platforms, primarily used on iPhone and iPad, and is available exclusively on the App Store. Check the App Store page for system requirements and purchase availability. To verify the app’s source, check that the developer is Shadow Launch Technology Limited, and confirm the official app icon and app ID 932747118 before continuing to troubleshoot the subscription.