Self-hosted mobile app analytics and replay

Mobile teams that need usage data and replays without sending them to a third-party SaaS can run OpenReplay and PostHog in their own infrastructure. This page covers the requirements, platform fit, rollout and partner questions specific to iOS, Android and React Native apps.

On this page

Why self-hosted mobile analytics and replay need a different plan

A mobile product or platform lead who wants native usage data and session replays without sending device data to a third-party vendor should plan for a mobile-specific stack from the start. OpenReplay's README lists native mobile replay for iOS, Android and React Native, and PostHog's README lists event tracking across its product analytics suite, so most teams pair the two or choose one based on whether replay or event analytics is the primary need. Confirm which mobile SDKs each platform currently ships and whether the mobile replay feature set matches the web feature set before you commit, because the README describes the capability at a summary level only.

Mobile differs from web in four ways that change the build. First, the SDK is packaged inside the app binary, so every analytics change ships through an app store release cycle rather than a single deployment, and a broken masking rule can stay live on user devices until the next build is adopted. Second, app store review requires accurate privacy disclosures for the data the app collects, so the team must map each SDK's collected data types to the store's declarations and keep that mapping current when the SDK updates. Third, users go offline on trains, in basements and on flights, so the SDK needs to buffer events locally and send them later. Confirm how each candidate SDK queues, caps and retries offline events, and what happens to a buffer if the app is force-closed. Fourth, device identifiers such as advertising IDs and install IDs carry personal data meaning in many jurisdictions, so the team must decide which identifiers are collected, whether they are reset, and how they link mobile and web sessions for the same user.

Decide these four items before writing tracking code: the SDK version policy, the store disclosure owner, the offline buffering limits and the identifier design. Each decision changes the masking tests, the retention settings and the self-hosted infrastructure you need. Ask any implementation partner to demonstrate the offline path and the masking path on real test devices, and to show where the data lands in your own environment.

Which requirements shape a self-hosted mobile analytics build

This table sets out the requirements that most affect a self-hosted mobile analytics and replay build, and what each one changes in the architecture. Read each row as a question to answer before choosing an SDK, a backend topology or a retention policy. The main takeaway is that most of the hard work sits in the app and the release process, not only in the server.

RequirementWhat it asks forBuild impact
App store privacy disclosuresAccurate declarations of the data types collected, their purposes and whether they are linked to users, in Apple's privacy nutrition labels and Google Play's data safety sectionEvery SDK field, event property and replay setting must be inventoried so declarations match the shipped app. Confirm current store requirements directly with each store before release.
Capture-time masking of inputs and screensSensitive fields, screens and text are masked on the device before any data leaves itMasking rules must be set in the native SDKs as well as the web layer. Test masking on each release, since new screens can expose data that old rules missed.
Offline event bufferingEvents and replay chunks are stored locally when the device has no connection and delivered in order when it reconnectsLocal storage limits, batch sizes and retry behavior must be set. Confirm how the chosen SDK handles dropped, duplicated or delayed events, and how long unsent data stays on the device.
Data residency for the self-hosted backendEvent, replay and device identifiers are stored in a region and account the organization controlsChoose the hosting region before the app ships, since moving stored replays later is harder. Document where ingestion, storage and backups sit.
Retention limitsDefined periods for raw events, replay recordings and backups, each with a deletion methodRetention is set on the server, but backups and exports may hold data longer. Build deletion jobs and confirm how replays are removed from storage.
Access control for replaysOnly named roles can view recordings, with logging of who viewed what and whyReplays need role-based permissions, audit trails and single sign-on for staff. Enterprise features for these controls may sit in a paid edition, so confirm licensing first.
First-party ingestion from the operator's domainAnalytics traffic is sent to a domain the organization controls, so it is not blocked as third-party trafficA custom ingestion domain or proxy must be set up for each app build and environment. Plan certificates, DNS and routing as part of the mobile release process.

Which platform fits which mobile team

