You launched a mobile app, but conversion is dropping and analytics don't show where users get stuck. Sentry and Datadog catch errors, but don't answer why taps fail. We integrate UXCam — a session recording, heatmap, and gesture analysis service. In 1–2 days we integrate the SDK turnkey, set up sensitive data masking and screen tagging so your UX team sees real user sessions filtered by events and properties. Our experience: over 50 successful integrations in iOS and Android projects, quality assurance at all stages. Time savings of up to 30% in analysis thanks to ready-made funnels and heatmaps.
Why UXCam instead of Sentry or Hotjar?
UXCam specializes in mobile UX research. Here are key differences:
| Criteria | UXCam | Sentry | Hotjar |
|---|---|---|---|
| Focus | Mobile UX | Errors & crashes | Web & desktop |
| Gesture recording (taps, scrolls) | Yes | No | Limited |
| Heatmaps | Taps, gestures, areas | No | Clicks (web) |
| Data masking | Automatic + UI tags | N/A | Input fields |
| Session filtering | By events, properties | By errors | By pages |
| API for events | Native SDK | REST API | JavaScript |
Unlike Sentry, UXCam records video sessions with gestures, showing where users get stuck and what they tap in vain. For mobile projects, this is an indispensable tool.
SDK Installation and Configuration
iOS (Swift Package Manager)
// 1. Подключение через SPM (Package.swift)
// .package(url: "https://github.com/uxcam/ios-sdk", from: "3.6.0")
// 2. Инициализация в AppDelegate
import UXCam
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = UXCamConfiguration(appKey: "YOUR_APP_KEY")
config.enableAdvancedGestureRecognizers = true
UXCam.startWithConfiguration(config)
return true
}
// 3. Маскировка чувствительных View
UXCam.occlude(view: cardNumberView, hideGestures: true)
// Скроет весь экран оплаты
UXCam.tagScreenName("Payment", isOccluded: true)
// 4. Тегирование экранов (в viewDidAppear)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UXCam.tagScreenName("Product Detail")
}
// 5. Кастомное событие
UXCam.logEvent("add_to_cart", withProperties: [
"product_id": product.id,
"category": product.category,
"price": product.price
])
// 6. Свойства пользователя
UXCam.setUserProperty("plan", value: "premium")
// 7. Семплинг: записывать только 30% сессий
// (установить в config до старта)
config.userAppKey = "YOUR_APP_KEY" // для семплирования
// 8. Принудительное завершение сессии
UXCam.stopSessionAndUploadData()
Android (Kotlin/Gradle)
// 1. Подключение через Gradle
// implementation("com.uxcam:uxcam:3.+")
// 2. Инициализация в Application.onCreate()
val config = UXCamConfiguration.Builder("YOUR_APP_KEY")
.enableAdvancedGestureRecognizers(true)
.build()
UXCam.startWithConfiguration(config)
// 3. Маскировка View
UXCam.occludeSensitiveView(binding.cardNumberField)
// Весь экран оплаты
UXCam.tagScreenName("Payment", isOccluded: true)
// 4. Тегирование экрана (в Fragment.onResume())
override fun onResume() {
super.onResume()
UXCam.tagScreenName("Product Detail")
}
// 5. Кастомное событие
UXCam.logEvent("add_to_cart", mapOf(
"product_id" to product.id,
"category" to product.category,
"price" to product.price
))
// 6. Свойства пользователя
UXCam.setUserProperty("plan", "premium")
// 7. Семплинг: запись 30% сессий (через config)
// (установить до старта)
// 8. Завершение сессии
UXCam.stopSessionAndUploadData()
Masking Private Data
UXCam automatically hides fields marked as isSecureTextEntry (iOS) and password type (Android). For custom elements, use tags in XML or code calls:
| Element | Masking Method |
|---|---|
| Card number field | UXCam.occludeSensitiveView() |
| Entire payment screen | tagScreenName("Payment", isOccluded: true) |
| Code input field | android:tag="uxcam_mask" in XML |
| Passport image | UXCam.occlude(view: passportImage) |
Why Data Masking Is Critical for Compliance?
App Store Review Guidelines (Section 5.1.4) and Google Play Privacy Policy require that apps do not transmit sensitive data without consent. UXCam helps meet these requirements: automatic input field hiding and the ability to force-occlude any View. If masking is not configured, session recordings may contain card numbers, passwords — this can lead to app update rejection or legal consequences. In our projects, we always add masking to all screens with personal data: payment, registration, profile.
How to Properly Tag Screens?
Automatic names like ViewController_3_Step2Fragment are unreadable. Add explicit tags in viewDidAppear / onResume. Use constant strings like "Product Detail" instead of "detail". This allows building funnels and heatmaps by screens in the dashboard.
Custom Events and User Properties
Events track business actions: add_to_cart, checkout_start, payment_failure. User properties (plan, registration_cohort) segment the audience — you can view sessions only for premium users. We recommend adding 10–15 key events and 3–5 properties.
For example, in a recent fintech project, we set up events for every step of the payment flow. This helped the UX team identify that 40% of users abandoned at the OTP verification screen because the keyboard covered the input field. The fix increased conversion by 12%.
Sampling and Recording Management
For apps with DAU > 10k, limit the percentage of recorded sessions to avoid exceeding storage limits. A typical strategy: 10% random sessions + 100% sessions with an event of interest (e.g., critical_error). In code, this is implemented via a config flag and forced start of recording on key events.
How to Configure Sampling to Reduce Storage Costs?
Start by choosing a random session percentage (usually 10-30%) and save conditions. Example config for iOS: set config.sessionRecordingChance = 0.1 and in the critical_error handler call UXCam.stopSessionAndUploadData(). For Android, use UXCam.setSessionRecordingProbability(0.1f). Additionally, set a maximum number of sessions per day. We help select optimal parameters for your traffic.
Example sampling config for iOS with priority events
// Sampling config: 10% random sessions
let config = UXCamConfiguration(appKey: "YOUR_APP_KEY")
config.sessionRecordingChance = 0.1
UXCam.startWithConfiguration(config)
// Force save session when critical_error occurs
// Call in error handler:
UXCam.stopSessionAndUploadData()
What's Included in the Work
- SDK integration on both platforms
- Masking all sensitive screens and fields
- Tagging all main screens with readable names
- Setting up 10+ key events with parameters
- User properties for segmentation
- Sampling configuration for your traffic
- Integration documentation and team training
Timeline and Pricing
Basic integration with masking and tagging — from 1 day. Full setup with custom events and sampling — from 3 days. Pricing is individual based on complexity and number of platforms. We will evaluate your project within 24 hours upon inquiry.
Get a consultation: write to us to discuss UXCam integration into your app. We guarantee quality results, backed by 5+ years of experience and 50+ implemented mobile analytics projects. Order turnkey integration — we'll do everything in 1-3 days.







