Official guide · For users with existing subscriptions and server details

Shadowrocket Subscription and Server Management

Before importing, updating, or organizing, distinguish subscription URLs, server entries, and Config files. A one-time app purchase is not a service plan; buying the app does not provide servers to connect to.

This reference guide covers eight management topics, with the relevant steps, field boundaries, and troubleshooting sequence. New users can start with the Quick Start Guide, then return to the relevant section after connecting once to check the details.

  • You already have your own subscription
  • App ID 932747118
  • Available on App Store

Shadowrocket is primarily for iPhone and iPad. This guide does not provide, sell, or recommend servers or subscriptions. See App Store availability and verification for how to get the app and verify the listing. Check the App Store page for system requirements.

[Subscribe]Import a subscription

Check the subscription URL and first import

A subscription is a URL that retrieves a server list. It is not a server or a rule configuration file.

First, identify what the information is for

Before importing, have the complete subscription URL you already received, and confirm that your provider identifies it as being for Shadowrocket. The path, query parameters, and token may all determine which list the URL returns; copying only the domain is usually not enough. Don't infer the URL's purpose from a page title or its length, and don't enter an account, login, or renewal page URL as a subscription. A webpage being accessible does not mean it contains parseable subscription data.

A server entry stores the protocol and parameters needed to connect. A subscription retrieves those entries from a remote source, while Config controls behavior such as rules and DNS. These three objects can coexist, but they are not interchangeable. Seeing servers after importing a subscription only confirms that retrieval and parsing succeeded; it does not prove the selected server can connect or that existing rules will handle traffic as expected.

Create a Subscribe entry from Home

From Home, open the add menu, go to Add Server, and choose Subscribe under Type. The exact location may vary; follow the app's current interface. Paste the complete URL, add a recognizable note, and save. If prompted to fetch or update the subscription, follow the prompt. Make sure the network is available, and avoid adding the same URL repeatedly while waiting, which can create several similar subscription groups.

Before saving, check that the URL has no leading or trailing spaces, line breaks, quotation marks, or non-ASCII punctuation. A long URL wrapped across lines in a message may still copy correctly, but text extracted from a screenshot can contain recognition errors. Pay particular attention to everything after the question mark, case-sensitive tokens, and percent encoding. Treat the URL as a credential: paste it directly into the app rather than submitting it to an unfamiliar website to check its format.

https://example.com/sub?token=xxxx

This is a format example, not a usable subscription. Get your actual URL from your provider. The token after the question mark illustrates a query parameter; it does not mean all subscriptions use the same parameter name. Some URLs contain identifying information in the path. Preserve the URL exactly as provided: don't remove a segment to make it look neater or add parameters from the example.

Check these four results after saving

After the first fetch, check that the subscription group appears, server entries are present, their protocols match the information you have, and the note identifies the group. If the list is empty, keep the original URL, check the app's message, and ask whether your provider changed the subscription endpoint. Don't immediately edit every server or delete the old list. Troubleshoot an import failure separately from a server connection failure.

If the list appears but contains unfamiliar names, compare them with the subscription information you already have. Don't treat a name as a guarantee of connection quality or location. Notes come from the subscription content and may change with later updates. When tracking an entry, record both its subscription and protocol, rather than relying on its position in the list.

[Check]

A successful subscription import, a successful server test, and a successful real request are three separate checkpoints. Check them in order; one does not prove the others.

If parsing fails, first check the complete URL and current network, then confirm that the response still contains subscription data. A remote service may return a login prompt, error page, or empty response; even if the request receives a response, it won't produce a server list. See Troubleshoot an empty list or parsing failure for more detail. Keep the error message, but don't include the full token when asking for help.

If the same subscription already exists, update the existing entry instead of importing it again. To try a new URL, create a temporary group with a different note and keep the original for comparison. Once the new list is complete and a real request succeeds, decide whether to remove the old entry. This separates changes in remote content from the effects of local actions and makes accidental deletions easier to diagnose.

[Add Server]Enter a server manually

Check connection fields by protocol

Manual entry is for cases where you already have the complete server parameters. Choose Type first, then fill in each field from your existing information—don't guess missing values.

Keep the address, credentials, and transport settings separate