OpenReplay fits teams whose first question is what users did on the screen before a crash or drop-off. Its README lists native mobile replay for iOS, Android and React Native, alongside DevTools with network activity, console logs and JavaScript errors, so engineers and product staff can review the same session. Self-hosting keeps recordings in your infrastructure, and the README describes capture-time sanitization that masks or skips data before it reaches the server.

  • Native replay coverage: confirm which SDK versions and OS releases your app targets are covered before committing.
  • Sizing reference: the README says a single VM with 2 vCPUs, 8 GB of RAM and 50 GB of storage is enough to start self-hosting. Treat this as a starting point for a test environment, not a production sizing.
  • Enterprise features: the Enterprise edition adds SSO and SAML, SCIM provisioning, roles and permissions, audit trail, a custom SLA and dedicated support. These are paid, custom-priced and tied to a multi-year contract.
  • Licensing: most of the monorepo is AGPLv3, some directories are MIT, and the ee/ directory is under a separate commercial license.
  • Release cadence: the latest release listed on the GitHub releases page is v1.28, published September 25, 2025, so check current versions before planning.

Before you choose, confirm how your app's native masking rules map to OpenReplay's capture settings and who in your organization owns the upgrade cycle.",

Integration points and deployment pattern for mobile analytics

A self-hosted mobile stack touches the app, the ingestion path, the storage layer and the release pipeline. Each card below is a component to confirm with the SDK vendor and your own environment, not a feature we guarantee. Treat them as the checklist to walk through before any SDK ships to an app store.

Ingestion endpoint on a custom domain

Route SDK traffic to a collector hosted on your own domain instead of a vendor default host. This keeps events flowing through infrastructure you operate and reduces the chance that content blockers drop the calls. Confirm the exact host each SDK posts to, whether the hostname is configurable at build time, and how TLS certificates are rotated. Also confirm which SDK versions still reach a self-hosted endpoint after a release, since older app builds may keep calling the previous host.

Masking configuration shipped with each release

Masking rules for mobile screens and inputs travel inside the app binary or its remote configuration, so they must match each build. Confirm where the masking settings are defined, whether they can be changed without an app store review, and how a rule for a new screen is applied. Ask whether the SDK masks by view type, accessibility identifier or both, and whether fields are masked before frames leave the device.

Offline buffering and batch upload

Phones lose connectivity on trains, in basements and on roaming networks, so the SDK queues events and uploads them in batches later. Confirm the maximum queue size, what happens when storage is full, whether events are dropped or kept, and whether an app restart flushes the queue. Test these behaviors per SDK on iOS, Android and React Native, because buffering limits and retry logic differ between platforms and between SDK versions.

Identity linking between mobile and web

A user who signs in on a phone and later on a browser should appear as one person in funnels, otherwise conversion figures split across two profiles. Confirm which identifier the SDKs send, how an anonymous device ID is merged into a known user after login, and whether the merge is applied to replays as well as events. Decide what identifier is allowed to leave the device, since an email address or account number can turn analytics into personal data.

Storage and retention sizing

Replay recordings are much larger than event rows, so storage cost follows session volume and replay length more than event count. Confirm the minimum host specification for your chosen platform, the retention setting you need for each data type, and how deletion runs on expired sessions. Ask for a sizing estimate based on your own monthly sessions and average session length, and check whether backups include replay storage.

CI test of masking after each release

A masking rule that worked in the last build can fail after a redesign, a new form or a library upgrade, and the failure may be invisible until a recording exposes data. Add a pipeline step that runs scripted screens with sample sensitive values, captures the output and fails the build if any test value appears in a recording or network payload. Confirm with your vendor which test hooks the SDK exposes and whether the check can run against a self-hosted collector in a staging environment.

Rollout phases and the output of each

