Skip to main content

Deposit (GBP / EUR)

The user sends money from their own UK/EU bank to the Infinia virtual account provisioned at KYC completion. Funds arrive directly as their balance — no conversion, no on-chain step, no waiting for a mint.

Sequence

Total time: as fast as the FPS credit arrives at Infinia — typically seconds, occasionally minutes if the user's bank is slow. No provider-side conversion adds latency because the user's balance is held in the same currency they sent.

Screens

  • apps/mobile/app/(tabs)/home.tsx — balance header + "Add money" CTA.
  • apps/mobile/app/deposit/instructions.tsx — displays sort code / IBAN, copy buttons, one-tap "share as message" for sending to yourself.

What we're storing

Deposits arrive as completed transactions — there's no pending state to advance because Infinia only fires movement.created after funds have landed. The transaction row records:

  • type = "deposit"
  • status = "completed"
  • source_currency and source_amount = the credited amount (in minor units)
  • provider = "infinia"
  • provider_movement_id = Infinia's movement id
  • completed_at = now

Balance is computed on read from the ledger, so there's nothing else to update.

Fees & timing

  • Infinia deposit fee: TBC (part of the open Infinia fee schedule question). Any deducted fee shows up as the difference between what the user sent from their bank and what Infinia credits — we display both on the transaction detail.
  • GrinGo fee: 0% on deposits.
  • FPS timing: seconds to a few minutes.
  • SEPA timing: same-day or next-day depending on the sending bank.

Edge cases

CaseWhat happens
User sends from a bank account not in their nameInfinia may hold or reject the credit. Handled via Infinia support in MVP.
User sends less than any Infinia minimumDepends on Infinia's per-currency policy — see fee schedule follow-up.
User sends the wrong currency (e.g. USD wire to a GBP account)Rejected by the beneficiary bank / Infinia; funds return to sender. No credit on our side.
User sends more than expectedFully credited. No cap on deposits at MVP.
Movement webhook missed / duplicatedIdempotent — (provider = 'infinia', external_event_id) unique on webhook_events short-circuits duplicates. Missed webhooks are recovered by the nightly reconciliation cron that walks GET /v1/accounts/{id}/movements/.

Not supported at MVP

  • In-app-initiated deposits (e.g. Plaid / open banking to pull from the user's bank). Users manually initiate the transfer from their banking app.
  • Card deposits. Bank transfer only.
  • Cross-currency deposits (e.g. paying in EUR when your home currency is GBP). Home currency is fixed at signup — deposits must match.