At a glance

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.

Read subscription URL Send request to server Receive response Parse entries Show servers

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 seeCheck firstLeave unchanged for now
Update error; old entries remainURL, network access, server responseExisting server settings
No entries after expanding the groupAccount status, response content, output formatRouting rules in Config
Entries are present, but connections failServer status, authentication details, TLS settingsA 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
  1. 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.
  2. 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.
  3. 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.
  4. 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.

401
HTTP authentication response? Check your credentials
403
HTTP access denied? Check your account and access conditions
429
Too many HTTP requests? Stop refreshing repeatedly

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.

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 responseWhat it meansNext step
200 with an HTML pageThe request succeeded, but the content is not a server subscriptionCheck the subscription entry point and redirect destination
200 with an empty bodyNo body content to parseAsk your provider to check the generated output
200 with non-empty subscription contentThe format and entry fields still need to be checkedShare 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

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.