Technical support for a mobile app after release

The app has shipped, but failures, crashes on new versions, and a stream of requests do not stop. We take the release pipeline under maintenance: we handle requests on duty, investigate root causes, and ship fixes according to the procedure — recovery time is reduced several times over.

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.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a mobile application for FEEDME
    Development of a mobile application for FEEDME
    971
  • Development of a mobile application for XOOMER
    Development of a mobile application for XOOMER
    869
  • Development of a mobile application for RHL
    Development of a mobile application for RHL
    1289
  • Development of a mobile application for ZIPPY
    Development of a mobile application for ZIPPY
    1143
  • Development of a mobile application for Affhome
    Development of a mobile application for Affhome
    1076
  • Development of a mobile application for the FLAVORS company
    Development of a mobile application for the FLAVORS company
    677

Technical support for a mobile app after release: what breaks

Release to the store is not the finish line, but the point from which the densest failure statistics begin.

Test environments do not reproduce the combination of OS version, manufacturer's shell, regional settings, and battery restrictions — and it is precisely this combination that accounts for most of the requests in the first weeks.

Technical support for a mobile app after release is built around analyzing these statistics, not around hoping that everything will settle down on its own.

Crashes on rare models are harmless by device share and painful in absolute numbers. Aggressive battery saving kills the background process, a non-standard memory manager unloads state, and when the user returns to the app, the screen crashes while restoring the list. In reports, this is the same error repeating for all owners of such a model.

Data desynchronization between the device and the server is the second most frequent class of failures.

The app shows a local cache, the operation goes to the server, the response does not arrive due to a drop — and the person sees the order as placed, while the server knows nothing about it.

The reverse case is worse: resubmission without an idempotency key causes a double charge, which is then handled manually.

Degradation on a weak network and when switching between networks looks like hanging requests without a timeout, session loss, and a loading screen with no way to close it.

Login and payment failures are the most expensive: the user cannot get back into the account and does not understand whether the payment went through.

Next, we break down how this is addressed: how to separate release failures from infrastructure incidents and which metrics to capture in the first hours so that fixes go out in a targeted way.

What changes when release follows a procedure

A release procedure is not order in documents, but what happens in the first minutes after publication. The build does not go to the entire audience at once: first the internal environment, then a share of users that expands while metrics remain normal. Hence the measurable consequences that are visible in monitoring, not in reports.

Time to recovery after an incident

The key difference is that the decision to halt the release is made based on the failure share threshold, not after support collects requests.

Rolling back to the previous build in a staged rollout (in Google Play Console and similar consoles) takes minutes, so downtime is measured not as "until we prepare a fix" but as "until we stop distribution." The fix itself is prepared without pressure: users are on a working version, and the incident is limited to one platform or device model.

Share of failures that do not reach the user

Failures caught by the first environment and the first 5–10% of the audience are closed before others see them: a crash on cold start, an authorization failure, an error on a specific model.

Version coverage does not fall apart — the API schema maintains backward compatibility, and builds below the threshold receive a soft update instead of errors.

As a result, the share of failures reaching end users is measured in single-digit percentages, not by sorting through complaints in app stores.

Support formats: on-call duty, task pool, dedicated team

The support format is chosen not by how loud the name sounds, but by how the request queue is organized and who is responsible for distributing work between releases. Below are three modes that are actually chosen between, and what each of them limits.

Option When it fits Limitations
On-call request duty The app is stable, releases are rare, request flow is isolated Work is triggered by failure; accumulated defects wait for a window; no planned improvements
Task pool with a queue Request flow is steady, priorities change frequently A priority procedure is needed, otherwise urgent displaces important
Dedicated team Multiple platforms, frequent releases, strict recovery time Requires a constant flow of tasks so that utilization is justified

On-call request duty

The engineer on shift monitors crash alerts, investigates the request, and either closes it or moves it to the queue with a reproduction description.

This mode provides minimal response time to a critical failure, but it does not move accumulated technical debt: it lives between shifts and waits for a separate window.

