Shadowrocket Subscription Management: Grouping, Sorting, Removing Expired Sources, and Deduplicating Servers

Learn how to group subscriptions by source, sort servers by latency, remove expired entries in bulk, and prevent duplicate servers across subscriptions in Shadowrocket.

At a Glance

This guide is for users who have imported multiple subscriptions they already own into Shadowrocket. The workflow is to manage subscription sources in Settings → Subscribe, then return to Home to test and organize server entries. When cleaning up, group by source and compare protocol, host, port, and authentication parameters to identify duplicates.

Separate subscription sources, server entries, and the active connection

Multiple-subscription management becomes confusing when three different layers are treated as one. A subscription source is a URL provided by a service the user already has; a server entry is a specific record written to the Home list after an update; and the active connection is the entry selected in Home and handed to the system VPN configuration. Deleting one layer does not necessarily change the other two.

For example, one subscription may generate more than a dozen server records, with only one selected. Deleting a single server record does not delete the subscription source; if the source remains, that record may return during the next update. Conversely, after removing a subscription source, check whether local entries associated with it are still retained.

Save subscription sourceFetch subscription contentGenerate server entriesRun latency testSelect active server
3 layers
Subscription source, server entry, active connection
4 items
Deduplication key: protocol, host, port, authentication parameters
4 states
Global Routing:Proxy / Direct / Config / Scene
1 entry point
Subscription sources are managed in Settings → Subscribe

Create groups by source and name each subscription clearly

Open Settings → Subscribe and review each saved subscription. Names should identify the source and purpose; avoid vague labels such as “Subscription 1” or “Backup.” When multiple sources contain servers with the same name, the source name is the first clue for determining ownership.

When adding a new source, use only a subscription URL you already have. A placeholder used to illustrate the format can be written as https://example.com/sub?token=xxxx. Query parameters in a URL often carry identity or authorization information. Preserve the complete string when copying it; do not manually remove ?token=xxxx.

Primary subscription

Entry point
Settings → Subscribe
Name
Source A · Daily use
URL
https://example.com/sub?token=xxxx
Update check
Confirm the time and changes in entry count

The name identifies the source; do not use a server display name in place of the subscription name.

Backup subscription

Entry point
Settings → Subscribe
Name
Source B · Backup
Update method
Update manually as needed
Error record
Timeout, empty result, or authentication failure

Confirm that the backup source updates normally before removing entries generated by the old source.

  1. Open Settings, go to Subscribe, and record every existing source and its name.
  2. Trigger updates one source at a time. After each update, check whether the corresponding group or entry count in Home changes.
  3. If a source name is unclear, rename it before deleting or deduplicating anything. This prevents two different sources from being mixed together.
  4. After the update finishes, return to Home and check that the selected server still belongs to a source you intend to keep.

Bottom line: organize sources before servers

If you delete same-named entries directly from Home without checking Settings → Subscribe, the next update may write them back. Naming sources first and confirming the update result reduces repeated cleanup.

Run the same Connectivity Test before sorting by latency

Latency sorting is meaningful only when test conditions are consistent. Keep the same network connection method, run a latency test or Connectivity Test in Home for the servers you want to compare, and sort by the results from that run. Do not mix values measured on Wi-Fi yesterday with values measured on cellular today.

Test results generally fall into three categories: a specific millisecond value means the target responded during this run; timeout means no valid response arrived within the test window; no result or a test that remains in progress calls for checking the current network, subscription parameters, and app permissions. A single timeout is not enough to declare a server permanently unavailable; wait a while and test it twice more.

Example of a reachable entry

Protocol
Trojan
Host
edge-a.example.com
Port
443
Test result
186 ms

The values are examples of a recording format; use the result shown by the device in the current test.

Example of an entry requiring review

Protocol
Hysteria2
Host
edge-b.example.com
Port
443
Test result
timeout × 3

Even after three consecutive rounds of timeouts, first check UDP reachability and whether the server-side parameters have changed.

Also check Global Routing during testing. Proxy sends traffic through the active proxy server, Direct connects directly, Config follows the rules in the current configuration file, and Scene operates according to the scene settings. If the mode is Direct, a page loading successfully does not prove that the selected server is active. With Config, check the matching order of DOMAIN-SUFFIX, GEOIP, IP-CIDR, and FINAL.

DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT
GEOIP,CN,DIRECT
FINAL,PROXY

When removing an expired subscription, use the source as the bulk-cleanup boundary

When processing expired entries in bulk, the clearest boundary is the subscription source, not the server display name. In Settings → Subscribe, first confirm that the source has stopped updating, returns empty content, or is no longer needed, then remove it. Before deleting, record any manual servers that must remain so source-generated entries are not confused with manually added ones.

