If an existing subscription will not update, keep the current server list and check the URL, account status, network request, and response content. Then try one update and note the result. These steps are for users who already have a subscription from their provider. They help distinguish a request that did not complete, a response that is not subscription data, and a list with no usable entries—without making things worse by repeatedly deleting and recreating the configuration.
1. Tell an update failure from an empty list or a connection failure
Shadowrocket subscription updates use the saved URL to request server entries, then display recognized content in Home. A successful update does not mean every server can connect; a failed server connection does not prove the subscription URL is invalid. First identify where the process fails instead of changing the subscription, rules, and server settings all at once.
In Home, expand the relevant subscription group to check whether it is simply collapsed. Clear any search or filter. Note how many entries were listed before the update, then check whether the old entries remain, the list is empty, or only the connection test fails. Each result calls for a different troubleshooting path.
| What you see | Check first | Leave unchanged for now |
|---|---|---|
| Update error; old entries remain | URL, network access, server response | Existing server settings |
| No entries after expanding the group | Account status, response content, output format | Routing rules in Config |
| Entries are present, but connections fail | Server status, authentication details, TLS settings | A confirmed working subscription URL |
2. Check the entire URL—not just the domain
Get the subscription URL from your provider. Use its subscription-copy option, not the URL of an account page, login page, or billing page. The sample below is fictitious and cannot be used as a subscription. Real URLs may have different paths, parameter names, and lengths; do not try to construct one from the example.
https://example.com/sub?token=xxxx
- Check the beginning and end: Make sure the scheme, domain, path, and all query parameters were copied. A messaging app wrapping a URL onto multiple lines does not necessarily change it, but selecting the text manually can omit the last part.
- Remove surrounding text: Do not include labels such as “Subscription URL:”, quotation marks, trailing punctuation, or line breaks in the URL field. Do not remove symbols that are part of the URL.
- Keep parameters intact: Query parameters usually follow
?, and&separates them. Replacing these with non-ASCII punctuation changes the URL. Do not alter capitalization or decode percent-encoded characters again. - Copy it again: In Home, open the relevant Subscribe entry for editing and check the URL. To add it again, use the add option in Home to open Add Server, choose Subscribe, and enter the URL. Keep the old entry for now so you do not lose servers that still work.
Some web page source uses & to represent the separator &. Copying directly from the source may include that representation in the URL. Use the provider page’s copy button when possible, and do not run a global replacement on a URL that was copied correctly.
3. Check with your provider: an active account does not guarantee a response with entries
Your app purchase and provider account are separate. Buying the client does not include a service plan. Restoring your Shadowrocket purchase in the App Store will not restore your provider account benefits or replace an expired subscription URL. Once you have confirmed the URL is complete, check your account’s validity period, remaining data, whether the subscription URL has been reset, and any request limits specified by your provider.
These are HTTP status codes, not messages Shadowrocket is guaranteed to show verbatim. Follow the relevant steps only if the status appears in an error provided by the app or is confirmed by your provider. An empty list alone does not mean your account has expired.
HTTP 401 Unauthorized
Why: The server did not authenticate the request. The token may have expired, or the URL may have been reset.
What to do: Get a currently valid URL from your provider, replace the saved URL in full, and try updating again.
HTTP 403 Forbidden
Why: The server denied this request, possibly because of account permissions or access conditions. Do not assume the password is the only issue.
What to do: Ask your provider why the subscription request was denied, then follow its instructions for the account or access restriction.
HTTP 429 Too Many Requests
Why: The request triggered the server’s rate limit, so further refreshes may also be rejected.
What to do: Stop manual updates. If the response includes Retry-After, wait as instructed; otherwise, ask your provider when requests can resume.
Bottom line: address confirmed server-side denials first
If the response is confirmed as 401, 403, or 429, resolve the related authentication, permission, or rate-limit issue first. Rewriting Config or repeatedly adding the same URL will not fix it.
4. A successful response but no servers? Check the content, not just the status code
HTTP 200 only means the server returned a successful response; it does not guarantee that the content is a subscription Shadowrocket can parse. A login page, verification page, or expiration notice may also return 200. The domain may be reachable and the page may open normally, while the response contains no importable server entries.
- HTML page returned: If your provider confirms that the response is an HTML login or verification page, correct the subscription entry point or server access conditions. Do not keep using the page URL as a Subscribe URL.
- Empty response body: Ask your provider to check whether entries are actually assigned to your account and whether its subscription generator is working. Clearing local rules will not create servers from an empty response.
- Output format mismatch: Use a subscription entry point your provider explicitly identifies as compatible with Shadowrocket. Base64 is only an encoding method; it does not make arbitrary encoded content a valid subscription.
- Incomplete entries: Ask your provider to check the protocol fields and serialization output. Do not turn error-page text into server settings by hand or guess missing Address, Port, or authentication values.
Subscribe in Home manages subscription servers; configuration files in Config may include rules and other settings. Do not use a configuration file URL, rules list URL, and server subscription URL interchangeably. If your provider offers several entry points, confirm what each one is for before choosing the right type.
| Confirmed response | What it means | Next step |
|---|---|---|
| 200 with an HTML page | The request succeeded, but the content is not a server subscription | Check the subscription entry point and redirect destination |
| 200 with an empty body | No body content to parse | Ask your provider to check the generated output |
| 200 with non-empty subscription content | The format and entry fields still need to be checked | Share a redacted error and ask your provider to check the output |
5. Check the network and update timing—change one thing at a time
An update first needs to resolve the domain, connect, and complete HTTPS TLS validation before parsing the subscription. A request timeout and a parsing failure occur at different stages. After switching networks, an existing connection may not have recovered yet; after renewing an account, the server may also need time to update its status. Use the actual request result and your provider’s guidance—there is no universal wait time that guarantees recovery.
- Record the baseline: Note whether you are on Wi-Fi or cellular, whether the VPN is connected, and the current Home → Global Routing selection. Do not change these conditions at the same time.
- Run one update: In Home, update the target Subscribe entry and wait for the request to finish. Do not tap repeatedly or send the same request from multiple devices at once.
- Test on another network: If the request times out, wait until the device has a stable connection, then try once on another available network. If one network fails and another works, investigate the network path before resetting the token.
- Rule out interference from the existing connection: If you suspect the current connection is affecting the request, temporarily disconnect the VPN and try again, knowing that this will interrupt existing connections. If the VPN reconnects automatically, check Settings → On Demand. Restore your original settings after testing.
- Check the system clock: An incorrect device date or time can affect certificate validity checks. Correct the time first; do not disable certificate validation to troubleshoot subscription request errors.
Config, Proxy, Direct, and Scene under Global Routing are traffic-handling modes, not subscription format selectors. The route used by an update request also depends on app settings and the current connection state; the mode name alone does not prove which route the request takes. Changing DOMAIN-SUFFIX, GEOIP, IP-CIDR, or FINAL cannot fix an empty response from the server.
6. Share troubleshooting details and verify recovery
If these checks do not identify the issue, send verifiable details to your provider. Describe when it happened, which network you used, what you did, and what happened—not just “the servers disappeared.” Do not share your account password or full subscription URL, or forward the original URL to strangers for testing.
- When it happened: Note the date, time, and time zone so your provider can find the corresponding request.
- Action and symptoms: Say whether you updated an existing Subscribe entry in Home or created a new one and updated it for the first time. Report whether entries were present before and after the update.
- Exact error: Copy or capture the error as displayed. Distinguish a timeout, certificate error, HTTP status, and parsing error; redact authentication parameters and account identifiers.
- Comparison results: Say whether the result was the same on Wi-Fi and cellular, whether you disconnected the current connection, and what validity status the account page shows.
- Server-side checks: Ask your provider to confirm whether the request arrived, the final response status, whether it was redirected, whether the response body was empty, and whether the output is compatible with Shadowrocket.
After service is restored, update once and expand the group to confirm that server entries appear, then test a connection using an existing entry. If the list is back but connections still fail, troubleshoot the server connection instead of changing the subscription again. For Trojan or other entries using TLS, check Address, Port, and the relevant TLS fields against the parameters from your provider; do not guess based on commonly used ports.
Bottom line: verify updates and connections separately
First confirm that one subscription update reliably produces entries, then confirm that the selected server can connect. When finished, restore any temporary On Demand and routing changes made during troubleshooting so test settings are not left in place.