AI Virtual Makeup Try-On Implementation in a Mobile App

A shopper hesitates to buy when the shade on screen does not match reality. We develop virtual makeup try-on as a turnkey solution: we accurately render the shade in any lighting and speed up camera performance in the app. The seller gets fewer returns, and the shopper gains confidence in the shade before placing an order.

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

Why virtual makeup try-on lies about color and lags

The shade of lipstick on screen and on lips are two different values. The camera captures the face with its own white balance, the screen shows the image in its own color space, and between them are compression and brightness mapping into the display range.

If virtual makeup try-on simply lays a semi-transparent color layer over the face, a warm beige tone on cool skin turns muddy, and a saturated red turns brick.

The second reason is geometry. Lip and eyelid contours found from a single frame slip when the head turns, tilts, and smiles, and without temporal smoothing the mask jitters between frames.

Cosmetic try-on in an app should work not with a still image but with a stream: stable facial keypoints, contour retention from frame to frame, and color blending in a space close to human perception.

The third reason is the cost per frame. Neural network makeup try-on computes the mask and overlay on every frame of the video stream: on a mid-range device the interface stutters, on a weak one the image turns into a slideshow.

What saves you here is not one "universal" model but quality levels — lightweight weights on weak devices, the full model on strong ones, with smooth transition between modes.

A separate layer of work is calibration for real conditions: daylight from a window, warm lamps, shadow from one's own hand. It is at this stage that inaccurate shade reproduction stops being a "phone quirk."

We break down how each of these failures is addressed — from color calibration to performance budgets.

Effect of correct try-on: accuracy, speed, load

What changes with correct implementation: response keeps up with head movement, the shade matches the real product, and the app behaves the same on both new and previous device models.

Shade matching accuracy

The try-on shade matches the real product, not an averaged pixel color. We calculate in perceptual color coordinates and compensate for lighting and camera white balance, so cool, warm, and olive undertones do not "collapse" into one.

In complex cases we check against the official shade scale of the line and reference values such as Pantone, rather than by eye.

Try-on response time

Real-time try-on: makeup is redrawn before the next frame reaches the screen, so when the head turns, the layer does not catch up with the face with a delay.

Keypoints are tracked with position prediction and smoothing — the lip and eyelid contour does not jitter or "float."

Device load

Rendering and face analysis run on the phone itself: frames are not sent to a server, so battery consumption and heating stay within the limits of regular camera shooting.

Lightweight models also run on devices from previous years, and when resources are insufficient, quality degrades gradually instead of crashing.

Fewer "face not recognized" failures

We cover scenarios that break try-on: glasses, bangs, low light, dark skin, strong head tilt. Instead of an error, there is a prompt "turn toward the light," and the confidence threshold is tuned using accumulated data. The share of successful try-on sessions grows, and repetitive support requests go down.

Implementation approaches for try-on: what to compute and where

Virtual makeup try-on splits into two independent stages: face annotation (keypoints, lip and eyelid contours, skin tone) and synthesis of the final image.

Where each of them is computed is precisely the choice between on-device rendering, server-side rendering, and a combination of the two.

If you compute everything on the phone, you get instant response and offline operation; if you move synthesis to the server, you get quality limited only by the channel.

A separate fork is whether to deliver try-on with your own code or integrate a ready-made try-on module. Below is how these options behave on live projects.

Option When it fits Limitations
On-device rendering Offline scenarios, delay-free stream, weak channel Diverse device fleet: on low-end devices texture quality has to be simplified
Server-side rendering Maximum synthesis quality, complex looks and transitions Response delay and load that grows with the number of active users
Embedded try-on module Need a fast launch without an in-house graphics team Constraints of someone else's interface, updates on someone else's schedule, vendor lock-in
Hybrid processing scheme Need a compromise: response on the client, quality from the server More complex contour: synchronization of model versions and channel control

In practice, pure schemes are rare: a hybrid with client-side annotation and server-side rendering covers most scenarios, and on weak devices a simplified on-device rendering path is enabled. We lock in the choice after measurements on the target device fleet, not based on a spec sheet.

Stages of work: from camera audit to build handover

We define the stages of virtual makeup try-on implementation before the start: the order determines the scope of each step and the moment when the client sees a working result.

First we figure out how the app receives the image from the camera, then design the module, implement it, and test it on a real device fleet. From project to project, the depth of elaboration changes, not the sequence itself.

  1. Camera and light audit. We look at how the app captures a frame, how stable shooting parameters are, and how the image behaves in low and mixed lighting. The results show whether separate skin tone calibration is needed for specific devices.
  2. Try-on use cases. We analyze where the user comes to try-on from — a product page, a lookbook, or a repeat visit. This determines how many shades to show at once and what response delay we consider acceptable.
  3. Module scheme. We determine what is computed on the device and what on the service side, how user images are transmitted and when they are deleted, and where shade palettes are stored.
  4. Implementation. We build the overlay and shade matching, work out behavior for partial occlusion of lips and eyes, and add scenarios without try-on — so that camera failure does not break the main path.
  5. Device testing. We run try-on on a fleet of models of different tiers, under different lighting and angles, and check heating and battery consumption.
  6. Handover and support. We deliver the build together with module documentation, monitor metrics after release, and refine palettes based on feedback.

Handover package: schemes, regulations, documentation