Button labels may change as the app interface shown on the current App Store page changes, but the review order remains the same: open the subscription record, verify the URL and name, confirm the source to remove, read the deletion confirmation, then return to Home and check associated entries. If the confirmation asks whether to process local servers as well, decide based on whether those entries are still needed rather than confirming rapidly.

  1. In Home, note the protocol, host, and port of the currently selected server. If necessary, switch first to a server you intend to keep.
  2. Go to Settings → Subscribe, open the target source, and run one update to confirm the failure is not a temporary network issue.
  3. Verify the subscription name and complete URL to ensure the item being deleted matches the recorded expired source.
  4. Delete the source, then follow the confirmation dialog to decide whether to process local entries generated by that source as well.
  5. Return to Home, run Connectivity Test again, and check whether entries from the original source remain in the list.

Bottom line: start bulk deletion with the subscription record

Removing entries by source is easier to verify than deleting them one by one by display name, and it prevents the next subscription update from adding the same batch back to Home.

Remove duplicate servers by comparing connection parameters, not names

The most common sign of duplicate servers is two subscriptions producing the same display name, but the name alone is not enough. One name may point to different hosts or to different ports on the same host. A true duplicate should be compared by protocol, server host, port, and authentication parameters at minimum. For protocols using TLS, also compare fields such as SNI and ALPN; when transport settings are used, check path, host, and other corresponding values.

For Shadowsocks, compare the host, port, encryption method, and password. VMess and VLESS also require checking the UUID, transport method, and TLS settings. For Trojan, compare the password and SNI. For Hysteria2, verify the host, port, authentication details, and relevant TLS fields. For WireGuard, compare the public key, Endpoint, Allowed IPs, and local address. Records with different parameters should not be deleted as duplicates even when their names match.

Can be treated as duplicates

Protocol
Trojan
Host
edge.example.com
Port
443
SNI
edge.example.com
Authentication
Exactly identical

When the main connection parameters match, keep the entry whose source updates reliably and is clearly identified.

Do not merge by name alone

Display name
Tokyo 01
Record A
edge-a.example.com:443
Record B
edge-b.example.com:8443
Protocol
Both VLESS
Conclusion
Different host and port

The same display name is only a duplicate label; it does not mean the underlying connection targets are identical.

Example deduplication key:
Protocol | Host | Port | Authentication parameters | Transport method | TLS/SNI

Trojan | edge.example.com | 443 | password-A | TCP | edge.example.com
VLESS  | edge.example.com | 443 | uuid-B     | WS  | cdn.example.com

If two sources genuinely contain the same server, keep the record with successful updates, a clear source label, and complete parameters. After deleting the other record, immediately update its original subscription to verify the result. If the duplicate returns, that source still maintains it. You can keep the source and accept the duplicate display, or adjust the content within the service provider’s subscription management options; do not create a superficial difference by arbitrarily changing the password, port, or UUID.

After updating subscriptions, check On Demand and rule status

After organizing subscriptions, run a complete verification cycle. Select the server you are keeping in Home, run Connectivity Test, and then confirm the current Global Routing mode. If you normally use Config, open the current configuration and verify that rules are matched from top to bottom, with FINAL handling requests that match nothing.

If On Demand is enabled, find it under Settings → On Demand. This setting can trigger connections or disconnections based on network conditions, so testing multiple subscriptions may cause the connection state to change automatically. During troubleshooting, record the current On Demand conditions, including the actions used on Wi-Fi and cellular networks, so automatic switching is not mistaken for server failure.

A server you just deleted came back after the subscription update?

Go to Settings → Subscribe and find the source it belongs to. Deleting only the Home entry does not change the subscription content; to remove a whole batch, handle the corresponding source and check the local list again.

Two server names are identical. Which one should be deleted?

Open both records and compare the protocol, host, port, authentication parameters, transport method, and TLS/SNI. If the parameters are identical, keep the one with more reliable updates and a clear source name; if they differ, do not merge them by name.

Why can’t the server with the lowest latency open the target page?

First check whether Global Routing is set to Direct, then run Connectivity Test. With Config, continue by checking the rule order and the FINAL action; a successful latency probe does not mean every app request is routed as expected.

How do you troubleshoot a subscription that always times out during updates?

First confirm that the device network and system time are correct, then check that the subscription URL is complete. When the current connection is working, check Update via Proxy under Settings → Subscribe, update again, and see whether entries are returned.

Why did the connection state change on its own after organizing the list?

Go to Settings → On Demand and check the actions configured for Wi-Fi and cellular conditions. During troubleshooting, also record the current Home server, Global Routing mode, and system VPN state.

Download Shadowrocket