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_currencyandsource_amount= the credited amount (in minor units)provider = "infinia"provider_movement_id= Infinia's movement idcompleted_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
| Case | What happens |
|---|---|
| User sends from a bank account not in their name | Infinia may hold or reject the credit. Handled via Infinia support in MVP. |
| User sends less than any Infinia minimum | Depends 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 expected | Fully credited. No cap on deposits at MVP. |
| Movement webhook missed / duplicated | Idempotent — (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.