BRASPER Transferencias · Brasil · Perú · EE. UU.

From a WhatsApp chat to a tracked operation

How BRASPER attends a client today, what the Kambista exchange flow teaches us, and the to-be flow from the team whiteboard: web app, database, a VIEW where a person validates payments, the existing Dashboard (untouched) and a billing script, with WhatsApp kept as a channel instead of the system of record. Now complemented with the IATHON team diagnosis: baseline, AI components, hypotheses and MVP scope.

Site reviewed: brasper.com/es · 10 Oct 2026 Benchmark: Kambista app v2.0.218 Plan source: whiteboard “to be” Baseline & hypotheses: IATHON team notes Open full Kambista walkthrough →
The short version

One idea: the operation lives in a database, not in a chat

Today the website is a calculator that ends in WhatsApp. Everything after that (data, proof of payment, verification, bookkeeping) happens in chat and by hand. The whiteboard moves that work into a structured flow; Kambista shows how a client-facing version of it can feel.

today

Calculator → WhatsApp

The calculator builds a pre-filled message and opens wa.me. No operation record is created on the website.

whiteboard

Web App → BD → VIEW → Dashboard → Script

Client data and voucher photos land in a database; a person validates each payment through a VIEW (about 15 min) and marks orders to export; the existing Dashboard imports and exports orders; a script registers the sales through the providers’ APIs.

benchmark

Kambista’s 3-step wizard

Datos → Transferencia → Constancia, then a status timeline with receipts. The same shape fits the board’s fields almost one-to-one.

team notes
7 FTE
4 in sales + 3 in billing for ~60 transactions a day
team notes
up to 3 days
from confirmed payment to the client’s receipt
team notes
100% manual
payment validation from screenshots, and double data entry
team target
20 min
from confirmation to receipt; payment validation stays with a person
How to read the tags: site seen on brasper.com/es · code read from the site’s public JavaScript · board from the whiteboard photo · team notes from the IATHON diagnosis notes you shared (I have not verified the numbers) · inferred my reading, please confirm · suggested my proposal, not on the board.
1 · Today

How a client is attended now

brasper.com/es promises “Envía dinero a Perú y Brasil por WhatsApp, seguro y en minutos”. The flow below is what the site and its code do. The back office behind it (sales and billing teams, KeyFácil and Omni) comes from the team’s diagnosis notes, because the whiteboard photo I have is cropped at the top.

→
→
→
→
→
Second entry point: “Programa Tu Transferencia” collects date, amount, DNI/CPF, full name, phone, email and currency pair, then also ends in “Enviar por WhatsApp”.

Inside the back office today

Seven people, two teams, nine steps. The “Dashboard” (“eje” on the board) is the hub where sales types and billing re-checks.

Ventas · 4 people
→
→
→
→
Facturación · 3 people
→
→
→
2×
data entry: Dashboard, then KeyFácil / Omni, so typing errors
fraud risk
payment “proof” is a screenshot checked by a person
queues
long waits in WhatsApp; Omni has no integration
Hero calculatorNote “1 BRL = 0 PEN” and an expired promo (“hasta el 09 de abril”).
Programa tu transferenciaA structured form, but it submits to WhatsApp, not to a database.
“Envía en 3 pasos”Four cards are shown; step 2 asks for the voucher by chat.
Horarios de atenciónMon–Fri 7:00–18:00 · Sat 8:00–14:00 · Sun 12:00–14:00 · holidays closed.

What gets in the way

#ObservationEvidenceEffect on the client / team
1No operation record is created by the site. The only output is a WhatsApp message.codeNo ID, no status the client can check, no data for reporting.
2Proof of payment and account data are collected in chat.siteRe-typing, missed or unreadable photos, long back-and-forth.
3Rates did not load on 10 Oct 2026. Calculator showed 0.00 and “1 BRL = 0 PEN”; the calls coin/currencies, coin/tax-rate, coin/commission and automatic coupons failed with network errors.site reproduced in the app’s browser pane and in headless Chrome; apibras.finzeler.com also fails the TLS handshake from curlThe main call-to-action cannot quote. Caveat: tested from one Mac only, so check from another network.
4Hours are limited (weekday 7–18, Sat 8–14, Sun 12–14, holidays closed) and are only stated on the page, not in the flow.siteA client outside hours gets no explanation of when the operation will be checked.
5Back office is manual: validation by eye, double entry (Dashboard + KeyFácil / Omni), xlsx / pdf consolidation, receipt by email.team notes board “(manual)”Seven people for ~60 transactions a day; up to 3 days to the receipt.
5bPayment validation is 100% manual, from screenshots.team notesA forged or edited screenshot can pass; a person is the only control.
5cNo defined data schema: the Dashboard is typed free-form (board flag “dB Schema!!!”).team notes boardReports and automation have nothing reliable to read.
6Stale or inconsistent copy: promo “hasta el 09 de abril” still in the hero; “Envía en 3 pasos” shows four cards; “+45 mil operaciones” vs “+50 mil envíos”; leftover “¿Necesitas ayuda con tu donación?” near the WhatsApp button.siteWeakens trust on a money product.
7The public JavaScript embeds environment values, including an “admin redirect secret” with a trivially guessable value and the API host.codeAnything in a VITE_ variable is public. Secrets and API keys must live on a server, which is exactly what the board’s “API key !” points at. Rotate that value and move the check server-side.
2 · Benchmark

What Kambista’s flow gives us to reuse

Walked end to end on a real device (Samsung, app v2.0.218). Kambista does everything in-app: calculate, fill data, transfer, report proof, track, get receipts. Each pattern below maps to a piece of the whiteboard.