Task pool and dedicated team

A task pool is a queue with transparent priorities: defects, improvements, and store requirements are ranked by user impact, not by how loud the request is.

A dedicated team differs in that it maintains release context between iterations — its own environments, regression before rollout, and stability metrics that show the result of support.

Switching between modes is reversible: you can start with on-call duty and scale up the amount of work as the product grows.

Handover to support: stages of engineering work

Handover to support is not switching an on-call engineer in a general chat, but a sequence of steps after which the team is responsible for the app without the code authors nearby.

If it is skipped, the architecture is exposed through incidents: response time is measured in days, not minutes.

Audit and capture of the current state

  1. App audit. We collect the actual state: where the build lives, how an update is rolled out, which branches are maintained, who has access to app store consoles.
  2. Dependency map. We map external services, server methods, and third-party libraries and tie failure points to them. It becomes clear which update of a third-party component breaks the product.
  3. Setting up failure collection. We enable crash and metric collection on real builds so that monitoring reports the problem, not a user call. Separately, we verify that failures are readable and tied to a specific release.

Setting up control and handing over on-call duty

  • Access separation. We issue roles instead of shared accounts and separate the right to release from the right to read failures and view data.
  • Check on a training environment. We reproduce typical failures — a server method failure, a startup crash, a build rejected by the store — and verify that the on-call engineer can trace the path to the cause without hints.
  • Handover and training. We document the response procedure, escalation order, and owner map. For the first weeks, we are on call together with the code authors, then independently.

As a result, the client receives not a report but a working process: a clear dependency map, configured failure collection, and a team that closes incidents according to the procedure.

Procedures, diagrams, and access that remain with you

We prepare all support artifacts as a transferable package: they are stored in your repositories and internal knowledge base, not in correspondence and the contractor's heads.

If you change contractors or bring in an in-house engineer, you will not have to reconstruct the system from memory — the package describes both how it is assembled and how to respond to it.

Documentation package

  • Service and dependency map: which modules are responsible for what, what is connected to what, where external integrations are and what will fail along with them.
  • Environment diagram: build, test environment, app stores — what is deployed where and in what order.
  • Release plan: update calendar, windows for urgent fixes, approval procedure.
  • Change log: what changed and when, which task caused it, how to roll back to the previous release.
  • Instructions for standard operations: certificate reissue, key rotation, configuration changes.

Access and response rules

  • Access policies and roles: who has which rights in panels, repositories, and environments, who grants and revokes them.
  • Failure response rules: criticality levels, time within which we take work, whom we notify.
  • Escalation matrix: who makes the decision when an incident affects several services at once.

The package is alive: we update it with every change in the system, so it does not diverge from reality a month after handover.

Case: how we reduced failures and recovery time

We received the app of the store chain Полка — orders, loyalty program, payment. Failure tickets were handled based on user requests, that is, after some customers had already gone to competitors.

At the start, there was a working codebase and a complete absence of procedure: developers learned about crashes from reviews in app stores.

What it was like before handover

Failures were not divided by importance: a startup crash and broken layout of a product card ended up in the same list and waited for a free developer.

The average response time to a critical failure reached up to a day, some incidents could not be reproduced from the description and were closed without a cause — the same defect returned in the next update.

The share of successful sessions held at 91%, and after major releases it fell to 86% and took weeks to recover.

What it became after the procedure

We introduced failure classes: critical (startup crash, payment failure, order loss), degradations (slow interface response, incomplete data in the account), and cosmetic.

Each class has its own response time and on-call engineer, and failures are collected automatically with a tie to version, device model, and scenario: a defect is reproduced from data, not from the user's wording.

Result in metrics: response time to a critical failure dropped from a day to tens of minutes, recovery time after an unsuccessful release — from several hours to 40–45 minutes, the share of successful sessions grew from 91% to 99.2%.

Repeat requests for the same defect fell by three times, and updates stopped being an event with unpredictable risk.

