Skip to content

Fintech & Banking App Development

Fintech and banking app development for teams that need the onboarding, account linking, transfers and sign-in flows built by someone who has already taken them through a bank’s security review. I build the iOS and Android app and the Laravel API behind it, and I design both to pass the review before anyone schedules it.

Through NTT Data I worked on the Citi Mobile app, an app serving millions of banking customers, where I led the redesign of the Linking, KYC and Registration modules. I also worked on PNC Mobile Banking and Citizens Bank Mobile Banking, across account management and transaction features. That is 13+ years of mobile work in total, and the controls I use are written up in full in the mobile app security checklist for banking apps. This page covers what it looks like to have that work done on your app.

What I Build

  • Onboarding and KYC flows, including document and identity capture
  • Account linking to external banks and cards
  • Payments, transfers and payee management
  • Passkey sign-in alongside the existing login
  • Biometrics that release a Keychain or Keystore secret
  • Step-up authentication for transfers and new payees
  • Device binding with a non-exportable key per device
  • The Laravel API those flows talk to

Who It Is For

  • Fintech startups building their first app against a sponsor bank’s requirements
  • Banks and credit unions adding or rebuilding a module in an existing app
  • Product teams whose app has a security review or pen test on the calendar
  • Teams moving sign-in from passwords and SMS codes to passkeys
  • Owners of a banking app that needs an independent review before the next release

The Flows a Banking App Lives or Dies On

Most of the risk in a banking app sits in four or five flows. They are also the flows where a user decides whether to trust the app, so the security work and the product work have to land in the same screens.

  • Registration and KYC: identity and document capture, the hand-off to your verification vendor’s SDK, and every state in between: pending review, more documents needed, rejected, approved. Personal data collected here stays out of logs, analytics and the app-switcher snapshot.
  • Account linking: connecting an external account through an aggregator or the bank’s own API, with the user told plainly what is shared. Credentials for the other institution never touch your servers or the device’s storage.
  • Payments and transfers: amount entry, payee selection, review and confirmation, with each submission carrying an idempotency key so a retry on a bad connection cannot send the money twice. New payees and transfers above a threshold trigger step-up.
  • Sign-in and session: passkeys where the platform supports them, biometrics for return visits, short-lived tokens, auto-lock after a few minutes of inactivity, and a list of active devices the user can sign out from.

Passkeys

Passkeys remove the password from sign-in, so there is nothing to phish, reuse or stuff. On iOS I use ASAuthorizationPlatformPublicKeyCredentialProvider with an associated domain; on Android, the Credential Manager API. I add them next to the existing login first, offering passkey creation after a successful sign-in, and make account recovery as strong as sign-in, because a weak reset flow undoes the passkey.

Biometrics That Release a Secret

Face ID and fingerprint checks never return a yes or no that the app acts on. They gate a Keychain item protected by SecAccessControl with .biometryCurrentSet, or a Keystore key used through BiometricPrompt with a CryptoObject. A hooked callback then gets nothing, and enrolling a new face or fingerprint invalidates the item.

Step-Up for Money Movement

A fresh session is not enough to move money. Transfers above a threshold, new payees and password changes ask for a second factor or a fresh biometric, and the server enforces that requirement, so a client that skips the screen still gets refused. I prefer push approval or TOTP over SMS codes, which SIM-swap fraud defeats cheaply.

Device Binding

At enrolment the app generates a non-exportable key in the Secure Enclave or Android Keystore and registers its public half with the server. Sensitive requests are signed with it, with a timestamp and nonce, so a token copied off the device cannot be replayed from anywhere else. App Attest and Play Integrity add a server-verified signal that the request came from your unmodified app.

How Security Is Handled

I map the work to the OWASP MASVS control groups (STORAGE, CRYPTO, AUTH, NETWORK, PLATFORM, CODE, RESILIENCE and PRIVACY), because that is the standard bank security reviewers and pen testers already use. Agreeing the MAS testing profile at the start means the review measures the app against a target both sides wrote down.

  • Storage: refresh tokens and keys in the Keychain with a ThisDeviceOnly accessibility class or behind an Android Keystore key; access tokens in memory only; nothing sensitive in UserDefaults, SharedPreferences, caches or backups.
  • Network: TLS everywhere with no App Transport Security exceptions, and certificate pinning on the public key with a backup pin and a rotation plan, so a routine certificate renewal does not become an outage.
  • Authorization on the server: every decision about who can see an account or move money is made by the API. Jailbreak and root detection add friction and send a risk signal to the server; they never stand in for that check.
  • Kill switches: remote feature flags, a server-controlled minimum build, and session revocation for one user or all of them, tested before launch.

