How to Read Shadowrocket Data Usage: Per-Server and Per-App Statistics

Learn how Shadowrocket’s Data tab tracks uploads and downloads, compare per-server and per-app views, and use the readings to check whether rules route traffic as expected.

At a glance

Use Data to observe traffic changes, not as sole proof that a specific rule matched. This guide assumes you already have a provider and subscription. First, distinguish cumulative usage from real-time speed, then compare server and app attribution. Finally, verify routing by keeping the network fixed, comparing before-and-after readings, and checking request records. Available statistics may vary by device; use the fields shown on your screen, and don’t treat app identification as a complete record of system traffic.

Understanding the readings: uploads, downloads, and speed

Before checking Shadowrocket’s Data tab, determine whether a figure shows cumulative bytes or data transferred per unit of time. Upload is data sent from your device; download is data received by your device. The distinction is based on your device’s perspective, not on who created a file. Loading a webpage usually involves uploads too, since requests, acknowledgments, and other communications must be sent.

2 directions
Check uploads and downloads separately; don’t look at downloads alone
4 options
Global Routing:Proxy / Direct / Config / Scene
4 rule types
This guide checks DOMAIN-SUFFIX / GEOIP / IP-CIDR / FINAL

Cumulative usage is usually shown in units such as KB, MB, or GB; a reading marked /s is a transfer rate. A 20 MB increase in cumulative downloads does not mean the download speed was 20 MB/s. If the page shows bytes per second while a speed test reports bits per second, the theoretical conversion is 1 byte = 8 bits. For a meaningful comparison, use the same sampling period and unit convention.

Statistics also depend on when counting starts and what falls within the measurement window. Don’t assume that starting a connection, restarting the app, and manually resetting a counter create the same baseline. Note the time range or reset state shown on the page, and unless the measurement scope is clearly stated, compare only before-and-after readings from the same page and test run. Local Data counters and provider billing may measure different layers, directions, or billing rules, so they can’t be used to estimate your remaining plan allowance.

What you seeWhat it can tell youWhat it doesn’t prove
Cumulative downloads increaseData was received within the measured scopeThe destination webpage finished loading
Instantaneous rate drops to zeroLittle or no data was transferred during that sampleThe server is unavailable
Uploads keep increasingThe device is still sending dataA user file is being uploaded
Local usage differs from the billThe two measurement methods need to be comparedEither side is necessarily counting incorrectly

Per-server readings: check the egress, not all traffic

Per-server totals help answer, “Which servers have changing counters?” Selecting a server on Home shows the current selection for the relevant proxy. In Config, however, rules determine whether requests use DIRECT, a proxy policy, or another configured policy. So if the selected server shows little change, that doesn’t mean all network requests failed; traffic may be going direct or using another policy.

Request enters the tunnel Routing mode is evaluated Configuration rules are matched Connection to the egress is established Statistics change

This sequence illustrates how routing works; it doesn’t mean every counter measures traffic at the same layer. When checking a server, note its name, address, and port so you don’t mistake two entries with the same name for the same egress. A port is a connection parameter, not a unit of measurement. For example, a configured port of 443 alone does not tell you which protocol is actually in use.

  1. On Home, check the connection status, selected server, and Global Routing.
  2. Open Data and record the visible upload and download readings for the server you’re checking, keeping the original units.
  3. Perform one specific network action, then return to the same statistic and record the change.
  4. If the change differs from what you expected, check which policy or rule matched the request before switching servers.

Existing connections can also affect the results. After switching servers or changing rules, established connections may not immediately reconnect under the new settings. For a test, end the existing network activity and make a new request. If you need to reconnect, first stop any important transfer. A video that keeps playing after a switch does not prove that the new server is handling that connection.

Per-app readings: distinguish app attribution, domains, and system activity

Per-server statistics show the egress; per-app statistics show the source. They are not two separate totals to add together. The same request can be attributed to both a source and an egress. Use the app view to see “which identifiable source became active during the test” and the server view to see “which egress showed a traffic change.” Compare both within the same time window.

On iPhone and iPad, information available to the tunnel is not the same as app attribution in system battery or cellular settings. Don’t assume Data can list complete upload and download totals for every installed app. If the current page groups traffic by app, first check what its labels mean. If it shows only servers, connections, or domain records, work with those fields instead of looking for a menu that isn’t there.

ViewQuestion it can help answerMain limitation
ServerWhich proxy egress has a rising counter?Doesn’t fully identify the app that initiated the traffic
App attributionWhich identifiable source generated activity?What can be identified depends on the system and the page’s capabilities
Domain or destination addressWhich network destination did the request access?The same destination may be used by multiple apps
Request and rule recordsHow did a specific request select its policy?Must be matched to the test time and destination

