A feature that works on office wifi and fails on a bus is not finished. The gap is not bandwidth — it is latency, packet loss and connections that come and go in the middle of a request.
Reproduce, don’t imagine
The emulator’s network profiles cover throttling. A local proxy covers latency and dropped requests. Flapping — connected, disconnected, connected — is the one that finds the real bugs, and it is worth a script.
Make retries boring
Exponential backoff, a cap, and idempotent requests. If a retry can duplicate a record, the bug is in the API, not the client.
What I would do differently
Add a visible sync state to the UI from day one.