In Add Server, Type determines how the following fields are interpreted. The same address and port are not automatically compatible with different protocols. Check your server information, select the actual type—such as Shadowsocks, VMess, VLESS, or Trojan—and enter the server address and port. The address is usually a domain name or IP. Don't paste a complete share link into the address field or append a path or note to the domain.

Enter only the port number provided by the server. Assuming a common port because you see TLS, or copying an online example because you recognize a protocol name, adds unnecessary guesswork. Enter credentials such as the password, UUID, and encryption method exactly as provided. Similar-looking characters are easier to get right by copying than typing; still check for spaces at either end and make sure your keyboard hasn't replaced ASCII punctuation with full-width characters.

ProtocolCheck carefullyDo not interchange
ShadowsocksAddress, port, encryption method, and passwordThe encryption method must match the server. A password is not a UUID.
VMess / VLESSAddress, port, UUID, transport, and TLS parametersMatching UUIDs alone do not make protocol types interchangeable.
TrojanAddress, port, password, TLS, and SNIThe connection address may differ from the name used by the certificate.
Hysteria2Address, port, authentication, and TLS parametersUse the original parameters for the selected protocol; don't substitute fields from another type.
WireGuardKeys, peer, address, and routing parametersA private key is sensitive information, not something to share in an ordinary note.

TLS, SNI, and transport parameters serve different purposes

The connection address locates the server. SNI is generally used to select a name during the TLS handshake, while certificate validation checks the server's identity. These concepts are not interchangeable. If your server information specifies an SNI, enter it as provided rather than mechanically copying the address field. When connecting by IP, the certificate may still be issued for a domain name. If you see a name mismatch or certificate error, check the details first; disabling validation is not a routine fix.

Transport settings such as Host and Path may also differ from the connection address. The leading slash, capitalization, and query string in a Path may matter; Host may be used in the corresponding application-layer request. Fill these fields only when the selected transport uses them. Don't move the path from a subscription URL into the server's transport settings: although both may contain slashes, they belong to completely different requests.

With Trojan, for example, the address and port specify the connection target, the password supplies authentication, and SNI and certificate validation relate to TLS. A correct password does not mean the TLS settings are correct; likewise, a successful handshake does not prove authentication passed. Troubleshoot each layer separately, and don't change the password, address, and SNI at the same time. For field-by-field explanations, see How to enter Trojan parameters.

After saving, test one variable at a time

Use a note to record the entry's purpose and source, not its password, token, or private key. After saving, return to the list and check that the protocol and address are correct, then select the entry and test it. If it fails, compare each field with the original parameters and correct only one confirmed issue at a time. Trying several guessed values in a row makes the cause harder to identify and may overwrite the closest-to-correct record.

To compare with a subscription entry, create a separate manually entered test entry rather than editing the subscription-managed one. A later update may overwrite local changes or recreate the entry; whether a change is kept depends on the actual update behavior. A separate test entry preserves a clear comparison and shows whether the result came from the original subscription or a local parameter change.

[Parameters]

If required parameters are missing, check with the administrator of the service you already use. The app can't infer a password, UUID, SNI, or key from a server name.

Saving records the fields; it doesn't mean the server accepted a connection. If only one transport fails, check its parameters and the current network conditions. If all entries fail, start with the basic network and global settings. Check the current app interface for supported protocols and fields. Don't try to convert server details for another type by changing the protocol name.

[Import]Import by QR code or clipboard

Identify the imported content and check the result

QR codes and the clipboard are just input methods. Successful import depends on the address, format, and parameters they contain.

Scan QR Code does not recognize every kind of page

Before using Scan QR Code, confirm that the code comes from your existing server information or subscription details. It may contain a single share link or just a webpage URL. Reading the code does not mean the app can convert its contents into a server entry. If scanning opens an ordinary webpage or reports a parsing error, check what the original source says it is for. A server name printed beside a QR code doesn't prove the code is for importing.

When scanning from another screen, fit the whole code in the frame. Avoid glare, cropped corners, or multiple codes in view at once. Longer QR codes tend to be denser, so making them too small can hinder recognition. Use the original clear image rather than a compressed chat thumbnail. A recognition failure points to an image or content issue; it doesn't show that the server is no longer working.

