From swipe to savings, in 480ms.
A walkthrough of how Runda connects to your bank, evaluates round-up rules, and allocates spare change into vaults — without ever holding your money.
1. Card swipe
User makes a €4.60 purchase.
2. Bank webhook
Open Banking pushes the transaction.
3. Rules engine
Resolves €0.40 round-up + boosters.
4. Vault allocator
Routes change to active vaults.
5. Ledger
Double-entry record + audit log.
6. Notify
Push + in-app notification.
7. Reconciliation
Nightly settle with partner bank.
8. Insights
Surface progress to the user.
rule "weekend-booster" {
when transaction.day in ["Sat", "Sun"]
then roundup = baseRoundUp * 2
}
rule "coffee-penalty" {
when transaction.category == "Coffee"
then roundup += 1.00
}
rule "cap-daily" {
when sumToday(roundups) >= 5.00
then halt
}Rules evaluate in priority order. The engine is deterministic, sandboxed, and emits an explanation per decision.
User
- · id
- · country
- · status
Transaction
- · id
- · amount
- · merchant
- · ts
RoundUp
- · id
- · txId
- · amount
- · ruleId
Vault
- · id
- · name
- · target
- · saved
Rule
- · id
- · trigger
- · multiplier
Partner
- · id
- · type
- · country
┌─────────────────────┐
│ Transaction inbound │
└──────────┬──────────┘
▼
┌─────────────────────┐
│ Is user active? │── no ──▶ drop + log
└──────────┬──────────┘
│ yes
▼
┌─────────────────────┐
│ Apply base round │
└──────────┬──────────┘
▼
┌─────────────────────┐
│ Evaluate user rules│◀──── rule chain
└──────────┬──────────┘
▼
┌─────────────────────┐
│ Within daily cap? │── no ──▶ truncate
└──────────┬──────────┘
│ yes
▼
┌─────────────────────┐
│ Allocate to vaults │── proportional split
└──────────┬──────────┘
▼
┌─────────────────────┐
│ Notify + ledger │
└─────────────────────┘Open Banking
Tink + Nordigen
Region
EU-North primary
Encryption
AES-256 at rest
Compliance
PSD2 · GDPR
Ledger
Double-entry
SLOs
99.95% availability
Latency
p99 < 500ms
Audit
Immutable log