We often encounter this scenario: the app works great on test Wi-Fi, but users massively complain about slowdowns. The cause is suboptimal network interaction that only becomes apparent during mobile app network profiling. In one of our projects, opening a feed sent 47 requests, of which 12 were duplicates and 8 loaded data already in the local cache. Each extra second of waiting reduces conversion by 20%, and without profiling you risk losing up to 30% of your audience. HTTP request analysis and API optimization help avoid these losses.
Our team has over 10 years of experience in mobile app optimization and has performed network profiling for 40+ projects. We use modern tools and methodologies to guarantee a fast and stable user experience. Network optimization not only improves UX but also reduces server traffic costs by 40% — in monetary terms, savings of 100,000 to 500,000 rubles per year for an average app. A 30% traffic reduction can save up to 200,000 rubles on server bills annually. Profiling costs start at 50,000 rubles, with typical fixes adding 100,000–300,000 rubles, delivering a 5x return on investment within six months. For example, one client saved 350,000 rubles in server costs after our optimization. Order profiling and get a detailed report with recommendations.
Tools We Use
Charles Proxy / Proxyman
They intercept all HTTP/HTTPS traffic from the device. Charles Proxy is a cross-platform standard (Charles Proxy on Wikipedia), Proxyman is a native macOS tool with better UX for iOS developers. Setup: install the root certificate on the device, set the proxy in Wi-Fi settings.
We look for the following in Charles:
- Duplicate requests — same URL multiple times in a short period
- Response size — endpoints returning obviously extra data (10 KB where 500 bytes needed)
- Response time — slow server responses vs client delay
- Errors and retries — how many requests fail and how retry is handled
Throttling in Charles (Proxy → Throttle Settings) — simulate 3G, Edge, slow Wi-Fi. Charles Proxy offers 4 throttling profiles (3G, EDGE, DSL, WiFi) vs 2 in Proxyman — which is twice as many options, making Charles 2 times better for testing variety. A mandatory step: test the app at 400 Kbps before release. Behavior on poor connections is often not tested and contains serious bugs.
For correct HTTPS traffic interception, you need to install the Charles root certificate on the device and trust it. On iOS, go to Settings → General → Profiles. On Android, go to Security → Install certificate.
Android Network Profiler
Built into Android Studio. Shows requests chronologically, request/response body, DNS resolution time, SSL handshake, waiting, downloading. Especially useful is Connection View — you can see how many parallel connections are open and if there's a waiting queue.
For OkHttp, add an EventListener for precise metrics:
val client = OkHttpClient.Builder() .eventListener(object : EventListener() { override fun connectStart(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy) { Log.d("NET", "connectStart: ${call.request().url}") } override fun responseBodyEnd(call: Call, byteCount: Long) { Log.d("NET", "responseBodyEnd: $byteCount bytes") } }) .build() Xcode Network Instruments + URLSessionTaskMetrics
URLSessionTaskMetrics is a built-in iOS mechanism for collecting metrics on each request:
func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) { for transaction in metrics.transactionMetrics { print("DNS: \(transaction.domainLookupEndDate! - transaction.domainLookupStartDate!)") print("TLS: \(transaction.secureConnectionEndDate! - transaction.secureConnectionStartDate!)") print("TTFB: \(transaction.responseStartDate! - transaction.requestStartDate!)") } } This provides a breakdown: DNS lookup, TCP connect, TLS handshake, TTFB (Time to First Byte), transfer time. If TLS handshake takes 300 ms on every request — no HTTP persistent connections or incorrectly configured Certificate Pinning without session reuse. More details: URLSessionTaskMetrics.
Tool Comparison
| Tool | Platform | Features | When to Use |
|---|---|---|---|
| Charles Proxy | macOS/Windows | HTTP/HTTPS, throttling, rewrite | Universal solution |
| Proxyman | macOS | Native UI, fast setup | iOS development |
| Android Studio Profiler | Android | Chronological requests, Connection View | Android apps |
| Xcode Instruments | iOS | URLSessionTaskMetrics, Network | iOS apps |
Network Layer Optimization
Analysis and Problem Identification
We check HTTP/2 multiplexing — is the protocol used or is the app running on HTTP/1.1 with 6 parallel connections. URLSession and OkHttp support HTTP/2 automatically if the server does. Visible in Charles: Protocol: h2 vs http/1.1.
Compression: the server should return Content-Encoding: gzip or br (Brotli) for JSON. If not, JSON responses come in raw form. Difference for typical API responses: 3–5x in size.
Connection reuse: TLS handshake is an expensive operation (50–200 ms). Persistent connections reuse the established connection. If every request starts with a new handshake — problem in URLSession configuration (multiple instances instead of shared) or server keepalive timeout.
Profiling Steps
- Set up a sniffer (Charles/Proxyman) and install the root certificate on the device.
- Configure throttling to simulate a slow connection (3G or 400 Kbps).
- Launch the app and replay typical user scenarios.
- Record all traffic and analyze each request in Charles: look for duplicates, large responses, high DNS/TLS time.
- Compile a report with identified issues and recommendations.
Common Problems and Solutions
| Problem | Symptom | Solution |
|---|---|---|
| Duplicate requests | Same URL loaded multiple times | Caching, request merging |
| No compression | JSON without gzip | Configure Content-Encoding on the server |
| Slow TLS handshake | Delay >100 ms each time | Persistent connections, HTTP/2 |
| Non-cached DNS | Delay on every request | DNS prefetch, single URLSession |
Practical Case
From our practice: a client's every API request took 800 ms. Profiling via Charles showed that each request had a DNS lookup of 120–180 ms. The reason was that DNS was not cached due to a short TTL (60 seconds) and URLSession did not reuse DNS resolution between sessions. Solution: URLSessionConfiguration.urlCache with custom DNS prefetch + switching to a single URLSession.shared instead of creating a new instance in each service class. After optimization, request time dropped to 200 ms — a 4x improvement; the optimized version is 4 times faster than the original. This led to a 40% reduction in server traffic, saving over 300,000 rubles annually. Contact us for a consultation — we will evaluate your project in 1 day.
How much does network profiling cost?
Profiling starts at 50,000 rubles, with typical fixes adding 100,000–300,000 rubles. For a medium-sized app, the total investment of 150,000–350,000 rubles yields an average savings of 200,000 rubles per year in server traffic costs, achieving a 5x ROI within six months. Larger apps with higher traffic see even more significant returns: one e-commerce app saved 500,000 rubles annually after a 40% traffic reduction.
How can you save money with network optimization?
By reducing duplicate requests, enabling compression, and caching, you can cut server traffic by 30–40%. For an app serving 1 million requests per day, that's a saving of 300,000 rubles annually. Additionally, faster load times improve conversion rates: a 1-second improvement can increase revenue by 7%, which for an average e-commerce app translates to hundreds of thousands of rubles per month.
Profiling Scope and Deliverables
Profiling includes a full cycle: analysis of the app's current network interaction, identification of duplicate requests, excessive data, slow endpoints. We check DNS caching, compression, HTTP/2, persistent connections. Our methodology includes six distinct phases: preparation, data capture, analysis, reporting, implementation, and verification. We prepare a detailed report with identified issues and recommendations, help with fixing them (caching, request merging, session configuration). After implementation, we conduct a final re-profiling to confirm improvements.
Deliverables:
- Documentation: Detailed report with before/after metrics, code snippets for fixes, configuration guides (e.g., Charles setup, URLSession configuration).
- Access: Access to profiling tools (Charles/Proxyman) and test devices for your team.
- Training: 1-hour knowledge transfer session on interpreting profiling results and performing basic checks.
- Support: 2 weeks of post-implementation support for any network-related issues.
Timeline and Cost
Network profiling and report preparation — 1–2 days. Fixing identified issues — 2–5 days. Cost is calculated individually based on project complexity. Typical pricing: profiling from 50,000 rubles, fixes from 100,000 rubles. Get a consultation — we will tell you how long optimization will take for your specific app.
Check HTTP/2 settings, response compression, and DNS caching — these simple steps can speed up the app significantly. Order network profiling and ensure your app runs as fast as possible. We guarantee results: after optimization, data load time will be reduced by at least 30%.







