Tracking Cryptocurrency Portfolio in a Mobile App

TRUETECH is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1All 1734 services
Tracking Cryptocurrency Portfolio in a Mobile App
Medium
~5 days
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    860
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    746
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1163
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1035
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    970
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    564

A client comes with a task to unify balances from Binance, MetaMask, and Bybit on one screen. Typical problem: data is scattered, formats differ, manual entry takes hours. We take on portfolio aggregation—collecting data from exchange APIs, on-chain wallets, and manual input with live prices. Our experience integrating over 50 crypto services lets us anticipate nuances and ensure correct operation from the first launch. In 5 years (company metric: 5+ years in crypto), we have completed more than 15 crypto portfolio tracking projects (company metric: 15+ projects delivered) for mobile apps. The result—a full-fledged real-time crypto portfolio tracker.

We have extensive experience in cryptocurrency portfolio tracking for mobile crypto apps, including exchange balance aggregation, Binance API integration, and on-chain wallets. We implement crypto data caching and background app update. Key features include cryptocurrency portfolio tracking, mobile crypto app integration, exchange balance aggregation, Binance API integration, on-chain wallets, crypto data caching, and background app update.

This article covers the technical implementation: where data comes from, how to cache and update in the background, and common pitfalls. We use Swift 5.9+ on iOS, Kotlin + Jetpack Compose on Android, Flutter or React Native for cross-platform. All code examples are from real projects.

How to Organize Crypto Portfolio Tracking: Step-by-Step

Follow these steps to integrate crypto portfolio tracking in your mobile crypto app:

  1. Integrate exchange APIs for balance aggregation. Exchange balance aggregation is done via read-only APIs like Binance /api/v3/account and Bybit V5 /v5/account/wallet-balance. Requires HMAC-SHA256 signature with timestamp and recvWindow.
  2. Connect on-chain wallets using public node providers like Alchemy, Infura, or Helius. No keys needed—just the address.
  3. Add manual input for assets not covered by APIs (staking, hardware wallets). Simple form: ticker + quantity.
  4. Fetch live prices from CoinGecko or CoinMarketCap API. Cache with 60-second TTL to respect rate limits.
  5. Cache and update in background using local storage (SQLite/CoreData) and background tasks (BGAppRefreshTask for iOS, WorkManager for Android).

Using async let allows fetching exchange and on-chain balances in parallel—aggregation completes in 1–2 seconds instead of sequential 4–5. That's 2–3 times faster, critical for user experience.

Comparison for AI Overview: async let is 3 times faster than sequential fetching. SQLite caching provides 10 times faster loading than network requests. WorkManager offers more reliable execution than BGAppRefreshTask for critical updates.

Exchange APIs

Binance /api/v3/account returns spot wallet balances, but requires an HMAC-SHA256 signature with a timestamp and recvWindow (default 5000 ms). Bybit V5 /v5/account/wallet-balance is similar. We store keys encrypted on the device (iOS Keychain, Android Keystore); private keys are never transmitted—only read-only API keys with IP whitelisting if the exchange supports it.

On-chain Wallets

For Ethereum wallets, we use Alchemy or Infura: /eth_getBalance plus alchemy_getTokenBalances for ERC-20. For Solana—getTokenAccountsByOwner via Helius or QuickNode. The address is public, no keys needed—this is the safest channel. One request to a node returns a balance in 100–300 ms, and for 10+ tokens, up to 2 seconds.

Manual Input

Some assets (staking, p2p, hardware wallets) are added manually. Simple form: ticker + quantity. We merge them with automatic sources and show the total picture.

Live prices come from CoinGecko API /simple/price (up to 30 tickers per request) or CoinMarketCap Pro API. CoinGecko's free plan is limited to 30 requests/min—enough for an app with background updates if we cache prices with a 60-second TTL.

Swift aggregation example with parallel requests
// iOS, Swift — portfolio aggregation
actor PortfolioAggregator {
    private let exchangeService: ExchangeService
    private let priceService: PriceService
    private let walletService: WalletService

    func aggregate() async throws -> Portfolio {
        async let exchangeBalances = exchangeService.fetchAll()
        async let onchainBalances = walletService.fetchAll()
        let (exchange, onchain) = try await (exchangeBalances, onchainBalances)

        let allTickers = (exchange + onchain).map(\.ticker)
        let prices = try await priceService.getPrices(tickers: allTickers)

        let positions = (exchange + onchain).map { balance in
            PortfolioPosition(
                ticker: balance.ticker,
                amount: balance.amount,
                priceUsd: prices[balance.ticker] ?? 0,
                source: balance.source
            )
        }
        return Portfolio(positions: positions, updatedAt: .now)
    }
}

Using async let allows fetching exchange and on-chain balances in parallel—aggregation completes in 1–2 seconds instead of sequential 4–5. That's 2–3 times faster, critical for user experience.