CalculatorRate tabs, live result, coupon, one button to start.
DatosOrigin bank, destination account, origin of funds.
TransferenciaCompany account with copy buttons, currency warning.
Cancel“Tienes una operación en curso”.
Status timelineRegistrada → Verificamos → Enviamos → Recibiste, plus receipts.
Saved accountsReused as destination in the next operation.
Kambista patternBrasper todayBrasper to-be (with board element)
Live calculator with rate and resultHas one, and shows commission + total (clearer than Kambista). Rates currently fail to load.Keep it; make the rate source reliable. board: “tipo cambio” → Web App
Datos step: origin bank, destination account, origin of fundsAsked in chat; the “Programa” form collects DNI/CPF, name, phone, email only.Same three fields in the app, plus DNI/CPF. board: Origen Fondo, C. Origen, C. Destino
Transferencia step: company account, copy buttons, “use the right currency account”, rate-lock timeAccount is given in chat.Show the Brasper account for the operation’s currency in-app, with the lock time and an out-of-hours notice built from Brasper’s own hours. suggested
Constancia: report the paymentVoucher sent as a chat attachment.Operation number + photo upload straight into the database. board: N° Trans, Fotos → BD
Verification ~15 min and status timelineNo status visible to the client.A person checks the bank (~15 min) and sets OK / Aprobado in the VIEW; client sees the timeline. board: Bank, 15 min, ok? Aprob
Receipts (boleta PDF/XML)Manual.Billing script generates them from approved rows. board: SCRIPT / Fact
Preferential rate for large amounts (Kambista: over $5,000 or S/18,000, via a link)Rate negotiated with an agent in WhatsApp; notes mention “net” and “preferential” sales team notes to confirmRate tiers coded inside the quote tool, so a person is needed only for exceptions. suggested
Saved accounts, cancel, referralReferral exists as step “Recomienda”.Saved beneficiaries and a cancel path. suggested, not on the board
Speed reference: in the finished Kambista operation I opened, registration (15:20) to money received (15:43) took 23 minutes. That is one example and a different interval from Brasper’s 20-minute target (confirmation to receipt), but it shows the order of magnitude is realistic.
3 · To-be

The whiteboard flow, redrawn

Everything below the red line on the board, drawn with its actors: who does each step and in which system. Three rules shape it. Payment validation stays with a person who works in the VIEW. The Dashboard is the existing system and is not modified: it only imports and exports orders. And AI appears only where similar remittance and exchange businesses already use it, as optional pieces.

The original

Above the red line: today’s flow (this photo is cropped at the top). Below: “to be”.

What the board says

  • Web App reads the exchange rate (“tipo cambio”) and collects Origen de fondo ✓, C. Origen, N° Trans, C. Destino.
  • Fotos go from the Web App into the BD, labelled IV (read by the team as Intención de Venta).
  • Bank with a person and 15 min: a person checks the bank and “ok? Aprob” goes back to the BD, through the VIEW where they change the order status (confirmed by you).
  • The VIEW over the BD; a person marks to export.
  • Export → the Dashboard, which already exists, is not modified and only imports and exports orders (confirmed by you).
  • I/EXP → SCRIPT “Fact”: a person exports the orders from the Dashboard and imports them into Fact (confirmed by you). Fact has its own database and an API key (underlined and flagged with “!!”); it runs the set of orders, registers the sales through KeyFácil / Omni, and the flow ends with the receipt.
  • Bottom left: WSP, Telegram, Discord o IA. In my drawing this is the optional chat agent A1 (Discord is not drawn: I found no use of it by similar businesses).
IA opcional(servicios) Clientey canales Nuestrosistema (nuevo) Personas Dashboardactual, sincambios Facturación(persona) Script Fact Serviciosfiscales Clientecotiza y llenadatos, transfierey sube la foto Clienterecibe el PDFpor correo Web Appcotiza con el tipo de cambiorecibe datos y foto del voucher BD · IVIntención de Ventafuente de verdad VIEWpendientes y aprobadasla persona cambia el estado aquíy marca para exportar Bancodepósitos delcliente (consultamanual) Validadorrevisa el banco≈ 15 min y marcaOK en la VIEW Operadormarca y exportael archivo deórdenes Dashboard actual (sin cambios)solo importa y exporta órdenes Facturaciónexporta delDashboard yimporta en Fact Fact · validaesquema, datos yduplicadosdel lote Fact · registracada venta porAPI y guardael XML Fact · PDFdesde el XML yenvío porcorreo ServiciosKeyFácil → SUNATOmni → fisco BR 1 2 3 4 5 6 7 8 PDF por correo A1 · Agente de chatWhatsApp · Telegram · webusa la misma API de la Web Apppasa a una persona si hace faltaA2 · Identidaddocumento + rostro1ª operaciónservicio externoA3 · Riesgopuntaje por ordenservicio externosolo orientaA4 · Rechazosexplica el errorexperimental
PersonaSistema nuevo (nuestro)Dashboard actual, sin cambiosIA opcionalFlecha discontinua morada = IA opcional
#Who does whatSource
1Cliente quotes in the Web App, which asks for the current tipo de cambio (and commission). Optionally through the chat agent A1.board arrow read as “Web App → rate”
2Cliente enters origen de fondos, cuenta origen, N° de transacción, cuenta destino, transfers, and uploads the fotos of the proof; all of it is stored in the BD. Optionally A2 checks identity once, on the first operation.board
3Validador (a person) sees the pending operations in the VIEW, checks the deposit in the bank (target about 15 minutes) and sets OK / Aprobado; the status is written to the BD. Optionally A3 shows a risk score beside each order.board confirmed by you
4Operador marks the approved operations in the VIEW and exports the order file. They may be the same person as the validator.board same person? to confirm
5The file is imported into the Dashboard, the MYPE’s current system. It is not modified: it only accepts imports and exports of orders.confirmed by you
6A person from billing exports the orders from the Dashboard and imports that file into Fact, which runs the whole set (the board’s I/EXP). This is a manual hand-off by design.board confirmed by you which person? to confirm
7Fact runs the imported set: it validates the batch and registers each sale through the API: SUNAT via KeyFácil, the Brazilian equivalent via Omni, with an API key kept server-side. It stores the XML it gets back. Optionally A4 explains any rejection (detail).board team notes
8Fact builds the PDF from that XML and emails it to the client. It returns the invoice number and status to the BD, where the VIEW shows them; the Dashboard is not involved.team notes return path: my reading
Optional evolutions