When the system asks for camera access, grant permission if needed for the action. If you previously denied it, check Shadowrocket's camera permission in Settings, then try scanning again. A permission issue is unrelated to server authentication, so there's no need to change the subscription URL. Other image-recognition entry points may differ; follow the current interface rather than assuming buttons are in the same place on every system or device.

Clipboard imports preserve the original string

When copying a share link, copy from the protocol prefix through the parameters and any note. Explanatory text, numbering, bullets, and code fences in a message are not part of the link. If the app offers a clipboard import option, copy the link and start the import from within the app, then allow access if prompted. No system prompt doesn't necessarily mean copying failed. Avoid copying something else before importing, which would replace the link in the clipboard.

Whether multiple links can be imported at once depends on how the entry handles the content. For easier verification, import one link first, check the result, then handle the rest. Some lines may be ignored if a multiline text includes explanations, blank lines, or webpage markup. Check the imported entries individually; a message saying “Imported” doesn't prove that every item was saved.

If the system asks to allow pasting and you decline, restart the action from the app's import option and watch for the permission prompt. Copying and subscription network requests are separate processes: if the clipboard content wasn't read, the problem is at the input stage; if a subscription was created but its contents couldn't be fetched, the issue is at the request stage. Identify where the failure occurred before changing an otherwise correct URL or server parameter.

After importing, compare fields—not just names

After importing a single share link, check Type, address, port, and any required TLS or transport fields. A correct note only shows that the name was read; it doesn't prove the other parameters are complete. Some formats percent-encode notes. Encoded or different-looking names don't necessarily affect the connection, but check that link parameters weren't placed in the note or that the note wasn't left in the address field.

After importing a subscription QR code, confirm that it created an updatable subscription entry, not just a server from the current list. Check the saved entry type and the update option in the app, not the QR code's title. For ongoing updates, keep the correct subscription object rather than copying a single server from it; a single-server import usually doesn't retain the subscription's update relationship.

[Privacy]

QR codes, share links, and clipboard contents may contain full credentials. Don't upload them to public decoding sites. Before sharing a screenshot for help, remove QR codes, passwords, and query tokens.

Scanning the same code repeatedly can create several similar entries. Before cleaning them up, compare their groups, protocols, and addresses, then confirm which one is selected. Entries with the same name but different parameters aren't necessarily duplicates; entries with different names but the same address may use different credentials or transport settings. If unsure, keep both for now, distinguish them with clear temporary notes, and compare them individually as described in the testing section.

After importing, you can replace the clipboard contents with ordinary text to reduce the chance of accidentally pasting credentials later. This doesn't revoke information already shared. If a complete link was exposed publicly, handle the credential change through the management interface for your existing service, then update the saved information in the app. Convenient input methods don't replace credential management; treat the original share information as sensitive data.

[Update]Subscription update options

Subscription refresh and app updates are different

Refreshing a subscription retrieves the remote list again; updating the app is done through the App Store. Neither replaces the other.

Preserve a comparable state before updating

A subscription update may add, remove, or rename servers, or change addresses, ports, or credentials. Before updating, confirm which group you're working with and note the selected entry and its subscription. If you're troubleshooting a connection, record the symptoms first. Otherwise, changes to the list can make it hard to tell whether the old issue or new parameters affected the result.

Don't assume an update will preserve manual changes. Subscription-managed entries come from remote content; whether local notes, sorting, or field changes persist depends on the actual result. Create a separate manually entered entry for parameters you need to maintain independently, and note its purpose. There's no need to clear the old group before updating. Keeping its previous state can help show whether the app retained existing data if a fetch fails.

What manual and automatic updates do

A manual update is useful when your provider announces parameter changes, a list is clearly out of date, or you need to recheck it after the first import. Update the relevant subscription, wait for the operation to finish, then check the message and group contents. Repeated clicks in quick succession usually won't fix a remote error and can make results harder to track. After a failure, identify whether it's a network, authentication, or parsing issue before deciding what to do next.

If the current app offers automatic update settings, choose options that suit how often you use the subscription and check what you've enabled. Background scheduling can be affected by the network, device state, and system restrictions. Setting an update interval doesn't guarantee that every request will finish at an exact time. To confirm an important change, check the list in the app and refresh it manually if needed instead of relying solely on when a background task is expected to run.