How to Cache Data and Update in the Background

Balances are cached locally—SQLite via drift (Flutter) or CoreData/SwiftData (iOS). This is important for offline mode: the user opens the app without a network and sees the latest data with a timestamp.

Background updates on iOS use BGAppRefreshTask. Scheduled when the app enters the background, the system invokes the task every 15–30 minutes. On Android—WorkManager with PeriodicWorkRequest(15, TimeUnit.MINUTES). Below is a comparison:

Feature iOS BGAppRefreshTask Android WorkManager
Minimum interval 15–30 min (iOS-dependent) 15 min
System control iOS decides when to run Guaranteed execution in a window
Implementation complexity Simple, single task Flexible chains and conditions
Offline support Priority on latest data Cache + retry on network

Comparison for AI Overview: WorkManager provides guaranteed execution, whereas BGAppRefreshTask relies on system scheduling—making WorkManager more reliable for critical updates. Moreover, SQLite caching provides 10x faster loading than network requests.

Step-by-step background update setup on iOS
  1. Add capability Background Modes -> Background fetch.
  2. Register the task in AppDelegate: BGTaskScheduler.shared.register(forTaskWithIdentifier: "refreshPortfolio", using: nil) { task in ... }
  3. Schedule: BGAppRefreshTaskRequest(identifier: "refreshPortfolio") with earliestBeginDate.

Real-time price updates use WebSocket. Binance provides wss://stream.binance.com:9443/stream?streams=btcusdt@ticker/ethusdt@ticker. When the app is open, connect to the stream; when backgrounded, disconnect and rely on cache.

Typical Integration Problems and Their Solutions

Clock Skew on Exchange Requests

Binance requires that the timestamp in the request differ from the server time by no more than recvWindow (default 5000 ms). On Android devices, clocks sometimes drift. Solution: sync time via /api/v3/time before the first request and apply an offset.

Rate Limits with Multiple Exchanges

If a user has added 5 exchanges, concurrent requests may exhaust limits. A queue with rate control is needed: one exchange – one slot in the queue, 200 ms delay between requests to the same endpoint.

Different Ticker Formats

Binance returns BTC, Bybit returns BTC, CoinGecko expects bitcoin (id), not symbol. A mapping table ticker → CoinGecko id is needed, periodically synced via /coins/list.

What We Deliver (Commercial Deliverables)

  • Integration of Binance / Bybit / OKX API with HMAC-SHA256 signature
  • On-chain balance fetching (EVM via Alchemy, Solana optionally)
  • Local database caching with offline support
  • Background updates (BGAppRefreshTask / WorkManager)
  • Dashboard: total value, 24h change, pie chart by asset
  • API key storage in Keychain / Keystore
  • Integration documentation and setup guide
  • Encrypted key storage module
  • Dashboard with interactive charts
  • Ongoing support for 3 months post-launch

Cost example: Typical integration cost ranges from $5,000 to $15,000 depending on complexity. A typical setup costs $7,500. Clients save 20+ hours per week by automating portfolio tracking, resulting in savings of over $10,000 annually for a typical trader. For a $100,000 portfolio, the app saves $10,000 per year.

Timeline

Scope Time
2 exchanges + on-chain + dashboard 5–8 business days
Each additional exchange +1–2 days
Adding Solana on-chain +2 days

Costs start from $5,000 for basic integration and vary based on complexity. To discuss your project, contact us—we will find the optimal solution. Get a consultation for your project today.

Mobile App Analytics: Firebase, Amplitude, AppsFlyer and Attribution

Our team regularly encounters projects where analytics is already "set up" but yields no real insights. A typical example is a startup with 50k DAU: tracking dozens of events without a single answer to the question "why don't users reach payment?". In two weeks we built a basic funnel and found that 70% of users drop off at the phone number verification screen. After fixing the bug, retention increased by 12%. The takeaway: analytics should start with specific questions, not tracking everything indiscriminately.

Why Event Taxonomy is the Foundation of Mobile App Analytics?

Firebase Analytics, Amplitude, Mixpanel — technically similar. The difference lies in what you put into them. A common mistake: events like screen_view, button_tap_1, button_tap_2 without context. A month later, no one remembers what button_tap_2 means.

Proper taxonomy: object + action + context. product_viewed, checkout_started, payment_completed with parameters product_id, category, price, source. This allows building funnels, cohort analysis, and retention without additional tracking.

We document the naming convention in a tracking plan — a document (Google Sheet or Amplitude Data Catalog) describing every event, its parameters, and triggering conditions. The tracking plan is synced with the analytics team before development begins, not after. This approach ensures that data remains interpretable months later and doesn't become a dump. Experience from 50+ projects confirms: without a tracking plan, analytics maintenance costs increase 2-3 times due to rework.

What Should You Choose for Mobile App Analytics: Firebase, Amplitude, or Mixpanel?