Three AI pieces already used by similar businesses, and one experimental

I kept only the pieces for which I found a real deployment in remittance or currency-exchange companies, and each now sits in the graph as an actor that exchanges data with the flow. A1 to A3 meet that test. A4, for the Fact script, does not: I found no deployment, and the table says so. None of them approves a payment or edits fiscal data. The base flow runs with all of them switched off. Most sources are company, partner or vendor write-ups, so the performance claims are unaudited.

Where it sits in the graphWhat it doesEvidence in this contextWhat stays human or deterministicWhat it needs, and its limits
A1Cliente y canales → Web App API. Same API as the Web App; hands over to a person.Conversation on WhatsApp, Telegram or web chat: quote, data capture, voucher upload, status. Detail in 4b.Félix Pago sends remittances to Latin America through an AI chatbot on WhatsApp (Stripe case study). Rextie, a Peruvian exchange house, launched an AI chatbot, “Lucía”, for 24-hour customer advice (Andina; the article is undated, and it describes advice rather than operations). Tkambio’s assistant is described as experimental, so I do not count it.Rates, fees and account numbers come from the API. No approvals; the validator decides. Handoff to a person on request.A language model with tool calling, and the Web App API must exist first. Automating WhatsApp needs the WhatsApp Business Platform: today the site only opens a wa.me link. A Telegram bot works for a demo without that approval. Effort: medium.
A2Web App → BD, first operation only. A purple service attached to the BD.Checks an identity document and a face match; returns pass or fail to the BD, and the result shows in the VIEW.Remitly onboards customers with Onfido’s AI-based document and face checks (The Paypers, Onfido).A person handles every failure. The vendor’s model is not ours to train or tune.It is a paid external service. Open points: whether the vendor reads Peruvian DNI and Brazilian CPF documents, the cost per check, and legal review of ID and biometric data under Peruvian and Brazilian data-protection rules. It adds friction, so first operation only. Effort: low to medium.
A3BD → VIEW. A purple service whose score appears beside each pending order.Returns a risk score for each operation to help the validator prioritize and look harder at some orders.Remitly integrated Sift’s risk score into its review workflow: the score creates review tasks and is one input to human decisions (Sift case study, a vendor account).The validator decides; the score never approves or rejects.A vendor integration, and it needs operation history to be useful, while about 60 transactions a day is little data. A first version can be plain rules (first operation, unusual amount, new account), which are not AI. Effort: low to medium.
A4Fact · registra, on the rejected records. A purple actor under the step that talks to the tax services.Reads the authority’s or provider’s rejection message plus the record, and says in plain language what is probably wrong and which field to check. A person corrects the data at the source and re-imports.None found as AI. What I found is the problem it would address: some NFS-e rejections are generic, such as code E8214, which does not say which data is wrong (Omie help), and Brazilian rejections vary by municipality (Tecnospeed). E-invoicing vendors document rule-based validation in layers, technical then content (Sovos). The search result itself called an AI layer here a suggestion, not a fact.Rules come first: schema, document numbers, totals and duplicates are checked before sending, with no AI. A4 only comments after a rejection. It never edits fiscal data, never resubmits, and its text is labelled as a suggestion.Real rejection responses collected from the providers’ test environments, to see how many are generic enough to need it. A small language-model call with structured output. Limit: it can be wrong, so a person confirms. Effort: low. Unproven in this context.
Left out for lack of evidence. I found no deployment in remittance or exchange businesses of: reading voucher images with OCR, a triage assistant for exceptions, natural-language queries over the database, or a custom-trained fraud classifier. A rejection explainer is back only as the experimental A4, at your request. Some of these were in my earlier version or the team notes; they are removed. Two of them also touched the Dashboard, which is off limits.
Ground rules
  • AI never approves a payment and never changes a money value.
  • Each piece has a feature flag; the base flow keeps working with all of them off.
  • Store the input reference, model or vendor and the answer in events for audit.
  • Voucher and ID images are personal data: private storage, a provider with data controls, redacted logs.
Where I would start suggested
  • A1 on Telegram first (no approval needed), WhatsApp when the Business Platform is ready.
  • A3 as plain rules first, so the VIEW already has the column; swap in a vendor score later.
  • A2 only if a vendor covers DNI and CPF at an acceptable cost.
  • A4 last, and only after the rule-based checks in Fact work and real rejections show it is needed.
4 · Client journey

What the client would see

Five screens modelled on Kambista’s wizard, using the board’s fields and BRASPER’s own rules (three currencies, commission shown up front, WhatsApp always one tap away). Illustrative wireframes with sample values, not final design.

1Cotiza
BrasPer ES · PT · EN
Tú envías500.00  BRL ▾
Destinatario recibe—  PEN ▾
Comisión—
Total a enviar—
Tasa de cambio1 BRL = — PEN
Tasa asegurada por 15 min
Continuar

Same calculator the site has, with “Continuar” as the main action and WhatsApp as the secondary one.

2Datos
Completa los datos 1 / 3
DNI / CPF••••••••
Origen de fondosSelecciona ▾
¿Desde qué banco envías?Cuenta origen ▾
¿Dónde recibes?Cuenta destino ▾
Ambas cuentas deben estar a tu nombre.
Continuar

Board fields: origen de fondos, cuenta origen, cuenta destino. Destination can be a saved account.

3Transfiere a Brasper
Transfiere a BrasPer 2 / 3
TitularBrasPer
Monto500.00 BRL ⧉
Bancosegún tu origen
Cuenta•••• •••• ⧉
Transfiere a la cuenta de la moneda correcta (BRL / PEN / USD).
Fuera de horario: tu operación se verificará hoy a las 12:00 p. m.
Ya transferí
Cancelar operación