We hand over not only a working app but also everything needed for independent support. The package is assembled throughout the project, not in the last week, so by the final stage every artifact has already been tested on real changes and refinements.

  • Try-on module documentation: architecture, component composition, extension points, and limitations by product categories — a new developer can enter the code without the author.
  • Integration schemes: exchange with the shade matching service, catalog, and analytics — flow directions, formats, and behavior when an external service is unavailable.
  • Data flow schemes: the path of a frame from camera to result — what stays on the device, what goes to the server, and in what form.
  • Access rules and roles: who changes the catalog, adds shades, and views statistics, and what permissions are required.
  • Palette update regulations: how to add a line or an individual shade, where the source data is stored, what checks to pass, and within what timeframe a change reaches users without releasing a new version.
  • Source code handover: repositories with history, local build and release, environment descriptions, and update deployment procedure.
  • Support instructions: typical requests, diagnostic procedure, rollback points, and release changelog.

Acceptance is based on a checklist: we confirm each item with a demonstration on a live staging environment, not with the presence of a file.

If after handover part of the package becomes outdated due to your refinements, we update it as part of support — the support team is not left without up-to-date documentation.

Cosmetics store case: metrics before and after implementation

The Amber Glow cosmetics store chain came with a task: in the app, makeup try-on worked only with a static image. The user uploaded a photo, waited for processing, and often got a distorted shade — eyeshadows shifted to a different tone, skin tone "floated" in shadows.

We started the makeup try-on case not with the model but with measurements: where exactly users drop off.

Before: a third of attempts broke at recognition

Metrics before implementation: about a third of try-on sessions broke at the face recognition stage, and the add-to-cart rate after try-on was lower than after a regular product page view.

Users left the product page without waiting for the result: image processing took noticeable time. Reducing the failure rate became the main goal — without it, the other improvements made no sense.

After: real-time response

We rebuilt the flow: the shade is matched directly in the camera stream, without uploading an image and waiting.

The palette is applied taking into account lighting and skin tone, and when recognition confidence is low, the app asks the user to adjust the frame instead of showing a random tone.

The before and after metrics diverged noticeably: the share of successful recognitions grew, failures at this step fell by more than three times, repeat try-on openings — 2.5 times per active user, returns due to an unsuitable shade — by about half.

What to do if the app already has a camera and filters

Enhancing a released app does not require rewriting the existing camera and filter code. The virtual makeup try-on module slots in as a separate link in the frame pipeline: it receives the same buffer as the current effects but is applied last, on top of the finished image. The user keeps familiar shooting scenarios, and try-on is enabled as a separate mode.

The main difficulty is the conflict between processing modules. Two frame handlers begin competing for the same buffer and for time to process it: double color correction appears, lip and eyelid contours jitter, and frame rate drops on mid-range devices.

We separate processing into a single pipeline and fix the order: first face geometry, then product tone and texture, and only then the app's general filters.

The second source of problems is backward compatibility. Some devices cannot handle the try-on model, so we build in gradual degradation: if resources are insufficient, the mode turns off, and the camera and filters work as before.

We maintain the support branch separately so that try-on edits do not affect the release shooting logic.

We release in stages. First we enable the module for internal testing, then open it to a small share of the audience and monitor the share of successful try-on sessions, app crashes, and tap response time.

If metrics go negative, the feature is turned off with the same switch, without a new build — for other users, the app continues to work as before.

Technical concerns: color accuracy, lighting, load

Try-on accuracy is not only the makeup model but also frame processing: white balance, exposure, skin tone. Below are the concerns we most often resolve before work starts.

How accurately is the shade reproduced under different lighting?

We calibrate the render using reference images under warm, neutral, and cool light and across several skin types — from light to deep.

The tone is applied to the face map with a correction for frame illumination, so lipstick does not fade by the window or turn reddish under lamps. The discrepancy remains noticeable only when compared side by side with the real product.

Does try-on work offline?

Shades and the face model are stored in a local cache, and computation runs on the device. Without the internet, try-on opens, shade switching and image saving work — only new assortment items and favorites synchronization are unavailable.

What about old and weak devices?

For them, a lightweight mode is enabled: frame processing resolution and preview refresh rate are reduced, and some effects are simplified. Try-on remains smooth, while the image is less detailed. We determine the switching threshold through measurements on real devices, not by model numbers.

How is the shade palette updated?

The assortment is described by data and comes from the server rather than being hardcoded into the build. New shades and limited collections appear for the user without releasing a new version — the update is picked up on the next launch.

Let's discuss the task: we'll review the app and come back with a plan

To discuss the task concretely and come back with an estimate and work plan rather than general wording, we need a minimum of inputs.

We start the review of the current app with what already exists: access to the build or a test environment, a description of user scenarios, a list of target devices, and the shade assortment.

If there is no build yet, we work from the description — that is enough to understand the scope and risks.

What we need from you to start the project:

  • access to the current build or test environment — and if the product is only being designed, a scenario description: where the user selects a product, where they launch try-on, what they do afterward;
  • a list of target devices and system versions on which try-on should work identically — the frame processing method depends on this;
  • the shade assortment with application rules: how the tone applies to different skin types and what is considered a correct result;
  • a set of reference frames and models on which you are ready to accept the quality of the match;
  • priority platforms and timeline constraints, if the launch is tied to a season or release;
  • a contact person on the product side who will resolve questions about scenarios and shades during the work.

With this set, we conduct a review of the current app, note what can be reused without rewriting, and come back with an estimate and staged work plan. Describe the task — we'll discuss what already exists and agree on the project start.