The network path used for subscription updates may depend on the current connection, routing mode, and app settings. If an update fails while a connection is enabled but succeeds when it's off, check the difference in network paths; don't immediately conclude that a server is unavailable. Compare under the same basic network conditions and change one variable at a time. Avoid switching networks, replacing the URL, and reimporting the entire subscription all at once.

Troubleshoot the failed stage instead of rebuilding

A request-stage failure may appear as a connection error, timeout, or name resolution problem. First confirm that the device can use its current network normally. An authentication or access failure calls for checking that credentials in the URL are complete and that the remote service hasn't revoked the old URL. A parsing failure calls for checking whether the response still matches the subscription format. Each stage has a different cause; don't reduce them all to “the server doesn't work.”

If the remote service has changed the subscription URL, edit the corresponding field in the existing subscription and check the update result. Renaming the group won't change the request URL, and editing one server won't fix the subscription endpoint. You can temporarily keep both versions to compare, but clearly label the old entry so you don't keep working in it and mistake that for the new URL not taking effect.

[Update boundary]

A successful update message doesn't mean the list must grow or that every server can connect. If the remote content hasn't changed, the list may remain exactly as it was.

After an update, check that the group still exists, then see whether its entries changed, and finally confirm the selected entry. If a server was removed from the remote list, you may need to recheck the local selection. An enabled connection switch alone doesn't prove that traffic is still using the same entry as before the update. If rules refer to a named object, check that the reference still points to the intended entry.

A change in the number of entries doesn't necessarily indicate a change in service quality. The remote list may simply have been split, combined, or renamed; compare the actual parameters and documentation. If repeated refreshes don't return the expected content, note the error, steps taken, and checks completed, then ask the administrator of your existing service to verify the response. Describe the issue without sharing your full subscription URL publicly.

Update Shadowrocket through the App Store, not by refreshing a subscription. Check the App Store page for whether an app update is available, compatibility, and system requirements. See How to verify the App Store listing for guidance on the official listing and app ID. To troubleshoot an empty list, check the subscription request and parsing process instead.

[Organize]Organize multiple subscriptions

Keep clear source relationships and names

The goal is to know where each entry came from, what updates it, and which one is selected—not to make every name look the same.

Separate subscriptions from manually entered entries

If you use several subscriptions, give each group a recognizable note, such as its purpose, an internal account label, or a test marker. Don't include full account details, passwords, or subscription tokens in a name; there's no need to make it long. A short name that's easy to distinguish on a narrow screen, combined with a separate private record, is usually easier to maintain than putting every detail in the entry name.

Subscription entries are managed by a remote list; manually entered entries are maintained independently. Distinguish them in their names, especially local copies made from subscription entries for testing. Otherwise, a local copy may keep old parameters after a subscription refresh, and you might mistake it for an updated server and conclude the remote issue wasn't fixed.

Don't copy every server into a manual entry just to make the list look “tidier.” This loses the original update relationship and makes future credential or address changes a manual task for each entry. Create a local copy only when you need to modify it independently, compare it temporarily, or preserve specific parameters. Leave other entries managed by their subscription whenever possible.

Compare multiple fields to identify duplicates

The same name doesn't mean the same server, and the same address doesn't mean the same connection configuration. Entries may differ in port, protocol, credentials, SNI, or transport parameters. Before removing anything, compare its group, Type, address, and port. If it's still unclear, check authentication and transport settings. You can compare sensitive fields on your own device; don't export them to a public spreadsheet or online tool just to find duplicates.

If the same subscription was imported twice, first identify which group has the current URL and which one is selected or referenced by rules. Then decide which to remove. Don't decide based only on when the groups were created: the newer one may have an incomplete URL. Update the group you intend to keep and verify a real request before removing the other one. This reduces the risk of disrupting an existing configuration while cleaning up.

What you seeCheck firstHow to handle it
Exactly the same nameGroup, protocol, address, and portCompare the fields before deciding whether entries are duplicates.
Same address, different namesAuthentication, TLS, and transport parametersDifferent connection configurations can use the same address.
A local copy and subscription entry both existThe copy's purpose and the parameters last checkedLabel the copy clearly; don't assume it will update.
Name changed after an updateOriginal group and actual connection fieldsDon't locate or delete an entry by its old name alone.