From Kambista’s Transferencia step. The out-of-hours line comes from BRASPER’s own published hours.

4Constancia
Envía tu constancia 3 / 3
N° de operación bancaria000000
📷 Sube la foto o captura
del comprobante
Verificaremos tu depósito en ~15 min.
Enviar constancia

Board: N° Trans and Fotos go straight to the BD, no chat attachment.

5Seguimiento
Operación BR-0001 ejemplo
Enviaste500.00 BRL
Recibes— PEN
  • Operación registradahora
  • Verificando tu transferencia≈ 15 min
  • Enviamos tu dinero
  • Recibiste tu dinero
Descargar comprobante
Comprobante por correo y avisos por WhatsApp / Telegram.

Timeline from Kambista’s finished-operation screen; receipt comes from the billing script.

4b · Same journey, other door

WhatsApp with an AI agent A1 · optional

Clients will keep using WhatsApp, so the agent runs the same five steps inside the chat and writes to the same database as the web app. The “Enviar por WhatsApp” button stays: the pre-filled quote it already sends becomes the agent’s first input. The agent talks and collects; it never decides about money. Payments are validated by a person in the VIEW; the agent never approves anything. This is piece A1 of the optional AI layer (evidence).

Optimized flow (swimlanes)

1Entry
2Quote
3Datos
4Transfer
5Proof
6Verify
7Close
Client on WhatsApp
Sends the pre-filled quote from the site, or just writes “quiero enviar 500 reales a Perú”.
Taps Sí, continuar, or changes the amount.
Answers DNI/CPF, origen de fondos, picks a saved destination account or adds one.
Transfers from their own bank app.
Sends the voucher photo and the bank’s operation number.
Waits; gets updates.
Receives the money and the receipt; can recommend Brasper.
AI agent
Detects language (ES / PT / EN) and the amounts, then asks the tool for a fresh quote instead of trusting the pasted one.
Shows rate, commission, total and the rate-lock time. Offers “Hablar con una persona”.
Asks one question at a time, validates format, reminds “ambas cuentas a tu nombre”, then creates the operation (ID, status Pendiente).
Sends Brasper’s account for that currency, lock time, and what to expect given today’s hours.
Asks for the voucher photo and the operation number, confirms the number with the client, and attaches both to the operation.
Tells the client a person is validating the payment (≈15 min). Sends the result when the status changes in the BD.
Sends status messages and the receipt link; closes the thread with a short survey.
Tools / BD
get_rate_quote
check_hours
get_rate_quote
list_accounts
create_operation → BD row
get_company_account
attach_proof → photo + N° Trans in BD
get_status (reads BD; the validator updates it in the VIEW)
Script “Fact” registers the sale, builds the PDF from the XML and emails it; send_receipt shares the link
People
—
—
Takes over if the client asks for a person.
—
The validator sees the new operation, with its photo, in the VIEW.
Validator: checks the bank and sets OK / Aprobado in the VIEW (≈15 min). Operator: marks and exports; imports into the Dashboard as today.
A billing person exports from the Dashboard and imports into Fact; an advisor handles exceptions and complaints.
Steps 5 to 7 are the whiteboard’s human validation in the VIEW → export → existing Dashboard → Fact script chain, unchanged. Steps 1 to 4 are what the web app does too: a second front door on one backend.

What the chat would look like

What the agent can do (tool layer)

ToolDoesWrites BD
get_rate_quoteRate, commission, total, lock time for a currency pair and amountquote
check_hoursOpen / closed now and when a person will validate the payment—
list_accounts / save_accountSaved destination accounts of this clientyes
create_operationOrigen de fondos, cuenta origen, cuenta destino → ID, status Pendienteyes
get_company_accountBrasper account for the operation’s currency—
attach_proofPhoto + N° Trans; status En validaciónyes
get_statusTimeline of an operation—
handoff_to_humanOpens an advisor thread with reason and summaryyes
send_receiptReceipt link produced by the billing script—
code The site’s public JavaScript already points to an AI chat endpoint (VITE_CHAT_API_URL) and has chat strings in ES / EN / PT. I did not verify what it does or whether it is live; it may be a starting point for this agent.

Guardrails and handoff

The agent must never…
  • say a payment is received or approved; it only repeats the status the validator set in the VIEW
  • treat the voucher image as proof: the validator checks it against the bank
  • write a rate, fee or account number itself; those come verbatim from tools
  • invent a rate when the rates service is down: it says so and hands off
  • give financial or legal advice
Hand off to a person when…
  • the client asks for one, or writes a complaint or claim
  • the client reports a problem with the voucher, the amount or the account
  • the rate lock expired mid-flow, or the amount is above a limit limit to define
  • a first-time client needs identity checks process to define

Chat today vs optimized

TodayWith the AI agent
First replyPre-filled quote, then a person answers during business hoursInstant, any hour, in the client’s language
DataPerson asks, client types, answers scattered in the chatOne question at a time, written to BD fields
ProofScreenshot in chat, found by scrolling the conversationPhoto and operation number stored on the operation and shown in the VIEW, where the validator checks it against the bank
StatusClient asks “¿ya llegó?”Messages sent when the BD status changes
Team effortEvery step: 4 in sales, 3 in billingValidation in the VIEW, export and import, exceptions and supervision
RecordChat history and spreadsheetsOne BD row per operation, with the message log attached
Needs to exist first: the Web App backend and BD (roadmap phase 1). The agent is a second client of the same API, so it can start read-only (quote and status) and gain write tools as the BD matures. Telegram reuses the same tool layer through another channel adapter.
5 · The VIEW

What the validator and the operator would see

The VIEW is the one screen we build for the team. The person validating payments changes order statuses here and marks which orders to export. The Dashboard is not touched: the exported file is imported into it as today. Wireframe with made-up rows.

