Skip to main content
Mobile Applications Β· FinTech

Digital Wallet with QR Pay and Cards

A digital wallet app for peer-to-peer transfers, QR payments at shops, bill payments and virtual cards, running on a double-entry ledger built with Node.js and Postgres.

Digital Wallet with QR Pay and Cards cover

Project overview

We built a digital wallet for a payments company holding the relevant e-money permissions. Customers top up from a bank account or card, send money to contacts, pay at shops by scanning a QR code, pay utility bills and use a virtual card for online purchases.

Our team delivered the React Native wallet and merchant apps, a Node.js payments platform with a Postgres ledger, and an operations console for support, risk and finance teams. The project sits within our fintech app development practice.

The client and the challenge

The client's first version tracked balances as a single number per user, which made reconciliation with bank and card partners slow and occasionally produced balances that could not be explained. Customer complaints about missing money took days to investigate because each partner's records had to be checked by hand.

The new wallet had to handle many small payments reliably, never lose or duplicate money when networks failed, meet know-your-customer and anti-money-laundering obligations, and give support staff enough history to resolve a complaint quickly.

Solution architecture & delivery

At the core is a double-entry ledger in Postgres. Every movement β€” top-up, transfer, merchant payment, fee, refund β€” is recorded as balanced debit and credit entries inside a single database transaction, and a customer's balance is derived from those entries. Each request carries an idempotency key, so a retried payment on a flaky connection is recognised and not posted twice. We applied practices from our article on data isolation in PostgreSQL to keep ledger access tightly scoped.

The Node.js platform wraps the ledger with services for onboarding and KYC, transfers, QR payments, bill pay and card issuing. External partners β€” the bank for top-ups, the bill aggregator and the card issuer β€” are called through adapters, and their callbacks are matched to pending ledger entries. A daily job reconciles partner settlement files against the ledger and flags any difference to finance.

The React Native wallet app supports biometric login, device binding and a transaction PIN. Merchants display a static or dynamic QR code from their app; scanning a dynamic code pre-fills the amount. Virtual card numbers are shown only after re-authentication and are rendered from the issuer's secure view rather than stored in our system. Payment requests between friends and split bills create pending requests that the payer approves with their PIN, so money never moves without an explicit confirmation.

Transaction limits scale with the customer's verification tier, and rules in the risk engine hold unusual transfers for review. The operations console gives support, risk and finance staff role-based views of customers, ledger entries, disputes and alerts, with every action logged.

Key features we built

  • Wallet top-up from bank accounts and cards
  • Peer-to-peer transfers to contacts, phone numbers and payment IDs
  • QR code payments at merchants with static and dynamic codes
  • Utility and mobile bill payments with saved billers
  • Virtual cards with freeze, limits and secure number reveal
  • Tiered KYC with limits linked to verification level
  • Biometric login, device binding and transaction PIN
  • Operations console for support, disputes, risk review and reconciliation

How we delivered it

  1. Discovery. Mapping money flows, partner interfaces, regulatory obligations and every failure case β€” timeouts, reversals, partial refunds β€” before any screens were designed.
  2. Ledger first. The ledger and idempotent posting logic were built and tested before the app, with property-based tests checking that balances always reconcile.
  3. Build. Two-week sprints for partner adapters, wallet and merchant apps and the console, with releases through our CI/CD and testing pipeline.
  4. Security testing. Threat modelling, penetration testing of apps and APIs, and review of access controls with the client's compliance team.
  5. Launch and support. Closed launch with staff and selected merchants, then public release, ongoing monitoring and partner additions. Partner outages are surfaced to customers as clear pending states.

Technology choices

  • React Native β€” shared code for the wallet and merchant apps on iOS and Android, with native modules for biometrics and secure storage.
  • Node.js β€” an asynchronous platform suited to calling payment partners, handling callbacks and processing many small transactions.
  • Postgres β€” strict ACID transactions and constraints for a double-entry ledger that always balances and supports reconciliation. Row-level permissions restrict which services may read ledger data.

Outcomes

  • Every balance can be traced to individual ledger entries, replacing unexplained balance figures
  • Retries on poor connections no longer risk duplicate payments
  • Finance reconciles partner settlements with automated daily matching instead of spreadsheets
  • Customers pay contacts, merchants and bills from one app with limits that match their verification level
  • Support staff resolve disputes using a full transaction history in the console
  • Merchants accept payments by displaying a QR code without buying card terminals

FAQ

Why use a double-entry ledger for a wallet app?

It records every movement as balanced entries, so balances can always be explained and reconciled with partners. It also makes refunds, fees and reversals auditable rather than silent edits to a balance. Balances are never edited directly; corrections are always new entries with a reason.

How does the wallet prevent duplicate payments?

Each payment request carries an idempotency key. If the app retries after a timeout, the platform returns the original result instead of posting the payment again. The same key is passed to partners where they support it, so duplicates are prevented end to end.

How were compliance and customer privacy handled?

KYC tiers control limits, risk rules hold unusual activity for review, personal data is encrypted, and console access is role-based and logged. Related designs appear in our mobile banking app and our e-wallet development guide.

How much does a digital wallet app cost?

The main factors are partner integrations, KYC and risk requirements, card issuing and merchant features. Our app development cost calculator gives an indicative range to start planning.

Digital Wallet with QR Pay and Cards screens

Build your next fintech product with Next Olive

Share your requirements β€” we will propose scope, timeline and stack within one business day.