One company, two online financing brands: each has its own website and its own customer portal, where customers complete their entire journey. We support and enhance the websites and portals of both brands, and we rewrote one brand's existing iOS and Android apps in Flutter and maintain them on the App Store and Google Play. The company is a licensed financial institution supervised by the National Bank of Ukraine (NBU). We don't disclose its name: the project is under NDA.
The client: a financial company in a regulated market
The company is listed in the NBU register as a non-bank financial institution and operates under the regulator's licence. Under two brands it offers online financing to individuals, and the entire customer journey is remote: from the application to the final payment, nobody has to visit an office or sign a paper document. The project also covers one brand's iOS and Android apps. Customers already use them, so every release reaches real users straight away.
The requirements for a product like this come from several directions at once. The NBU sets what a website must disclose and how a customer is identified without meeting in person, the law sets how a contract is concluded and amended, and the App Store and Google Play set what a financial app is allowed to do. Each of these requirements ends up as a specific screen, field or step in the customer journey.
Two brands, two separate systems
The two brands run as two separate systems that don't depend on each other: each has its own website and its own customer portal. All they share is the licence, the regulator and the legal requirements. Here is what ANIART is responsible for in these systems:
| Layer | What's inside | ANIART's role |
|---|---|---|
| Public websites (one per brand) | Each with its own voice and audience, and the same mandatory sections required by the NBU | Support and enhancements |
| Customer portals (a separate one for each brand) | The entire customer journey: sign-in, application, identification, signing, payout, repayment, changes to terms, cards, contract history | Support and enhancements |
| One brand's mobile apps (iOS and Android) | A native shell around that brand's portal: JS bridge, push notifications, deep links | Rewritten in Flutter; we maintain them on the App Store and Google Play |
The customer journey: from sign-in to the final payment
Below is the customer journey in the portal of the brand whose apps we rewrote. The other brand's portal is a separate system that meets the same legal and regulatory requirements.
- Sign-in. A phone number and a one-time code sent by SMS or via a messenger, instead of a password.
- Application. An online application form. Only one contract can be open at a time.
- Identification. Several remote options to choose from, including BankID NBU, Diia and video verification; some of them are supplemented by a selfie with a liveness check. How deep the check goes depends on the amount: below a threshold, basic online identification is enough; above it, an extended check is required.
- Terms and signing. The customer chooses the terms and can apply a loyalty program promo code. Then come two steps, each with its own one-time code: first the pre-contract information document, then the contract itself.
- Payout. Only to the customer's own card or IBAN. Saved cards are shown masked, and the card can be changed through a request signed with a one-time code.
- Repayment and changes. Payment in the portal, or without signing in by entering the contract details, with reCAPTCHA protection; the server chooses the payment provider. Early repayment, additional funds within the customer's approved limit and restructuring are also available online, the latter with a new payment schedule and a supplementary agreement signed with a code.
The regulator and the law: what stands behind the websites and portals
| Requirement | What it means for the websites and portals |
|---|---|
| Disclose the essential characteristics of the services on the website, along with warnings, calculation examples, a link to the NBU register and the complaints procedure | Both brands' websites carry an information disclosure section in line with NBU requirements; the cost calculator shows the real annual percentage rate (APR) |
| No unilateral changes to contract terms | Additional funds, restructuring and any other change go only through an offer the customer signs in the portal: a document and a signature, not a switch in the admin panel |
| Accessibility for people with disabilities (NBU requirements) | The websites have an accessibility mode: higher contrast, light and dark themes, a larger font size |
What we did: we rewrote the apps in Flutter
One of the brands already had iOS and Android apps. We rewrote both in Flutter and maintain them: we build and publish them, take them through App Store and Google Play review, and fix and update them.
Rewriting an app people already use is harder than launching a new one: users have active contracts, payment schedules, saved cards and history in it. The architecture helps here. The brand's portal is a web application built on Laravel and Vue 3, and the new app is a native shell around it: the financial rules and data stay in the brand's portal, and the app only takes care of what needs native code.
One codebase, two platforms
The iOS and Android versions are built from a single Flutter codebase, so most fixes and new features are done once for both platforms.
A bridge to the portal
The app runs the same portal as the browser. Through a JS bridge, the portal knows where a session came from: the app or the web.
Back from Diia
After confirming in Diia, the customer returns to the app and carries on with the application instead of getting lost between apps.
Push notifications
Native notifications via Firebase Cloud Messaging, a separate channel alongside web push on the brand's website.
Deep links
Universal Links and App Links: a link from the brand's website or a message opens the right screen in the app.
Modern platforms
The new versions are built for current iOS and Android; the minimum supported Android version has been raised.
Two speeds of change
When we change how customers apply, sign or repay, we do it in the portal, and the change reaches app users without a new store release. We change the native layer (notifications, deep links, the return from Diia) in the single Flutter codebase for iOS and Android, and handle the platform-specific parts and publishing separately for each platform.
Releasing a financial app is a discipline of its own
The App Store and Google Play review financial apps more strictly than ordinary ones: Google Play has a dedicated Financial Services policy, and Apple has specific App Review rules. So every release faces close scrutiny, and that review is far from a formality. We take each release from the build all the way to publication in both stores.
Support and enhancements
Beyond the apps, we work continuously on the websites and portals of both brands:
- enhancements: new user flows, sections and fixes in both systems;
- external services: BankID NBU and Diia, omnichannel chat and messengers, web push, Google Tag Manager and GA4, data exchange with accounting (ERP) systems. We make sure these connections keep working after every change;
- security: reCAPTCHA on sign-in, registration and payment without signing in, device fingerprinting, one-time codes at every signing step, Cloudflare in front of the public websites. We build enhancements so that no new feature opens a way around these layers.
The result
One brand's apps have been rewritten in Flutter: one codebase for iOS and Android, their own native layer (notifications, deep links, the return from Diia) and the same portal as in the browser. One ANIART team looks after both independent systems (each brand's website and customer portal) as well as one brand's apps, from a brand's web page all the way to a release on the App Store and Google Play.
Developing a financial product in a regulated environment, running several brands, or planning to rewrite a live app in Flutter? See how we work on fintech projects and mobile apps, or get in touch.