VIEW · OperacionesPendientes 1 En validación 1 Aprobadas 2 Rechazadas 1 Exportadas 1
IDClienteEnvía → RecibeOrigen de fondosN° trans.FotoRiesgo (A3, opcional)Estado
☐BR-0001Cliente ABRL → PENAhorros000001📎—Pendiente
☐BR-0002Cliente BPEN → BRLVenta de bien000002📎—En validación
☑BR-0003Cliente CUSD → BRLAhorros000003📎bajoAprobada
☑BR-0004Cliente DBRL → USDDonación000004📎medioAprobada
☐BR-0005Cliente EBRL → PENAhorros000005📎altoRechazada
☐BR-0006Cliente FBRL → PENAhorros000006📎bajoExportada
Cambiar estadoMarcar para exportar (2)Exportar archivo de órdenesVer facturas (Fact)
The person stays in charge. The validator checks the deposit in the bank and sets the status here; nothing is approved by a system. The “Riesgo” column is empty unless the optional risk score (A3) is switched on.
The Dashboard is not changed. The operator exports the approved orders from this VIEW and imports the file into the Dashboard, which only accepts imports and exports of orders. Fact’s results (invoice number, status) come back to the BD and appear here, not in the Dashboard.
6 · Improvements

What changes, element by element

Each row is one improvement from the board, with what it replaces today and the Kambista behaviour it can borrow.

#ImprovementReplaces todayKambista referenceSource
1Live “tipo de cambio” in the Web AppCalculator that currently shows 0 when the rates service is unreachableCalculator + rate lock timeboard
2Structured data capture: origen de fondos, cuenta origen, cuenta destino, N° de transacciónQuestions answered one by one in WhatsAppDatos stepboard
3Proof photos uploaded to the BDVoucher sent as a chat attachmentConstancia stepboard
4BD (“IV”) as single source of truth with a defined schema and a status per operationFree-form typing into the Dashboard; chats and spreadsheetsHistorial: En proceso / Finalizadasboard
5Human payment validation in a VIEW: the person sees each case and the voucher, checks the bank (~15 min) and sets OK / Aprobado thereValidating by eye from chat screenshots, with no record of who decided“Verificamos tu transferencia”board confirmed by you
6VIEW + “marcar para exportar”Building the export by hand—board
7Dashboard stays as it is: the VIEW exports an order file, the Dashboard imports it, and its order export feeds billingTyping each order into the Dashboard—board confirmed by you
8Billing script “Fact”: takes the exported batch, registers each sale via API (SUNAT / Brazilian equivalent), builds the PDF from the returned XML and emails it; API key kept on the serverRe-typing into KeyFácil / Omni, xlsx / pdf consolidation, manual email (up to 3 days)Boleta PDF / XML per operationboard team notes
9Channels around one BD: WhatsApp and Telegram, with an optional AI chat agent (A1)WhatsApp as the only channel and the record— (see 4b for the agent flow)board role inferred
10Status timeline and notifications to the client“Did you receive my voucher?” messages4-stage timelinesuggested
11Out-of-hours notice in the flow, using Brasper’s hoursHours only in a page section“Fuera de horario” toastsuggested
12Saved beneficiary accounts and cancel pathRe-sending account data each timeCuentas tab, cancel promptsuggested
13Optional AI, only where similar businesses already use it: A1 chat agent, A2 identity check, A3 risk score in the VIEW (evidence)Everything by hand—optional
14Rate tiers inside the quote tool (net vs preferential)Rate negotiated per chat in a queuePreferential-rate link for large amountssuggested to confirm
15Single data entry: one record feeds Dashboard and billingDouble entry, with typing errors—team notes
7 · AI and business case

Where AI helps, and what it should be worth

From the IATHON diagnosis (challenge 5.5, sales and billing at Brasper). Payment validation stays with a person, so AI is limited to three optional pieces with a track record in remittance and exchange businesses (the evidence is in A1 to A3 of the To-be section). The numbers below are the team’s baseline and hypotheses, not measurements I made.

PieceWhere it actsSeen in similar businessesMain riskGuard
A1 · Chat agentWeb chat, WhatsApp, Telegram (see 4b)Félix Pago (WhatsApp remittances), Rextie (Peruvian exchange house)Wrong numbers; WhatsApp automation needs the Business PlatformMoney values only from tools; a person validates
A2 · Identity checkFirst operation of a clientRemitly with OnfidoCost, privacy, coverage of DNI and CPFVendor verdict, a person handles failures
A3 · Risk scoreBeside each order in the VIEWRemitly with SiftLittle data at about 60 operations a dayInforms the validator, never decides
Plain automation team notesWeb App + BD, the VIEW and its export, Fact via API—No API key from Brasper; the Dashboard’s file format is unknownFallbacks in Data & MVP

Baseline, hypotheses and what they imply

MeasureBaselineTeam hypothesis / targetImplied my arithmetic
Sales effort4 people, ~60 trx/day, WhatsApp queues−55% man-hours (the team’s hypothesis, built with automatic validation in mind)4 × 0.45 ≈ 1.8 FTE, only if the saving still holds with a person validating. Re-estimate.
Attention capacityLimited by the queue+25% with the chat agent, no extra staffCapacity gain, not added to the line above
Billing effort3 people; Omni fully manual, KeyFácil partly−80 to −90% man-hours (script via API to KeyFácil / Omni); 3 → 1 supervising≈ 1 FTE (the team’s plan)
Total team7 FTE—≈ 2.8 FTE on the team’s figures; about 8.6 trx per person per day today vs about 21 (60 ÷ 2.8)
Time to receiptUp to 3 days20 minutes from confirmationReceipt generated by the script, no queue between steps
Payment validationBy eye from chat screenshots, no record of who decidedStays with a person (owner decision); the VIEW records who decided and whenMeasure minutes per validation instead of a share validated automatically
Typing errorsDouble entry0One record, no re-typing
The first version of this page carried a target of at least 80% of payments validated automatically. Since validation stays human, that target is dropped. The sales saving came partly from it, so it needs a new estimate: the remaining gain comes from the Web App and the BD removing chat re-typing. The FTE figures also assume man-hours convert to people linearly. They are targets to test in the MVP, not a forecast.
8 · Data and MVP