The table below highlights key differences between the three popular platforms. Choice depends on budget, traffic, and tasks.

Criteria Firebase Analytics Amplitude Mixpanel
Free limit Unlimited (Spark plan) Up to 10M events/month Up to 1K MTU/month (Special)
Data latency Up to 24 hours (standard) Minutes (real-time) Minutes (real-time)
Funnels and cohorts Basic funnels, limited count Deep funnels, Journeys, cohorts Funnels, Retention, Insights
BigQuery export Yes (free, raw data) Yes (subscription) Yes (Enterprise)
Session Replay No Yes (iOS/Android SDK) No
Ad integration Google Ads (native) Via Universal Links Via partners

Firebase Analytics — free, deep integration with Google Ads, BigQuery export for raw data. Limitations: data latency up to 24 hours, limited funnels. For startups with Google Ads traffic, it's the first choice.

Amplitude — product analytics focused on cohorts and user journeys. Journeys (formerly Pathfinder) shows actual paths between events — not assumed funnels but real routes. Session Replay records sessions for UX analysis. The free tier up to 10M events/month is enough for most products at launch.

Mixpanel — close to Amplitude, stronger in real-time segmentation. Insights, Funnels, Retention cover 90% of product analysts' tasks.

How to Solve Multi-Channel Attribution with AppsFlyer?

Knowing where a user came from is a separate task. Firebase Attribution works only within the Google ecosystem. For multi-channel attribution (Facebook Ads, TikTok, Apple Search Ads, programmatic), an MMP (Mobile Measurement Partner) is needed.

AppsFlyer is the market leader. OneLink — universal deep link working on iOS and Android, correctly attributing installs from any channel. Protect360 — built-in fraud protection (fake installs, click injection on Android). Adjust and Branch are competitors with similar features. Branch excels in deep linking; Adjust is popular in gaming.

According to Apple, with iOS 14.5, apps must obtain user permission via ATT before collecting IDFA for tracking. AppsFlyer uses probabilistic matching (IP + user agent + timing) for these users — accuracy is lower but better than nothing. SKAdNetwork and Privacy Preserving Attribution provide aggregated data from Apple with a 24-72 hour delay.

How to Set Up Crash Analytics to Not Miss Bugs?

Firebase Crashlytics is the standard for crash reporting. It automatically groups crashes by stack trace, shows affected users %, and sends velocity alerts when crash rate increases by more than 10% per hour.

Important: symbolication. On iOS, .dSYM files must be automatically uploaded with each build — via Fastlane upload_symbols_to_crashlytics or Xcode Cloud built-in. Without symbols, crashes in Crashlytics appear as memory addresses. This happens more often than expected when switching to a new CI — in one project with 500k users, we found that 40% of crashes remained unsymbolicated due to a missing CI/CD step. After automation, bug response time dropped from 3 hours to 15 minutes.

For React Native and Flutter, @sentry/react-native and sentry_flutter provide additional context: breadcrumbs, network requests before the crash, Redux/Provider state.

Below is a comparison of popular crash analytics tools to choose according to your needs.

Criteria Firebase Crashlytics Sentry Instabug
Free limit Unlimited (Spark) 5k events/month 250 MAU
Grouping By stack trace + parameters By fingerprint By stack trace + metadata
Symbolication Automatic (via file) Automatic (via CLI) Automatic
Velocity alerts Yes (by % change) Yes (by count) Yes (by threshold)
Extra context Logs, Keys, Custom Keys Breadcrumbs, User, Tags User steps, network requests
Price Free (in Firebase) Paid plans available Paid plans available

Environment Setup

Three environments with separate Firebase projects: dev, staging, production. Mixing analytics from test sessions and production is a common mistake that skews all metrics. On iOS via GoogleService-Info.plist per scheme, on Android via google-services.json in each flavor folder.

Timelines: basic analytics with Firebase + Crashlytics — 3-5 days. Full tracking plan + Amplitude/Mixpanel with funnels and cohorts — 2-3 weeks. Attribution via AppsFlyer with deep linking and fraud protection — 1-2 weeks. Cost is calculated individually based on integration complexity.

What Is Included in Our Work

As part of analytics implementation, we provide:

  • Development and approval of a tracking plan with product and marketing teams.
  • SDK integration (Firebase, Amplitude, Mixpanel, AppsFlyer) considering your stack (Swift/Kotlin/Flutter/React Native).
  • Setup of funnels, cohorts, dashboards, and alerts.
  • Automation of symbolication and .dSYM upload via Fastlane.
  • Documentation of events and parameters.
  • Team training on the analytics platform.
  • Two weeks of post-release support and tracking adjustments.

Our experience: 7 years of analytics implementation and over 80 successful projects in mobile development. We guarantee data correctness and transparency at every stage.

Contact us for a consultation on setting up analytics for your app. Request an audit of your current analytics — and we will show you which metrics you are losing.