The sequence moves from a data inventory and hosting design through a staging trial, platform-by-platform masking checks and offline testing, into a controlled production cutover and a handover your team can run. Each phase closes with a named deliverable, so you can confirm progress before the next phase starts.

  1. Inventory data and define the event catalog

    DeployOpen works with your product, engineering and privacy leads to list the screens, user journeys and events to track on iOS, Android and React Native, and to decide which screens are in replay scope and which are excluded entirely, such as sign-in, payment and health or banking screens. Each event gets a name, owner, purpose and the properties it may carry, with no free-text fields that could hold personal data. The output is a signed event catalog and a replay scope register that lists excluded screens and the reason for each.

  2. Design hosting and network paths

    The team maps where the self-hosted OpenReplay or PostHog services will run in your cloud account, data center or private network, how mobile SDKs reach the ingestion endpoint, and how mobile traffic is routed through your own domain. The design also covers storage sizing, backups, access paths for administrators and the boundary between mobile analytics and any third-party SDKs already in the app. The output is an approved architecture diagram and a network and sizing note that your security team has reviewed.

  3. Deploy staging with a test app

    DeployOpen installs the chosen platform in a staging environment that mirrors production controls, using the vendor's documented deployment path for your target. A test build of each mobile app, with dummy accounts and synthetic data, sends events and replays so the team can confirm ingestion, dashboards, retention settings and role-based access work end to end. The output is a staging environment with a test log showing events and replays arriving from each platform, and a list of defects resolved before production.

  4. Integrate SDKs and verify masking per platform

    Engineers add the SDKs to iOS, Android and React Native builds, configure capture-time masking for sensitive views, and run the test app through every screen in the replay scope. Each platform is checked separately because native views, webviews and cross-platform components mask differently, and a masked field on one platform can be visible on another. The output is a per-platform masking test report with screenshots or recorded evidence showing that sensitive fields never reach the server, plus a sign-off from the privacy lead.

  5. Test offline and poor connectivity behavior

    The team tests event buffering on devices that lose network connectivity, switch between Wi-Fi and cellular, enter airplane mode, or are force-quit during a session. The goal is to confirm that events queue locally, flush in order when the connection returns, and do not duplicate or drop data, and that replay upload behaves predictably under a weak connection. The output is an offline test matrix with pass or fail results per device and network condition, and documented limits the product team must know about.

  6. Align store disclosures with legal

    Before production, your legal and privacy team compares the events and replay data the app actually collects with the privacy details you declare in the Apple App Store and Google Play Console, including any tracking, identifiers and data types. DeployOpen supplies an accurate inventory from the event catalog and SDK configuration to support that review, but the disclosures are your legal team's decision. The output is a reviewed disclosure statement for each store, a record of who approved it, and a plan for updating it when the SDK or event catalog changes.

  7. Cut over to production and set retention

    DeployOpen promotes the tested configuration to production through a change window agreed with your team, switches the SDK endpoints in a new app build, and monitors ingestion, storage and error rates during the first releases. Retention periods, deletion jobs, backup schedules and access roles are set to match the records you documented earlier. The output is a production cutover record, a retention configuration matching the approved policy and a monitored go-live checklist signed by the platform owner.

  8. Hand over operations and runbooks

    DeployOpen transfers operating knowledge to your platform and mobile teams through runbooks covering upgrades, SDK version changes, masking regression checks after each app release, backup restores and incident response. Your team is trained on the admin console and on what to re-test when the event catalog or app changes. Support after handover depends on the scope agreed in writing, including whether a retainer for upgrades and continuous testing applies. The output is a signed runbook set, a trained operator list and a support boundary document.

Evidence a privacy or security reviewer will ask for

This table lists the evidence a privacy or security reviewer usually asks for when mobile app analytics and replay are self-hosted, and which component produces each item. Read it as a preparation list: DeployOpen prepares this evidence from your configuration and testing, but it does not issue audit reports, attestations or certifications, which independent auditors and certification bodies provide.

Evidence itemWhat the reviewer checksComponent that produces it
Data flow diagramWhich device data leaves the app, which SDK sends it, and that every endpoint is inside your infrastructureYour architecture documentation, mapped against the OpenReplay mobile SDK and PostHog SDK configuration
Masking test results per releasePasswords, card fields and personal identifiers are masked in native replay on each iOS and Android buildTest scripts run against each app build, with screenshots and replay samples retained by the test team
Retention configuration exportReplay and event retention periods match the approved policy for each projectOpenReplay self-managed retention settings or PostHog project retention, exported from the admin console
Access logs and role definitionsWho can view replays, which roles exist, and that access to recordings is loggedOpenReplay Enterprise or PostHog platform packages for SSO, audit logs and roles, where licensed; otherwise confirm the built-in controls
Records of processing entryPurpose, data categories, recipients, retention and security measures for app analyticsYour privacy team, drafted from the data flow diagram and retention export
Store disclosure answers mapped to SDK behaviorEach App Store and Google Play data answer matches what the SDKs collect and sendRelease engineering, checked against SDK versions and the event schema in each build
Offline buffer and upload behaviorQueued events and recordings are encrypted or cleared as documented when devices go offlineMobile SDK configuration and a documented test on a device with the network disabled