The schema the board asks for, and a 4-day cut

The board flags “dB Schema!!!” in red and the notes list “define the BD schema” as pending. Below is a draft built only from the fields named on the board and in the notes, plus the MVP limits the team gave: four days, happy path only.

Draft schema suggested, to validate

EntityKey fieldsWhy it exists
clientsid, name, doc_type (DNI / CPF), doc_number, phone (WhatsApp), email, countryOne identity across web and chat
client_accountsid, client_id, bank, currency, account_number, holder_name, aliasOrigin and destination accounts; “ambas a tu nombre” can be checked
quotesid, from_currency, to_currency, amount_send, rate, commission, amount_receive, tier (net / preferential), coupon, locked_untilThe price the client accepted, frozen
operations (“IV”)id, client_id, quote_id, origin_account_id, destination_account_id, origen_de_fondos, channel, status, created_atThe Intención de Venta; the single source of truth
proofsid, operation_id, image_url, n_trans, uploaded_atVoucher photo and the operation number the client entered
validationsid, operation_id, validator, decided_at, decision (OK / rechazada), noteWho validated each payment and when; the human check, on record
risk_scores optionalid, operation_id, source, score, created_atOnly if A3 is switched on; shown in the VIEW
billing_batchesid, exported_by, imported_by, imported_at, file_checksum, record_count, statusOne file exported from the Dashboard and imported into Fact by a person
invoicesid, operation_id, batch_id, service (KeyFácil / Omni), authority_status, number, series, xml_url, cdr_url, xml_hash, pdf_url, emailed_at, message_idResult per record: the XML is the source, the PDF is derived
eventsid, operation_id, channel, actor (client / agent / person), text, atAudit trail and the chat history of each operation
Status of an operation: pendiente→en validación→aprobada→exportada→facturada→comprobante enviado ·rechazada·cancelada

MVP cut for four days suggested

In (happy path)
  • Web App: quote → Datos → Transferencia → Constancia, with voucher upload
  • BD with the schema above
  • VIEW for the validator: see the voucher, set the status, mark and export the order file
  • The existing Dashboard imports that file as today, with no changes
  • Billing script: exported batch → API registration → PDF from the returned XML → email
Out for now
  • The optional AI pieces A2 and A3; A1 only as a Telegram or WhatsApp demo with quote and status
  • Agent write-tools and Discord
  • Edge cases: partial payments, third-party payers, wrong currency, refunds
  • Rate tiers and coupons beyond one default
Even in an MVP: private storage for voucher images, access control on the VIEW, and no secrets in client-side code.

Dependencies and risks

RiskWhy it mattersFallback if it slips
API key for Omni / KeyFácil not delivered team notesIt is the critical dependency (“API Key !!” on the board). Omni has no integration today.Script produces the xlsx / pdf in the exact format billing already uploads: still manual to upload, but no re-typing
Dashboard file format unknown newThe Dashboard cannot be changed and only imports and exports orders, so its file layout is the integration contract for both the VIEW and Fact.Get a sample import and export file first; until then, export the VIEW as CSV and map it by hand
False or illegible vouchers team notesA forged voucher can pass if the validator only looks at the image.The validator checks the deposit in the bank, not just the photo; optional risk score A3 helps prioritize
Edge cases outside the happy path team notesReal traffic will have them.Handled by a person in the VIEW from day one (status rechazada, notes)
Adoption: clients used to WhatsApp team notesIf they skip the web app, data is not captured.The WhatsApp agent writes to the same BD (4b)
Security, login and data in the MVP team notesIDs, accounts and voucher images are sensitive. The live site already ships a guessable secret in its public JavaScript (see Today).Server-side secrets only; rotate that value; limit staff access by role
9 · Billing script

The flow behind “Script Fact”

Fact takes a set of orders that a person exports from the Dashboard and imports into Fact, which then runs the whole set. It registers each sale through the provider’s API with the tax authority (SUNAT in Peru through KeyFácil, the Brazilian equivalent through Omni), builds the PDF itself from the XML it gets back, and emails that PDF. It replaces today’s billing steps 6 to 9: pre-validate, register in KeyFácil / Omni, consolidate, email.