A browser may contact the main domain, image hosts, font hosts, and API domains when loading a page. Other apps may use the same content delivery addresses. Seeing a domain therefore doesn’t prove that only one app uses it. Background sync, system push notifications, and cached content also affect readings: traffic may appear without any action, while reopening a cached page may generate very little.

Takeaway: verify source and egress separately

Start with one new request from a single app to narrow the scope. Then check the destination and matched policy to confirm the egress. Don’t attribute an entire increase in server totals to the app you just opened.

Verify routing with Global Routing and rule records

Before checking a rule, look at Global Routing on Home. Proxy, Direct, Config, and Scene are different modes: Proxy routes through a proxy, Direct connects directly, Config follows the active configuration, and Scene requires checking the selected scene’s settings. To verify a rule in Config, first confirm that Config is active; an enabled connection alone doesn’t confirm it.

The examples below are minimal illustrations of the syntax, not instructions to replace your current configuration. example.com is a sample domain; 192.0.2.0/24 is a documentation-only address range, not a destination for real connectivity tests. Save your current configuration before making changes, and confirm that any policy name you use actually exists.

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

Rules are generally checked in configuration order. An earlier match may prevent later rules from handling a request. If Data shows only traffic changes, you can’t infer which specific rule matched. Check the app’s request or log records against the test destination, time, matched rule, and actual policy. The location of these records depends on the current interface; a statistics row is not a rule-match log.

A repeatable test: compare changes, not totals

For a short test, use one foreground app on the same network, with the same server selected and the same configuration. Pause other active downloads and sync tasks, while allowing that system background traffic may continue. The goal isn’t to make the device completely silent, but to define the request and time window clearly enough to compare with the records.

  1. Record the conditions: Note whether you’re on Wi-Fi or cellular, the Global Routing mode, active Config, server entry, and connection status. Don’t update the subscription yet.
  2. Record the baseline: Write down the upload and download readings for the statistic you’re checking in Data. You can reset it if the page offers that option, but comparing before-and-after readings doesn’t require a reset.
  3. Make a new request: Open a page whose domain you can verify, note the time, and observe for about 60 seconds. This is just a test window, not a performance benchmark.
  4. Record the end reading: Check the same statistic and confirm that the measurement scope is unchanged, with no reconnect or network switch during the test.
  5. Cross-check: Match the egress in the request record to the change in Data. After changing one setting, make a new request and test again.

For example, if a server’s download reading starts at 120 MB and ends at 128 MB, the increase is 8 MB. This is a calculation example, not a measured result, and it doesn’t mean the webpage was 8 MB. If background activity occurred during that period, the change includes that traffic too. If readings are rounded to whole MB, a small request may not cause a visible change right away.

Takeaway: change one condition at a time

First verify the egress with the configuration held constant. Then change one rule and make a new request. Don’t update the subscription, switch networks, and change servers in the same test; otherwise, you won’t know which change caused a different reading.

A subscription update may change server entries, while a change to Config may alter routing. Keep both separate from the test. If you need to update your existing subscription, finish the update and check the selected entry again before recording a new baseline. Don’t assume that statistics for servers with the same name before and after an update are one continuous set of readings.

Common questions about traffic readings

A webpage loads, but server traffic barely increases. Why?

First check Global Routing on Home, then see whether the request used DIRECT or another policy. Make a new request to rule out cached content, and confirm you’re checking the intended server rather than another entry with the same name. A webpage loading by itself doesn’t prove it went through the currently selected server.

Why do upload and download readings change when I haven’t opened an app?

Keep the network conditions unchanged and record a short idle period, then compare it with a single foreground action. Background sync, system communication, and existing connections may continue transferring data. Use destination addresses and timestamps to narrow down the source; a change in total usage doesn’t prove that a particular app is uploading a file.

Why can’t I find per-app statistics?

First check which groupings the current Data page actually provides; don’t mistake a server list for an app list. If there’s no app attribution field, use one foreground app, a fixed time window, and request records to observe traffic. Read system usage statistics according to their own measurement method, rather than subtracting them directly from tunnel totals.

Why does the page still show an error when Data has increased?

An exchange of bytes only shows that communication occurred. Check the error and policy for the failed request, then review destination reachability, DNS, and connection parameters. Handshakes, error responses, and retries can all increase traffic, so activity alone doesn’t prove that a request succeeded or that the connection is performing normally.

After troubleshooting, keep only the information needed to reproduce the issue: test time, network type, routing mode, destination domain, egress policy, and change in readings. Before sharing diagnostics, redact subscription URLs, access tokens, passwords, and private keys. Include only the relevant portions of screenshots or logs; there’s no need to publish your full configuration.

Verify on the App Store