The client side, control by control, is in the mobile banking security checklist. The server half, mapped to the OWASP API Top 10, is in the Laravel API security checklist, and the token model choice is in Laravel Sanctum vs Passport for mobile apps. Sign-in itself, from passkeys to step-up and recovery, has its own guide: secure authentication best practices for fintech apps.

The Backend Side

A hardened app in front of an API that trusts the client is still an open attack path, so I usually build or review both. On a Laravel backend that means per-device Sanctum tokens with short expiry and rotation, policies on every account and transaction route, rate limits on sign-in and transfer endpoints, idempotent transfer handling, and audit logs that record the event without the account number. Versioned routes keep older app builds working while a forced-update floor retires the ones that should not be running.

The per-device token handling is open source as laravel-device-tokens: one Sanctum token per device, with sign-out per device or everywhere. The rest of the API work is covered under backend API development.

How an Engagement Runs

  1. Scope and threat model: which flows are in the first release, which vendors they depend on, which MASVS groups and testing profile apply, and who runs the security review.
  2. Flow design with the server decisions marked: every screen that moves money or changes identity gets the server check written next to it, so the API and the app are built to the same contract.
  3. Build in phases: storage, network and session controls go in with the first flow, rather than being added before the review. Each phase ships to TestFlight and an internal Play track.
  4. Internal review against MASTG: static checks on the release build and dynamic checks on a test device, recorded per control, before the bank’s review or an external pen test.
  5. Release and handover: kill switches tested, the incident runbook written, and either a clean handover to your team or a standing arrangement to keep releasing.

Work is billed at my contract rate of $120–$180/hr, or quoted as a fixed amount per phase once the scope is agreed. As a rough guide, a focused MVP takes four to eight weeks of build; the timelines of the sponsor bank, the KYC vendor and the review itself sit on top of that, and are usually outside either of our control.

Audits of Existing Banking Apps

If the app is already in the store, I usually start with a mobile architecture audit. For a banking app the security pass runs the checklist above against your release build: what ends up in the Keychain, Keystore, files, logs and the app-switcher snapshot, how pinning and token refresh behave, whether biometrics gate a secret or a boolean, and what a jailbroken device can reach. You get findings by severity and a prioritised fix plan your own team can work from, whether or not I do the fixes.

Frequently Asked Questions

Have you built banking apps that went through a bank's security review?

Yes. Through NTT Data I worked on the Citi Mobile app, where I led the redesign of the Linking, KYC and Registration modules. I also worked on PNC Mobile Banking and Citizens Bank Mobile Banking, across account management and transaction features. Those reviews ask how credentials and tokens are stored, how the app behaves on a jailbroken device, what gets logged, how certificates are validated, and how a bad release gets pulled, so I build with those questions answered from the first commit.

Do you build to PCI DSS or SOC 2?

I do not hold or issue PCI DSS, SOC 2 or any other certification, and a mobile developer cannot make your company compliant. What I do is build the app and API controls those programmes look for, mapped to the OWASP MASVS control groups, and record the result per control so your compliance team and your assessor have evidence in a shape they can use. The certification itself stays with your organisation and a qualified assessor.

Can you add passkeys to an existing banking app?

Yes. On iOS 16 and later passkeys use ASAuthorizationPlatformPublicKeyCredentialProvider with an associated domain, and on Android 9 and later the Credential Manager API; both talk to the same WebAuthn endpoints on your server. I roll them out alongside the existing login: offer passkey creation after a successful sign-in, keep step-up checks for transfers and new payees, and make account recovery at least as strong as sign-in.

Can you audit a banking app we already have in the store?

Yes. A mobile architecture audit covers architecture, crash and performance profiling, and a security pass that follows the mobile banking security checklist on this site, and ends with a prioritised fix plan any team can work from. A standard app takes one to two weeks; a large enterprise codebase takes three to four.

How is a fintech app engagement priced?

By scope, in phases. Contract work runs $120–$180/hr depending on scope and duration, and once the flows, the integrations and the security profile are agreed, a phase can be quoted as a fixed amount. For an app already in the store, an audit is usually the first phase because it fixes the scope.

Do you work with fintech teams outside Dallas?

Yes. I am based in the Dallas-Fort Worth area and work remotely across all US time zones, with onsite time in DFW for teams that want it. Most banking and fintech work runs remotely against the client's own repositories, CI and test environments.

Need a banking app built to pass its security review?

Related Services & Insights