batch in
one exported file, many records; each record succeeds or fails on its own
XML is the document
the tax authority’s XML is the legal source; it is stored untouched
PDF is derived
generated from the stored XML, so it always shows what was registered
Personaexporta del Dashboarde importa en Fact 1 · Validar loteesquema, checksum,datos y duplicados 2 · Registrar vía APIPerú: KeyFácil → SUNATdevuelve XML firmado + CDR 2 · Registrar vía APIBrasil: Omni → fisco BRdevuelve XML autorizado 3 · Guardar XML+ CDR / protocolofuente legal 4 · Generar PDFdesde el XML recibidoQR + hash + leyendas 5 · EnviarPDF por correoal cliente 6 · Reportarestado por fila+ consolidado registro inválido→ fuera del lote(el resto sigue) rechazo de la autoridad→ error_fiscal (corregir) API caída / timeout→ reintento + consultarestado antes de reenviar PDF ≠ XML(totales, hash, QR)→ no se envía rebote / sincorreo → alerta Entrada: registros ya aprobados y confirmados rojo = camino de error, por registro
#Step (per batch, then per record)Record state after
0The operator marks approved orders in the VIEW and exports them; the file is imported into the Dashboard (unchanged). A person from billing then exports the orders from the Dashboard and imports that file into Fact (the board’s I/EXP), which runs the set. Every record has already been validated by a person.lote recibido
1Validar lote. Check the file schema and checksum, then each record: document number format and check digits, email, amounts that add up, route. Records whose operation_id is already invoiced are skipped, so importing the same file twice is safe. Invalid records are rejected on their own and the rest continue.validado or rechazado_validacion
2Registrar la venta vía API. Routed by direction: PE→BR to KeyFácil (registers with SUNAT), BR→PE to Omni (registers with the Brazilian tax authority; to confirm which document and authority). One call per record with the operation ID as idempotency key, bounded concurrency, API key from the server-side secret store. The service returns the authority’s answer and the XML.registrando → aceptado, error_fiscal or pendiente_autoridad
3Guardar el XML exactly as received (plus the CDR or authorization protocol) with its hash. It is never edited.xml_guardado
4Generar el PDF desde ese XML. Fact’s own template reads number, series, customer, amounts, hash and QR from the XML, then checks the PDF totals against it before saving.pdf_generado or error_pdf
5Enviar por correo the PDF (the XML can be attached too) to the customer; log the message ID. The WhatsApp agent can deliver the same link.enviado or error_envio
6Reportar. A batch report is written to the BD and shown in the VIEW (record, invoice number, status, error) and emailed to the supervisor; the Dashboard is not changed. The BD marks operations as invoiced, and the daily consolidated file is produced from it, replacing the manual “Consolidado”.facturada
Order of safeguards: rules first, AI after. Fact checks schema, document numbers, totals and duplicates with plain rules before sending, as e-invoicing vendors document (Sovos). The client’s PDF goes out only after the authority’s accepted answer: a Sovos summary of Peru’s rules says SUNAT advises against delivering a receipt before validation, since a later rejection would leave it without fiscal validity (Sovos Peru; confirm with your accountant). The optional A4 only comments on records the services reject, as described in the AI table.
Record status: lote recibido→validado→registrando→aceptado→xml_guardado→pdf_generado→enviado→facturada ·rechazado_validacion·error_fiscal·pendiente_autoridad·error_pdf·error_envio

What each exported record must carry

GroupFields
Identitybatch_id, operation_id (unique), exported_at, exported_by
Routingdirection (PE→BR / BR→PE), which gives country, authority and service
Documentdocument type (boleta, factura, or the Brazilian equivalent), issue date, currency
Customerdocument type and number (DNI, RUC, CE, passport, CPF, CNPJ), name or razón social, email, address when the document requires it
Linedescription (for example the exchange service or commission), quantity, unit value, tax code, total
Evidenceamounts sent and received, exchange rate, bank operation number, payment date
Which amount is billed and every tax field (affectation, rates, service codes) must be defined with the accountant. Fact validates and transmits them; it does not decide tax treatment.

Why the PDF comes from the XML

  • Peru: the signed XML (UBL) is what SUNAT receives. The printed representation must show a QR code and the hash (the XML’s DigestValue), with the minimum content set by SUNAT resolutions (see Res. 340-2017). I did not verify the exact field list.
  • Brazil: the authorized XML is the only fiscal document; the PDF (DANFSe for the national NFS-e) has no fiscal validity and its QR points to the public consultation (overview). One blog reported the national PDF-generation service offline in August 2026, which is a reason to render it ourselves; open-source renderers exist (example).
  • Test environments: run against the providers’ test (homologación) mode first; Brazilian test PDFs carry a “no legal validity” mark.
to verify Which document Omni emits in Brazil (NFS-e national, municipal or NF-e), and whether KeyFácil / Omni return the signed XML in the API response. The PDF step depends on that.

When something goes wrong (per record)

CaseWhat Fact doesWho acts
Invalid data in the fileRejects that record in the report; the rest of the batch continuesSupervisor fixes the data at the source (VIEW / BD) and re-exports
Tax authority rejects iterror_fiscal with the authority’s code; no automatic retrySupervisor corrects the data and resubmits; numbering follows the service’s rules
API down, timeout or 5xxRetries with backoff; before resending, asks the service for the status of the idempotency key so no sale is registered twiceAlert only if retries run out
Authority answers laterpendiente_autoridad; polls until a final answer—
PDF does not match the XMLBlocks the emailSupervisor; this should never happen
Email bounces or is missingerror_envio; the PDF stays downloadable from the VIEW and the WhatsApp agent can send the linkSupervisor
Same file imported twiceSkips records already invoiced—

Pseudocode of the job

# input: the set of orders a person exported from the Dashboard and imported into Fact
batch = ingest(file)                                   # 1 schema + checksum, skip already-invoiced ids
for rec in batch.records:                              #   bounded concurrency
    try:
        check(rec)                                     # 1 country rules; DataError → rechazado_validacion
        svc = service_for(rec.direction)               # 2 PE→BR: keyfacil → SUNAT · BR→PE: omni → BR authority
        res = svc.register_sale(rec, key=rec.operation_id)   # idempotent; returns xml (+ cdr / protocol)
        if res.rejected:  mark(rec, "error_fiscal", res.code); continue
        if res.pending:   mark(rec, "pendiente_autoridad");   continue   # polled later
        store_xml(rec, res.xml, res.cdr)               # 3 untouched, hashed
        pdf = render_pdf(res.xml)                      # 4 from the XML, never from the DB
        assert totals(pdf) == totals(res.xml)          #   PDF ≠ XML → error_pdf, no email
        send_mail(rec.customer.email, pdf)             # 5 log message id
        mark(rec, "facturada")
    except DataError  as e: mark(rec, "rechazado_validacion", e)
    except Transient  as e: retry_later(rec, status_check=True)  # ask the service before resending
report(batch)                                          # 6 per-row result to the BD / VIEW + daily consolidated
Rules that keep it safe
  • Idempotent: the operation ID is the key; re-running a batch continues the unfinished records and never duplicates a sale.
  • XML is immutable: store it with its hash; the PDF can always be rebuilt from it.
  • Secrets: API keys in a server-side secret store, never in the web bundle, rotated (the board’s “API Key !!”).
  • Private storage for XML and PDF; links to customers are signed and expire.
  • Audit trail: every call and the raw answer in events.
  • Test mode first on both services before real sales.