What do teams ask before running mobile analytics on their own servers?

What drives the cost of self-hosted mobile analytics and replay?

The main cost lines are infrastructure, implementation work, ongoing operations and internal staff time. Infrastructure is the cloud or data center spend for the replay and analytics servers, storage and backups, and it grows with session volume and retention. Implementation covers SDK integration in iOS, Android and React Native apps, masking configuration and testing, and identity and access setup. Operations recurs: upgrades, monitoring, backups and on-call. Ask any quote to split one-time work from recurring work, and to state which retention period and event volume it assumes. Note that the OpenReplay Dedicated managed tier starts at $199 per month on AWS, GCP or Azure according to its pricing page, which gives one published reference point for a managed alternative.

How long does it take to get the first mobile replay running?

The timeline depends on how many apps you have, whether the team already runs the server, and how much masking review is required before any recording is allowed. A single app with an existing server is far quicker than a multi-app estate that needs identity integration and a privacy sign-off. OpenReplay's documentation describes a single VM with 2 vCPUs, 8 GB of RAM and 50 GB of storage as enough to start self-hosting, so the server itself is rarely the constraint. Ask any implementation partner for a fixed-scope timeline in writing, and confirm that it includes a test build with masking verified before production release.

What does our internal team need to provide?

Your team needs to provide cloud or data center access, a named owner for privacy and retention decisions, and engineers who can build and release the iOS, Android and React Native apps. Security should supply the identity provider, network rules and logging standards. Product owners must define the event tracking plan, because most avoidable cost comes from collecting events nobody uses. Legal or privacy staff should confirm consent handling and retention periods for mobile users. Ask a partner to list these inputs in the written scope so gaps are visible before work starts.

Can our own engineers run this without outside help?

Yes, a capable platform team can deploy OpenReplay or PostHog from their public documentation, and both projects publish self-hosting guides. The harder work is the parts that carry risk: capture-time masking for card, balance and health data, SDK configuration in each app build, offline buffering behavior on poor networks, and app store privacy disclosures. Most teams underestimate the testing needed after each front-end or app release. Decide early which of these you will own, and whether you need a retainer for upgrades and continuous testing.

How does PostHog's free self-host differ from paid support?

PostHog's free Docker Compose hobby deployment is MIT licensed and installed with a deploy-hobby script, but its self-host documentation says self-hosted deployments are officially unsupported and that PostHog does not offer customer support for them. Its README points teams that need fully free software to the posthog-foss repository. Premium features in the ee directory require a PostHog license. Its documentation also states that new Kubernetes deployments of its paid self-hosted product are no longer supported. Support, upgrades and incident response for a self-hosted stack therefore have to come from your team or a partner.

At what event volume does self-hosting stop making sense?

PostHog's README says open-source deployments should scale to approximately 100k events per month and recommends moving to PostHog Cloud above that level. PostHog Cloud's pricing page states that the first 1 million analytics events are free every month, so the cost comparison changes sharply once volume is measured. Replay storage adds to this, and OpenReplay's retention settings are the main lever for its cost. Model your monthly events and replayed sessions for each app before choosing, and ask a partner to show how the design scales beyond the hobby tier.

Questions to put to an implementation partner

Start by asking which SDK versions the partner will ship for each platform, and in writing. For iOS, Android and React Native, ask for the exact OpenReplay mobile SDK version and the PostHog SDK version for each app, the minimum OS versions supported, and how the React Native bridge is handled when the native layer changes. Ask who owns the decision to upgrade when a platform vendor changes its rules, and what the partner does when an SDK release lags behind a new OS release. Confirm the answer against the vendor's own release notes, since the supplied facts do not establish SDK version numbers for this topic.