How on-call request duty differs from a dedicated team

On-call duty and a dedicated team close different classes of tasks, and confusing them is expensive. On-call duty is a shift mode with a procedure: a request is accepted, classified by impact, escalated, and closed.

A dedicated team is the same engineers assigned to your product permanently, with accumulated context.

Response speed in both modes is set by the procedure, not by the individual.

In on-call duty, it is maintained by the shift schedule: for a critical request, the first response comes within the shift, and the on-call engineer immediately looks at monitoring and the latest releases.

A dedicated team does not respond faster — it responds more precisely, because it does not spend the beginning of the investigation restoring the picture.

Depth of investigation is the main difference. An on-call engineer stops the consequences: rolls back the release, fixes configuration, brings the service up.

A dedicated team gets to the root cause — reproduces the scenario, finds the failure condition, fixes the logic, and adds a check so that this class of failures no longer passes.

Immersion in the product determines whether tasks reach the plan or settle in the queue. An on-call engineer starts each time with logs and the data schema, while systemic complaints such as a missing notification on some devices do not fit into a shift and remain waiting. A dedicated team knows the service map and decision history, so such requests become fixes.

The working scheme is a hybrid: on-call duty for critical failures so that response time is guaranteed, plus dedicated engineers for working through the backlog. This way the task queue does not grow faster than you close it.

Frequently asked questions: access, environments, response time

Before support starts, we almost always discuss the same things: what access perimeter is needed and whether it can be granted in parts, how to divide work with the previous contractor, what measures response time, and by what rules updates go out. The answers determine who can release a fix and how quickly, when it is needed.

Below are the technical concerns we most often resolve before signing. If your case does not match any of them, describe it and we will look at it separately.

What access to environments is needed, and can it really be granted in stages?

You need a source code repository, build configuration, app signing keys, and accounts in app stores. We grant them in parts: first the test environment and build; access to publication — only for a specific release and with an action log. This way the team can evaluate and fix code without getting production release rights.

The previous contractor remains on the project — will there be conflicts?

We define areas of responsibility in writing: who owns which module, who owns the branches, and who releases versions. We close shared branches with review rules so that changes do not overwrite each other.

If the previous team leaves, we take over knowledge transfer — it follows a plan, not the last week.

How do you measure response time, rather than "we respond quickly"?

We fix request classes and the time to first response and time to fix for each. Requests come into a common queue, not personal messages — history and statistics are visible from them. We confirm deadlines with a report for the period, not a promise.

What happens with a critical defect in production?

First we stop the impact: roll back to the previous version or disable the problematic area via configuration. In parallel, we look for the cause and prepare a fix; after that, a review with the conclusion of which check was missing.

We set update rules in advance: planned publications in agreed windows, unplanned — only for critical cases.

Let's discuss the task: what to send for an estimate and plan

To discuss the task substantively and come back with an estimate and plan rather than general considerations, we need a snapshot of the product's current state. Gather what you have on hand — we can work with incomplete data and will fill gaps with questions.

  • Product and platforms — what kind of app it is, which platforms and minimum OS versions it builds for, whether there is an offline mode and sign-in via external services.
  • Current release scheme — how the build is assembled and signed, through which channels it is distributed, how long the path from code change to publication takes.
  • Recurring failures — crash statistics, the list of failures that return from release to release, their reproduction steps and manifestation conditions.
  • Team composition — who is responsible for the mobile part now, which roles are filled, which areas you want to hand over, and who approves the release.
  • Development environment and access — repositories, build environment, build storage, error tracking and analytics systems, access granting procedure.
  • Expected operating mode — whether 24/7 incident response is needed, release windows, support for old app versions.
  • Constraints — security requirements, approval procedures, prohibition of external services.

With this set, we come back with an estimate and plan: scope of work, team composition for the task, failure response mode, and the points where we integrate into the current release scheme.

Describe how everything is set up now — then we will discuss the task and agree on the format of work.