Timing against the 20-minute target
  • The script is fast when the services answer: seconds per record, minutes per batch.
  • What decides the target is how soon operators export and confirm. Small, frequent batches (for example every 15 min or on each confirmation) beat one daily batch.
  • If an authority answers asynchronously, the receipt waits for it; the client is told the status meanwhile.

What billing would see (in the VIEW, not in the Dashboard)

VIEW · Facturación (lotes)Lotes hoy 3 Registros 58 Facturados 54 Con error 4
LoteRutaRegistrosAceptadosRechazo validaciónRechazo autoridadPDF enviadosEstado
L-0101PE→BR · SUNAT24231023Completo
L-0102BR→PE · fisco BR16140114Con errores
L-0103PE→BR · SUNAT18170016En proceso
Ver errores del loteReenviar corregidosDescargar consolidado del díaVer PDF / XML
Sample rows and numbers are made up. The point: billing goes from re-typing every operation to reading a batch report and fixing the few records that fail, which is the “3 FTE to 1” hypothesis.
10 · Suggested order

A phased path (my proposal)

The board does not set an order, so this is one that delivers value early: first stop the leaks on the live site, then capture data, then verify, then export and invoice, then widen the channels.

0 · Stabilize today’s site

Days

  • Restore the rates / commission service and add a visible fallback
  • Remove the expired promo, fix “3 pasos” and stale copy
  • Move the admin check and any secret out of the public bundle

1 · Capture

Web App + BD

  • Calculator → Datos → Transferencia → Constancia
  • Photo upload, operation ID
  • WhatsApp stays as a secondary button

2 · Validate

VIEW + human check

  • Pending list with photo and N° Trans
  • The validator sets OK / Aprobado (≈ 15 min target)
  • Client timeline + notifications

3 · Export

VIEW → Dashboard

  • Mark approved orders, export the file
  • Import into the Dashboard as today, no changes
  • Retire the manual typing and .xlsx / PDF

4 · Invoice

Script “Fact”

  • A person exports from the Dashboard and imports the set into Fact; KeyFácil (PE→BR) and Omni (BR→PE) via API key kept on the server (flow)
  • PDF built from the returned XML and emailed

5 · Channels + IA

Same BD, more doors

  • Optional AI with a track record: A1 chat agent (4b), A2 identity check, A3 risk score
  • A1 can start read-only (quote, status) earlier
How we would know it works: time from confirmation to receipt (3 days → 20 min), minutes per validation in the VIEW, typing errors (0), man-hours per transaction, and operations created with complete data. For the four-day MVP, phases 1 to 4 on the happy path are the cut described in Data & MVP.
11 · To confirm

What I read from the board, and how sure I am

Handwriting leaves room. These are the readings I used; correct any that are wrong and the diagram above will change with them.

On the boardMy readingConfidence
Red line; “to be” below itAbove = today’s manual flow, below = the new one.High
Box: Origen Fondo ✓ · C. Origen · N° Trans · C. DestinoOrigin of funds, origin account, operation / transaction number, destination account.High
“Fotos” into BD; “ok? Aprob” from Bank; “15 min”Photos stored; a person checks the bank (~15 min) and sets OK / Aprobado through the VIEW. Confirmed by you: validation stays human. (An earlier version of this page, following the team notes, showed an automatic reconciliation; that is superseded.)High
VIEW + person “Mark 2 export”, “export”A database view of operations; a person marks which to export.High
Dashboard, “confirmar / import”, “I/EXP”The Dashboard is the MYPE’s existing system, is not modified, and only imports and exports orders (confirmed by you). The VIEW exports a file it imports; a person then exports its orders and imports them into Fact. The first letters of its label (“DAP / BAP”) remain unread.High
SCRIPT + “Fact” + cylinder + “API key !”Billing script with its own database; it reaches KeyFácil / Omni with an API key that must be protected (team notes).Medium-high
“tipo cambio” with an arrow from Web AppThe Web App fetches the exchange rate. I drew the arrow as drawn.Medium
“<Expo>” beside the data boxEither “export” (this data is what gets exported) or Expo, the app framework. Not used in the diagram.Low
“IV” over BDIntención de Venta, the team’s interpretation. Plausible: it labels the table that holds each sale. I show it as “BD · IV”.Medium
“eje”The central hub, i.e. the Dashboard (team notes).Medium
“x Asis”, “Ventas Prefe…”, “Ventas Netas”, “Cola” (in the part of the board I cannot see)Per assistant / agent; preferential vs net sales; queue (team notes). Not verified by me.Low-medium
“e” inside the script box; the red circle at the end of the script lineUnclear. I left them out of the diagram.Low
WSP · Telegram · Discord o IA with a long arrowAlternative channels (WhatsApp / Telegram) with an AI chatbot, writing to the same BD (team notes: “Diseño con IA”). I drew it as A1; Discord is not drawn because I found no use of it by similar businesses.Medium-high
Questions for you: (1) What file format does the Dashboard import and export (type and columns), so the VIEW and Fact can talk to it? (2) Does Omni offer an API at all for BR→PE, or only xlsx / pdf? (3) Should the web app replace WhatsApp for the first message, or only follow it? (4) Does the client need an account / login, or just an operation link? (5) Is the rates service the same apibras.finzeler.com API that is failing now? (6) Do the identity-verification vendors you would consider read Peruvian DNI and Brazilian CPF documents? (7) Are the 7 FTE and ~60 trx/day figures measured or estimated? (8) What exactly is invoiced on each route (commission or full amount) and which document type applies? (9) Do KeyFácil and Omni expose an API, who at Brasper can request the keys, and do they return the signed XML (and the CDR in Peru) in the response? (10) Which document and authority does Omni use in Brazil (NFS-e national, municipal, NF-e)? (11) Are the validator and the operator the same person, and who validates outside business hours? (12) Which person exports from the Dashboard and imports into Fact, and how often? (13) Does Fact’s first version need the optional A4, or is rule-based validation enough?