Wallet for end users
What you'll build
A system where each of your end users has their own balance, their own CLABE to receive money, and a clean movements history. The building block for neobanks, marketplaces that hold seller balances, gig-worker apps, and anything where "user balance" is a first-class concept.
When to use it
- Neobanks and fintech apps.
- B2B platforms holding client funds.
- Marketplaces or gig platforms where sellers accumulate earnings before cashing out.
Three patterns — pick one
You have three ways to model "user wallet" on top of Fintoc, from cheapest to richest. Start with the simplest that fits.
Pattern A — One Account Number per user (virtual CLABEs)
- Structure: one Fintoc Account (yours) with many Account Numbers, one per user.
- Per-user balance: you track it in your own database. Fintoc holds the aggregate.
- KYB: none per user — only your Root Entity is onboarded.
flowchart LR
S1[Sender for user 1] -->|SPEI| C1[CLABE 1]
S2[Sender for user 2] -->|SPEI| C2[CLABE 2]
C1 --> A[Your Account<br/>single total balance]
C2 --> A
A -.webhook.-> DB[(Your DB<br/>balance_user1 += amount)]
Set up:
- Use your Root Account.
- Create one Account Number per user with
metadata.user_id. - On
transfer.inbound.succeeded, credit the user's balance in your DB. - For withdrawals, create an outbound Transfer from your Root Account and debit the user's balance in your DB.
Good for: lightweight wallets, earnings, simple deposit/withdraw.
Pattern B — One Account per user under your Entity (sub-accounts)
- Structure: many Accounts, all under your Entity. Each has its own balance and its own root CLABE.
- Per-user balance: Fintoc tracks it at the Account level. Visible in Dashboard and statements.
- KYB: none per user.
flowchart LR
S1[Sender for user 1] -->|SPEI| A1[Account: user 1<br/>own CLABE + balance]
S2[Sender for user 2] -->|SPEI| A2[Account: user 2<br/>own CLABE + balance]
A1 -.webhook.-> You[(Your backend)]
A2 -.webhook.-> You
Set up:
POST /v2/accountswith your Entity's ID. Account is created instantly with a root CLABE.- On
transfer.inbound.succeeded, usedata.account_idto identify the user. - Withdrawals use that
account_idas the source of funds.
Good for: wallets where you want Fintoc to ledger balances per user. Works in both MX and CL.
Pattern C — One Account per user under their own Entity
- Structure: many Entities (one per client), each with its own Account and root CLABE.
- Per-user balance: Fintoc tracks at the Account level.
- KYB: required per Entity (≈1 business day per client).
flowchart LR
S1[Customer of A] -->|SPEI| A1[Account A<br/>Client A Entity]
S2[Customer of B] -->|SPEI| A2[Account B<br/>Client B Entity]
A1 -->|Withdrawal<br/>CEP: Client A name| O1[Client A bank]
A2 -->|Withdrawal<br/>CEP: Client B name| O2[Client B bank]
Set up:
- Create an Entity in the Dashboard for the client.
- Fintoc runs KYB; you get notified when it's approved.
- Once approved, create an Account under that Entity. Outbound transfers from that Account show the client's legal name on the CEP.
Good for: flows where receipts must show the client's name (e.g., a food delivery platform paying each restaurant under that restaurant's RFC).
Choosing between them
| Pattern A | Pattern B | Pattern C | |
|---|---|---|---|
| Per-user balance ledgered by Fintoc | ❌ (you do it) | ✅ | ✅ |
| Unique CLABE per user | ✅ | ✅ | ✅ |
| KYB per user | ❌ | ❌ | ✅ |
| Receipts show user's name | ❌ | ❌ | ✅ |
Updated 20 days ago
What’s Next