Next, ask how masking is tested after every release. A credible answer names the specific screens that hold card numbers, balances, health data or identifiers, and describes a repeatable test that records a session on a test device, checks that masked fields never reach the server, and runs again after each app build. Ask whether the test covers network payloads and offline buffered events, because data can leave the device through either path. Also ask who signs off the result and where the evidence is stored. Under a fixed-scope engagement, these checks should appear as named deliverables, not as general best effort.

Finally, ask how store disclosures are mapped to SDK behavior and how the scope will be written. Request a table that links each data type in the Apple App Store privacy details and the Google Play Data safety form to the event or replay field that collects it, with the owner of each entry. Ask how offline buffering is verified, including what happens to queued events after a device is offline for days and when the app is force-quit. On licensing, ask the partner to confirm whether the features required sit in the open-source edition or the separately licensed ee/ code, and who holds the license. On support, ask what happens after go-live, since PostHog states that self-hosted deployments are officially unsupported. Insist that scope, deliverables, acceptance tests and any retainer terms are agreed in writing before work starts.

How DeployOpen scopes and supports mobile analytics

This sequence turns a mobile analytics requirement into a written, fixed-scope plan, a self-hosted stack inside your own infrastructure, and an operating model your team can run after go-live. Each step ends with a document or check you can review before the next one starts.

  1. Confirm the apps, platforms and data flows

    DeployOpen reviews which iOS, Android and React Native apps are in scope, which web properties must share the same analytics stack, and where events, session recordings and crash-related data would flow today. Your engineering and privacy leads confirm the list of SDKs already in each app and any third-party tools they call. The output is a scope note that names each app, platform version range, data flow and owner, and it closes once your team signs off on it.

  2. Agree the fixed scope in writing

    Most engagements are fixed-scope, so DeployOpen drafts deliverables, responsibilities, exclusions and acceptance criteria before any build work begins. The scope covers which platform and edition are being deployed, which mobile SDKs and native replay features are included, the masking rules that apply, and what the client's team will provide. A quote follows from this written scope. The step closes when both parties sign the scope document.

  3. Design the hosting and data boundary

    DeployOpen designs the hosting layer inside your cloud account, data center or air-gapped network, including network paths from devices to the ingestion endpoint, storage location, backup approach and access paths for administrators. The design records where each data class lives, which accounts can reach it and how it is isolated from other environments. The output is an architecture document and a data flow diagram that your security and compliance reviewers can check against your own policies.

  4. Configure SDKs, masking and event plans

    DeployOpen implements the mobile SDK integration for each app, sets event naming and property standards, and configures capture-time controls for native replay so that sensitive screens and inputs are masked or excluded before data leaves the device. Event buffering for offline use is tested on real device conditions. The output is a tested build for each app, a documented event dictionary and a masking configuration that the product team has reviewed.

  5. Test masking, security and the app store disclosures

    DeployOpen runs security testing against the mobile apps and the APIs that receive analytics traffic, checks that masking holds across screens and after front-end releases, and reviews the data each SDK sends so that disclosure statements for the App Store and Google Play match actual behavior. Your privacy lead compares the findings with the disclosure forms. The step closes with a test report, a list of remediated findings and a sign-off on the disclosure wording.

  6. Harden, back up and document the stack

    DeployOpen applies the hardening baseline agreed in the scope, configures backups and restore procedures, sets retention and access roles, and writes runbooks for installation, upgrades, incident response and SDK changes. Documentation is written so that your internal team and any compliance assessor can follow the controls and evidence trail. The step closes with a restore test on the backup and a documentation handover package.

  7. Hand over and set the support model

    DeployOpen trains the owners on the runbooks, walks through the dashboards and replay review process, and agrees how post-go-live work is handled. Ongoing support, upgrades and continuous testing are available as retainers, which you can compare with keeping the work in-house. The handover closes when your team confirms the runbooks and the support terms are in place and the open items are assigned to named owners.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.