This guide is for users who already have their own subscription or server details and want to import them into Shadowrocket on iPhone or iPad. First, distinguish a server subscription from a remote configuration. Then choose among Subscribe, Add Server, QR code, and clipboard import. After importing, check the server list, update results, and Global Routing. A saved URL does not necessarily mean the connection is ready to use.
1. First, distinguish subscriptions, single links, and configurations
Shadowrocket is a paid client for Apple platforms. Buying the app and obtaining a connection service are separate matters. This guide assumes you already have your own service provider and subscription; this site does not provide, sell, or recommend servers or subscriptions. Get the app only through the App Store. See the genuine app verification page for purchase and authenticity details.
These four import methods are not four different protocols, and they do not necessarily produce the same result. A subscription URL usually points to an updatable server list; a single share link describes one connection; a remote configuration may include rules, DNS, and policies. Identify the resource by what the link actually returns and by the provider's instructions—not simply by whether it starts with https://.
| What you have | How to identify it | What to check |
|---|---|---|
| Server subscription | The provider identifies it as a subscription URL that returns a supported server list | A subscription group and server entries appear in Home |
| Single share link | Prefixes such as ss://, vmess://, vless://, and trojan:// | One server record for the corresponding protocol appears |
| Manual server details | Protocol, server address, port, and authentication details are provided | The fields in Add Server match the supplied details |
| Remote configuration | The provider explicitly identifies it as a Shadowrocket configuration file | A configuration appears in Config; check separately whether it is enabled |
Query parameters in subscription URLs often contain access credentials. Don't post the full URL in public forums or treat a QR code as an image with no sensitive information. The https://example.com/sub?token=xxxx URL below is a fake example of the format; it cannot be used to connect or test.
2. Subscribe: understand the roles of Config and Home
When looking for “Subscribe” on the Config page, first identify the type of resource you're handling. Config is mainly for managing configuration files, Home mainly shows servers and connection status, and Settings manages app preferences. Even if an option is labeled Subscribe, that doesn't mean every server subscription belongs in Config.
Add a regular server subscription from Home → + → Add Server → Type → Subscribe. Add Server is the title of the add-server screen. If you have a remote configuration, use the remote configuration option in Config and check its contents after importing. Don't repeatedly import a server-list URL into Config just because you're looking for a particular label.
-
Check your details
Make sure the provider gave you a server subscription URL—not an account page, payment page, or remote configuration URL.
-
Open the add screen
Go to
Home → +, then chooseSubscribeunderAdd Server → Type. -
Enter the URL
Paste the complete subscription URL into
URLand enter a recognizable name inRemarks. Keep the full path, question mark, and all following parameters. -
Save and update
Tap
Doneto return to Home and wait for the list to load. To fetch it again, pull down on the server list in Home. -
Check the group
Expand the subscription and confirm that server entries appear. If you see only the group name and no entries, check the request result and subscription format.
3. Add Server manual entry: for complete connection details
Manual entry is useful when you have server details but no recognized share link. It creates a server record; it does not create an automatically updatable subscription. Go to Home → + → Add Server, select Type, then fill in the fields for that protocol. Authentication details are not interchangeable between protocols.
Check Shadowsocks settings
- Type
- Shadowsocks
- Address
- example.com, for illustration only
- Port
- 8388, format example only
- Method
- Use the encryption method specified in your original details
- Password
- Use your own authentication details; watch for leading or trailing spaces
8388 is not a required default port. Use the port specified for your own service.
Check VLESS settings
- Type
- VLESS
- Address
- example.com, for illustration only
- Port
- 443, format example only
- UUID
- Check your own user ID character by character
- TLS and transport
- Check the server name, transport method, and related settings against your original details
Port 443 alone does not prove that TLS is enabled or replace the full transport configuration.
For example, the server address and port may be correct while an incorrect TLS server name or WebSocket path still causes a connection failure. Don't rely on a single latency test to confirm that every setting is correct. VMess, Trojan, Hysteria2, and WireGuard each have their own authentication and transport requirements. Enter each setting using your existing details rather than copying fields from another protocol.
- Check
Typefirst, then verify the address, port, authentication, and transport settings. - Enter the numeric port without spaces, non-ASCII punctuation, or a domain name.
- After editing a record, test it again. Avoid changing the protocol, DNS, and rules at the same time, or it will be harder to pinpoint the cause.
- If you need to keep up with the provider's updates, use their current subscription rather than maintaining a large number of entries manually.
4. QR code and clipboard import: check the content, whatever the method
QR codes and clipboard import are ways to send text to the app; they don't change what that text means. A QR code might contain a single ss:// link, a subscription URL, or an ordinary web address. After importing, check whether you got one server, a subscription group, or content the app couldn't recognize.
Choose the import method based on where your details are
Details on another screen
- In Home, tap the scan option and allow camera access when prompted.
- Fit the entire QR code in the viewfinder, avoiding glare and cropped edges.
- After it is recognized, check the link type and preview fields before confirming the import.
- If only one server was added, first check whether the QR code contained a single link.
Details on this device
- Copy the complete link. Don't include explanatory text, quotation marks, or punctuation at the end of a sentence.
- Switch back to Shadowrocket. If prompted to read or import from the clipboard, check the source and confirm.
- If no prompt appears, paste the subscription URL into the Subscribe form in Add Server.
- For a single share link, use the link import prompt provided by the app. Don't enter it as a server address.
A QR code and clipboard may contain the same credentials. Changing how they're transferred doesn't grant subscription access or fill in missing parameters.
Your iPhone or iPad may ask whether to allow pasting from another app. If you deny permission and no content is recognized, that doesn't mean the link is invalid. Check whether permission is required, or paste the URL directly into the Subscribe form. Repeatedly scanning or copying the same imported details may create duplicate entries; repeated imports are no substitute for troubleshooting.
Example subscription URL:
https://example.com/sub?token=xxxx
Common prefixes for single share links:
ss://
vmess://
vless://
trojan://
The content after the prefix may include encoded authentication details, server information, and transport parameters. Don't remove equals signs, slashes, percent-encoding, or query parameters. Link length alone doesn't tell you whether it is complete. The prefixes above are for identifying formats; they are not complete connection details that can be imported.
5. After importing, check the list, updates, and routing separately
“Saved successfully,” “updated successfully,” and “the website loads” are three different checks. A successful save only means the app accepted the input. A successful update means the subscription resource was fetched and parsed. Whether a website loads also depends on server status, authentication, DNS, and current routing settings. First check the actual entries in Home, then test a server you already have.
In Home, Config, Proxy, Direct, and Scene under Global Routing are routing modes, not subscription protocols. Changing these options won't fix an incorrect subscription URL. The comparison below covers three modes commonly used for troubleshooting. Scene depends on the configured scene, so you can't determine its behavior without checking the scene settings.
Config
RecommendedTraffic is handled according to the rules in the currently enabled configuration. First confirm that the expected configuration is enabled in Config, then use its rules to determine where a request goes.
Best for: everyday, rule-based use with a configuration you trust
Proxy
Routes intercepted requests through the proxy, which can help you compare results with Config. This is not a subscription update switch, and it doesn't guarantee that all system traffic will be intercepted.
Best for: brief comparison tests to distinguish rule issues from connection issues
Direct
Routes intercepted requests directly. If a website opens in this mode, that doesn't prove that the selected server's authentication and transport settings are valid.
Best for: establishing a direct-connection baseline on your current network
With Config, DOMAIN-SUFFIX matches domain suffixes, GEOIP and IP-CIDR handle IP-related conditions, and FINAL provides a catch-all rule. These rules belong in a configuration, not in a subscription URL field. Automatic connections are a separate setting: go to Settings → On Demand and configure it for your network after you've verified a manual connection.
6. Troubleshooting empty subscriptions, failed updates, and duplicate entries
When an update fails, keep existing entries that still work instead of deleting everything right away. The issue may be with the URL, the resource request, content parsing, or the connection that follows. Narrow down the problem one stage at a time rather than repeatedly switching import methods.
- Check the full URL. Compare the protocol prefix, domain, path, and parameters such as
tokenagainst the original details. A shortened link preview in a messaging app is not the complete URL. - Check the response. If the URL opens a login page or error message instead of the expected subscription content, it may not point directly to the subscription resource. Don't try to fix this by entering your account password in a server authentication field.
- Check the resource format. Being able to open a webpage doesn't mean Subscribe can parse its contents. Ask the provider of your existing service whether the supplied format works with Shadowrocket.
- Check your current network. Distinguish DNS resolution failures, connection timeouts, and explicit authentication failures. Change one condition at a time and note the update result. Avoid changing DNS, rules, and server details simultaneously.
- Check where the subscription came from. The same server may appear both as a manually added entry and in a subscription group. Before removing duplicates, identify their source so you don't delete a subscription you need to keep.
- Check that the credentials are valid. If the original URL has been revoked or replaced, update the existing subscription record with your own current URL. Don't keep forwarding or retrying an expired URL.
Will importing by QR code fix an expired subscription URL?
No. If the QR code still encodes the same expired URL, scanning only saves you from typing it manually; the remote resource hasn't changed. Check that the QR code contains the same URL you currently use.
Why didn't my manually added entry change when I updated the subscription?
Manually added entries and subscription entries usually come from different sources. Updating a subscription doesn't replace every server or automatically maintain the password, port, and transport settings of a separate manual entry.
The list shows servers and their latency looks normal. Is everything set up?
Also check access to the actual destination, the current Global Routing mode, and the enabled configuration. A latency test reports the result of that particular test method; it doesn't replace checks for authentication, TLS, DNS, and rules.