EnvioPlata
US-to-Latin America Money Transfers
A cross-border transfer experience designed to make destination routes, quote details, recipient information, fees, and transfer status easier to understand.
Proof boundary: This record documents the transfer flow and integration architecture. Live route availability, pricing, quote freshness, transaction volume, and production status have not been independently audited.
How It Works
Enter Amount
Current quote details with a separate fee breakdown
Add Recipient
Country-specific bank fields with validation
Confirm Payment
Device wallet or card through the configured payment processor
Track Transfer
The transfer instruction moves to the configured payout rail
Configured Destination Records
The product record includes destination-specific bank fields handled dynamically by the validation layer. This is implementation scope, not a claim of current live availability.
Technical Architecture
Transfer Experience
Amount, destination, recipient, payment confirmation, and status views.
Transfer Orchestrator
Routes, validation, payment events, quote contracts, and transfer state.
Payment and Transfer APIs
Configured interfaces for payment confirmation, quotes, recipients, and payouts.
Payment Orchestration
- Device wallet support
- Hosted card collection
- Webhook-driven flow
- Transfer metadata
Transfer Orchestration
- Quote retrieval
- Recipient creation
- Transfer execution
- Status tracking
Illustrative Fee Presentation
The values below demonstrate the review hierarchy only. They are not a live quote or current pricing commitment.
Example Transfer Review
Why This Presentation?
Technical Stack
- Swift 5.9
- SwiftUI
- Device Wallet
- Form Validation
- Node.js
- Express
- Zod Validation
- Webhooks
- Payment Processor
- Hosted Card Form
- Payment Intent
- Webhook Events
- Transfer Rail
- Quote Contract
- Recipient Contract
- Transfer Contract
Implementation Challenges
Country-Specific Bank Fields
Each country requires different bank details (CLABE for Mexico, NIT for Colombia, etc.)
Dynamic form generation based on country selection with Zod validation schemas per country
Nested vs Flat Data Transform
The mobile client sends flat keys (address.city), while the transfer rail expects nested objects ({address: {city}})
transformBankDetails() function converts formats and auto-injects legalType
Payment → Transfer Flow
The workflow must wait for confirmed payment before creating a transfer instruction
Webhook-driven architecture: payment_intent.succeeded triggers transfer creation
Quote Refresh
Exchange rates change frequently, so users need a refreshed quote while entering an amount
0.5s debounced rate fetching with loading states and cached quotes
Building a fintech product?
We design payment integrations, transfer workflows, and financial applications around confirmation, transparency, and reliable state changes.