Keep server selection separate from Global Routing

Selecting a server doesn't mean every request will use it. The Config, Proxy, and Direct modes in Global Routing determine how traffic is handled. Config applies the rules in the current configuration; Proxy handles applicable traffic through a proxy; Direct connects directly. Check the current mode before testing. Otherwise, a request may still be routed directly by a rule after you change servers, making it seem as if the selection had no effect.

In Config mode, also check which configuration file is active and the order of its rules. If a domain matches DIRECT, switching proxy servers usually won't change that request's outbound route. A rule that specifies another policy object may not follow the single selection on Home either. Server management handles connection details; rule management determines when they're used. Check them separately.

If names change across multiple subscriptions, check whether the configuration contains references that depend on those names. Don't rename everything in bulk without checking, or assume that a name change is purely cosmetic. Review the references, preserve the original configuration, and make and verify changes one at a time. If you're unsure about a policy structure, keep the existing names until you understand them rather than rearranging everything and then trying to find the cause of a failure.

[Working copy]

Keep a verified working state as you organize. After adjusting each group, check selection, updates, and request results before moving on to the next one.

Managing multiple subscriptions doesn't require frequently switching servers. What matters is knowing each group's purpose, which entries are temporary tests, and which parameters may change after an update. Keep a short private note about the reason for each change—for example, that a copy is used to test SNI—instead of just writing “this one works.” A record based on evidence makes future deletion, recovery, or migration more reliable and avoids treating a one-time success as a permanent configuration.

[Diagnostics]Latency tests and sorting

Interpret test results under the same conditions

A latency test compares response times under specific measurement conditions. It doesn't prove throughput, stability, or access to a particular website.

Identify what the test measures and how it works

Before using Connectivity Test or a test option in the list, check the test method and target used by the app. Different methods may measure a connection to the server port or include access to a test target through the proxy; these results mean different things. Compare values only when the method, target, base network, and timing are similar. Don't rank results from different modes against each other.

A test value represents one measurement or a set of measurements, not every future request. Current network load, wireless signal, server status, name resolution, and the target's response may all affect it. Don't immediately delete an entry after one high reading or assume one low reading makes it suitable for everything. Keep the network unchanged, repeat a few tests, and look for a consistent pattern before switching.

Interpret timeouts and failures in light of the test method. If the test target is unreachable, several servers may fail at once; if a protocol field is wrong, only the relevant entry may be affected. A failed test doesn't always mean the server address is completely unreachable, and a successful one doesn't prove that a particular request will work. Use the test as a diagnostic clue, then verify with a real request.

Follow a repeatable check sequence

First, confirm the basic network is working and rule out an unfinished network login or unstable signal. Next, check the selected entry and its protocol parameters to avoid testing an older entry with a similar name. Then run the test using a fixed method and wait for the result. Finally, check Global Routing and the current Config before accessing the destination you need to verify. At each step, be able to state what you checked.

If all entries fail at once, check the basic network, shared test target, and global settings first. If only one subscription fails, check whether it was just updated and whether authentication changed. If only one server fails, review its address, port, TLS, and transport parameters. Narrowing down the scope this way preserves evidence and is more effective than reinstalling the app or clearing every subscription. It also avoids recreating settings that were already correct.

ModeInterface labelWhat to check for a real request
ConfigConfigCurrent file, matching rule, policy, and rule order.
ProxyProxySelected server, connection parameters, and actual request result.
DirectDirectThe basic network and destination; a successful direct connection doesn't prove the proxy works.

Before temporarily changing a mode to compare real requests, note the original setting and restore it afterward. Don't keep a mode you don't understand just because it made one request succeed. In Config mode, a request may match DIRECT or another policy. Even a low latency shown in the server list doesn't prove that the request used that server.

Sorting changes the display, not the selection

Sorting by latency helps find entries that responded faster in the current test, but sorting doesn't automatically select one or provide ongoing health checks. After sorting, check the selected indicator; don't assume the first entry is in use. If only some entries were tested, don't group untested, timed-out, and completed results together. First check which entries the results cover.

During batch tests, avoid refreshing subscriptions or moving entries at the same time. When the list changes, test results may no longer line up with the same names and positions. Finish testing and note which entries you want to compare before updating or organizing. Retest under the same network and method to tell whether a change came from new parameters rather than a switch in network conditions.

[Evidence]

For troubleshooting, record the test method, basic network, selected entry, and actual error—not just a latency number. Remove all credentials before sharing your notes.

Latency and speed are different: a shorter response time doesn't guarantee faster large-file transfers or stable long-lived connections. This guide doesn't set a universal pass threshold because test targets, networks, and needs vary. If results fluctuate, reproduce the issue under fixed conditions first. Avoid frequent batch tests that generate extra requests; then use the stage where the error occurs to check the relevant parameters, subscription, or rules.

[Backup]Delete and back up

Save, delete, and restore each type of data appropriately

Check what a backup includes before deleting anything. Restoring an app purchase does not restore servers or configurations.

List the items you need to keep

Management records may include subscription URLs, independently entered servers, Config files, and necessary app settings. A single export may not include all of them. Before backing up, list what you actually use, then check the backup and export options available in Settings, Data, or the relevant entry actions in the current app. Saving one file doesn't prove it contains all passwords, selection states, and rules.

A subscription URL can retrieve a list again, but it doesn't replace a backup of independently entered servers. A Config file can restore rule structure but may not include server credentials. Likewise, exporting a single server won't restore the update relationship of a full subscription. The best way to check is to review the export type and description, then confirm what it contains without disrupting your working setup.

Keep original parameters in a secure location you control, using storage that protects sensitive information. Subscription tokens, passwords, UUIDs, private keys, and QR codes containing them don't belong in public notes, shared photo albums, or links. Even a plainly named backup file may contain credentials. Check its contents before sending it to someone; the file extension alone doesn't tell you whether it's safe.

Understand what will be affected before deleting

Deleting one server, deleting a subscription group, and deleting Config are different actions. If a deleted server is still in the remote subscription, it may reappear after an update. Deleting a subscription removes its local management entry; follow the app's confirmation prompt to see what will happen to related entries. Before proceeding, read the prompt and check the selected item, rule references, and any local changes you need to keep. Don't turn list cleanup into an unintended configuration wipe.

Deleting an entry locally doesn't revoke remote credentials or stop a remote service, and it doesn't change a subscription token. If you're responding to exposed information, handle the credentials through the management interface for your existing service, then update the local records. Deleting an entry in the app won't invalidate a password or link that has already been copied. This is especially important after sharing a QR code.

Before removing a duplicate group, confirm that the group you're keeping can update and complete a real request. Record the reason for any manual changes in the old group and the parameters you need. Handle one item at a time; after each deletion, return to Home and check the current selection and Global Routing before continuing. Bulk deletion may be faster, but makes it harder to identify what was affected if you remove the wrong item.

[Before delete]

Delete only after confirming that a backup exists, is complete, and is accessible. Seeing a backup file doesn't prove that it can be restored.

Restore in stages, checking dependencies

After moving to a new device or reinstalling the app, first restore access to the app through the App Store, then restore the servers, subscriptions, and configurations you saved. App purchase records are managed by the store account; connection details are a separate kind of data. Check the App Store page for purchase restoration, device compatibility, and whether Universal Purchase applies. For instructions, see Restore purchases and move to a new device.

After restoring connection details, first check that subscription URLs are complete, then fetch the current list. For manually entered servers, check credentials and transport fields. Restore the Config files you need, confirm that rule references match actual objects, then check Global Routing, the selected server, and connection status. Don't switch among several modes before verifying the parameters; otherwise, it will be hard to tell which layer caused the restore to fail.

Remote parameters may have changed since an older backup was made. An old file can help restore the original structure, but doesn't guarantee that old credentials still work. After restoring, check against the current information for your existing service and update the subscription or any fields known to have changed. Device names, network conditions, and system permissions may also differ. On the first connection, pay attention to the system's VPN configuration prompt rather than assuming it will match the old device.

Finish with a full check: the list is visible, required subscriptions update, selected server parameters are correct, real requests behave as expected, and the rule mode is back to the intended setting. Then remove temporary copies and old backups as appropriate, keeping any recovery notes you need. To repeat the initial connection steps, return to the Quick Start Guide. If a specific step fails, use this page's contents to return to the relevant section; there's no need to start by deleting all your data.