BRASPER Transferencias · Brasil · Perú

From a WhatsApp chat to a tracked operation

Today a transfer lives in chat messages and spreadsheets. This page shows how it works now, the new flow drawn on the team whiteboard, and what we can release as a first version (MVP) in four days.

Website reviewed 10 Oct 2026 Compared with the Kambista app Sources: whiteboard and team notes
The idea in one minute

One change: every operation gets a record

Right now the website ends in WhatsApp and everything after that is done by hand. The new flow keeps WhatsApp as a help channel, but saves each operation in one place so people can check it, bill it and follow it.

Today

Chat and spreadsheets

Clients quote on the website, then data, proof of payment and checks all happen in WhatsApp. Staff retype each order into the Dashboard and again into the invoicing tools.

New flow

Web App or chat → database → VIEW → Fact

The client enters data in a Web App, or chats with an AI assistant on WhatsApp or inside the app. A person checks the bank and approves in a VIEW. The Dashboard is not changed. A script (Fact) registers the sale and emails the PDF.

First release (MVP)

The normal path only

A standard operation from quote to PDF receipt. Special cases and AI come later.

7 people
4 in sales and 3 in billing
~60 a day
operations, mostly handled by chat
up to 3 days
from confirmed payment to the receipt
20 min
target, from confirmation to receipt
Three decisions already made: (1) a person validates every payment; (2) the Dashboard, the company’s current system, is not changed and only imports and exports orders; (3) the chat is a core way in, with one AI assistant doing the talking on both WhatsApp and inside the app (same service, same steps, same data; only the channel differs); other AI is optional and used only where similar companies already use it. The numbers above come from the team’s diagnosis notes and I have not verified them.
1 · Today

How an operation works now

→
→
→
→
→
The website calculatorIt shows “1 BRL = 0 PEN”: the rates did not load on 10 Oct (tested from one computer).

What gets in the way

  • Nothing is saved by the website. Its only result is a WhatsApp message.
  • Proof of payment is a screenshot checked by eye, with no record of who decided. That is a fraud risk.
  • The same data is typed twice (Dashboard, then KeyFácil or Omni), which causes mistakes.
  • There is no defined data structure. The board flags it in red: “dB Schema!!!”.
  • Waiting. WhatsApp queues, and the receipt can take up to 3 days.
Fix on the live website first: (a) the calculator could not load rates on 10 Oct, so it shows 0; check from another network; (b) an expired promotion (“until 9 April”) is still shown, and “3 steps” lists four; (c) a secret value is visible in the site’s public code and should be changed.
Why a mobile-first web app, then an app

The business already lives on the phone

Next step: a web app built for the phone first and opened from a WhatsApp link; an Expo app later, once clients come back often.

Evidence from today’s operation
  • ~60 operations a day, mostly by chat (team estimate, not yet measured).
  • The website ends in “Enviar por WhatsApp”: the client leaves the site to finish.
  • Proof of payment is a phone screenshot: camera and gallery are already the upload step.
  • Short support hours (Mon–Fri 7–18, Sat 8–14, Sun 12–14): outside them, only self-service works.
  • WhatsApp reaches ~91% of Brazilian internet users aged 16–64 (GWI 2020 via Verint; dated, no Peru figure found).
Why web first, app second
  • No install: a link opens the quote in seconds.
  • One codebase fits the four-day MVP; the chat assistant and the form share one service.
  • The app earns its place with weekly use: push alerts, camera, biometric login. The repo root is already reserved for Expo.
Gap: “mainly WhatsApp” is not measured. The web app must count mobile sessions and completion per step from day one.
2 · Learning from a similar app

What Kambista does that we can borrow

Kambista is a Peruvian exchange app. I walked through an exchange on a real phone: everything happens inside the app, in three steps. Full walkthrough.

QuoteLive result and one button to start.
DataBank, destination account, source of funds.
Where to payCopy buttons and a currency warning.
StatusRegistered, verified, sent, received.
3 · The new flow

Who does what, and in which system

The whiteboard flow, drawn with its actors. Blue boxes are what we build, purple boxes are the AI chat assistant, the grey box is the Dashboard that stays as it is, and the dashed purple piece is optional AI (use the switch to hide it).

Show the original whiteboard
Above the red line: today. Below: the new flow. The photo is cropped at the top.
Clientey canales Asistente IA Nuestrosistema (nuevo) Personas Dashboardactual, sincambios Facturación(persona) Script Fact Serviciosfiscales Clientecotiza y llenadatos, paga ysube la foto WhatsAppchat con elasistente(esencial) Tasas de cambio · referencia API gratuita, 11 oct1 BRL = 0.689 PEN · 1 BRL = 0.200 USD1 USD = 5.01 BRL · 1 USD = 3.45 PENLa tasa Brasper se fija aparte y se guarda en la orden Clienterecibe el PDFpor correo A1 · Asistente de chat (IA)habla en WhatsApp y dentro de la Web Appllena los mismos datos que el formulariopasa a una persona si hace falta Web Appformulario o asistente integradorecibe datos y foto del voucher Base de datostablas orderse invoices VIEWpendientes y aprobadasla persona cambia el estado aquíy marca para exportar Bancodepósitos delcliente (consultamanual) Validadorrevisa el banco≈ 15 min y apruebaen la VIEW Operadormarca y exportael archivo deórdenes Dashboard actual (sin cambios)solo importa y exporta órdenes Facturaciónexporta delDashboard yimporta en Fact Fact · revisaformato, datos yduplicadosdel lote Fact · registracada venta antela autoridad yguarda el XML Fact · PDFcrea el PDFy lo envíapor correo ServiciosKeyFácil → SUNATOmni → fisco BR 1 2 3 4 5 6 7 8 PDF por correo A2 · Rechazosexplica el rechazoexperimental
PersonNew system (ours)Existing Dashboard, unchangedAI chat assistant (core)Optional AI
#WhoWhat happens
1ClientQuotes with the current exchange rate (e.g. 1 BRL = 0.689 PEN on the free API; Brasper sets its own), in one of three ways: the Web App form, a WhatsApp chat, or the assistant inside the Web App (the same assistant as on WhatsApp); or by talking to a human seller, as today (large or negotiated amounts). See What people see.
2ClientGives the source of funds, source account, operation number and destination account, pays, and sends the proof photo, by form or by chat. All three ways save the same data in the database, one record per sale (“IV”, Intención de Venta).
3ValidatorSees the pending operations in the VIEW, checks the bank (target about 15 minutes) and approves.
4OperatorMarks the approved operations in the VIEW and exports a file of orders.
5OperatorImports that file into the Dashboard. The Dashboard is not changed: it only imports and exports orders.
6Billing personExports the orders from the Dashboard and imports the file into Fact, which runs the whole set.
7FactRegisters each sale with the tax authority (SUNAT through KeyFácil, the Brazilian equivalent through Omni) and keeps the official XML. See Billing.
8FactBuilds the PDF from that XML and emails it to the client. The result goes back to the database and shows in the VIEW.

The validator, the operator and the billing person may be the same people; the team should confirm (see Questions).

4 · What people see

The client’s Web App and the team’s VIEW

Client: three new ways in, and the current human route

The first three save the same data in the same database, so the team always works from one VIEW. The chat is a core way in, with the AI assistant doing the talking. It is one assistant service behind both chat channels: the WhatsApp chat and the assistant inside the Web App run the same steps and save the same data, and only the channel differs. The assistant never approves anything: the validator does. The fourth is how it works today: a human seller attends the client and negotiates the rate before the operation is made. It keeps working as it is, and the assistant can hand a client over to it at any time.

1 · Web App form

1Cotiza
BrasPer ES · PT · EN
Tú envías500.00  BRL ▾
Destinatario recibe—  PEN ▾
Comisión—
Total a enviar—
Tasa de cambio1 BRL = — PEN
El tipo de cambio podría actualizarse a las 17:18
Continuar
🤖 Hablar con el asistente👤 Hablar con una persona

Same calculator as the site. The help buttons jump to the other ways in (tap them to see each flow).

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

The fields from the whiteboard: source of funds, source account, destination 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

Where to pay, with copy buttons and a reminder to use the right currency account.

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

The operation number and the proof photo go straight to the database.

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.

A simple timeline. The PDF receipt arrives by email.

2 · WhatsApp chat

3 · Assistant inside the app

1Choose
BrasPer ES · PT · EN
Tú envías500.00  BRL ▾
Destinatario recibe—  PEN ▾
Comisión—
Tasa de cambio1 BRL = — PEN
Continuar con el formulario
🤖 Hablar con el asistente
👤 Hablar con una persona

The calculator offers the form or the assistant. This is the same assistant and flow as the WhatsApp chat, in a different channel. Other ways in are one tap away.

2Quote
Asistente BrasPer ✕

The rate card always comes from the system, never from the assistant’s own words. “Hablar con una persona” is always there.

3Talk
Asistente BrasPer ✕
Tu operación
500 BRL → — PEN · Origen: Ahorros ✓
Destino: pendiente

One question at a time. The summary on top fills in as you answer.

4Review
Revisa tu operación 1 / 3
Origen de fondosAhorros
¿Desde qué banco envías?BCP
¿Dónde recibes?Banco •••9956
Datos completados con el asistente. Puedes editarlos.
Continuar a pagar

It ends on the same review screen as the form, then moves on to payment.

5Pay
Transfiere a BrasPer 2 / 3
TitularBrasPer
Monto{monto} BRL ⧉
Banco{banco}
Cuenta{cuenta} ⧉
Usa la cuenta de BRL. Tasa asegurada hasta las {hora}.
Ya transferí
🤖 ¿Dudas? Pregúntale al asistente

The assistant stays one tap away on every screen, with the operation as context.

6Proof
Asistente BrasPer ✕

The photo and number go to the database; the assistant does not judge the proof.

7Status
Asistente BrasPer ✕
  • Operación registrada{hora}
  • Verificando tu transferencia≈ 15 min
  • Enviamos tu dinero
  • Recibiste tu dinero
El estado viene de la base de datos, igual que en la línea de tiempo del formulario.

“Where is my order?” is answered from the database, so it matches the timeline in the form.

8Ask for a person
Asistente BrasPer ✕

Same hand-over as on WhatsApp. From here it is the current human flow, shown in 4 below.

4 · Human attention (current)

This flow already works in the business: a human seller attends the client and negotiates the exchange before it is made. It is how large or negotiated amounts get done today. Example: a client who wants to change 5,000 USD, a long queue and many messages.

Team: the VIEW

VIEW · OperacionesPendientes 1 En validación 1 Aprobadas 2 Exportadas 1
IDClienteEnvía → RecibeOrigen de fondosN° trans.FotoEstado
☐BR-0001Cliente ABRL → PENAhorros000001📎Pendiente
☐BR-0002Cliente BPEN → BRLVenta de bien000002📎En validación
☑BR-0003Cliente CUSD → BRLAhorros000003📎Aprobada
☑BR-0004Cliente DBRL → USDDonación000004📎Aprobada
☐BR-0005Cliente EBRL → PENAhorros000005📎Exportada
Cambiar estadoMarcar para exportar (2)Exportar archivo de órdenesVer facturas

The VIEW replaces searching through chats. The validator checks the photo and the bank and sets the status; the operator marks and exports; billing results appear here too. Sample rows are made up.

Exchange rates

Where the rates come from, and what “17:18” means

Two numbers: the Brasper rate is what the client pays and is set by the business; the market reference comes from a free API and is used to check it and as a fallback.

Free API (tested 11 Oct 2026)BRLPENUSDRefresh
open.er-api.com use
No key, CORS open, attribution required
✔✔✔Daily; gives last and next update time
fawazahmed0 currency-api backup✔✔✔Daily
Frankfurter no✔✘✔No PEN, so it cannot serve the main route
The “17:18” message

A daily API cannot give an intraday time, so the time comes from Brasper’s own rate refresh (a server cache, not a table): next refresh = last refresh + interval.

Tasa de cambio1 BRL = 0.658 PEN
El tipo de cambio podría actualizarse a las 17:18

The rate pressed at “Continuar” is frozen in the order (rate). If no rate loads, show “Tasa no disponible, habla con una persona”, never 0. Show Lima time (UTC-5).

Live check from this page
1 BRL in PEN…
1 BRL in USD…
Source updated…

Loading from open.er-api.com…

Data model · two tables

One table for orders, one for the Fact script

The team’s board (Operaciones > Contabilidad) is already one row per order. The MVP keeps only what is needed to validate, bill and send the PDF. Everything else (discounts, second proof, channel, rate history) waits.

orders VIEW and Web App

FieldWhy
order_id PK, uniqueIdentity of the order everywhere
created_at (UTC)Order and invoice date
statuspending, approved, exported
client_name, doc_type, doc_number, emailInvoice client and PDF delivery
destination_accountBank + currency, e.g. “Nubank (BRL)”
send_amount, send_currencyWhat the client pays
receive_amount, receive_currencyWhat arrives
rateRate frozen at quote (e.g. 1.425, 0.66)
commission, taxTaxable value and 18% tax (board: comisión, impuesto). Total = commission + tax
funds_source, operation_noCompliance data the client gives
payment_proof_urlThe validator’s evidence
validated_by, validated_atWho approved and when

invoices written only by Fact

FieldWhy
order_id PK, unique, = orders.order_idIdempotency: one invoice per order, ever
series, number unique togethere.g. B001-00000003, no repeats
statusreserved, sent, accepted, rejected
provider_messageWhy a rejection happened
xml_url, pdf_urlOfficial XML and the PDF built from it
emailed_atProves the PDF was sent
Idempotent by design: Fact looks up order_id before doing anything. No row: reserve a number and send. accepted: skip. sent: ask the provider for the result, do not send again. rejected: retry only after a fix. Re-importing the same file, or running it twice, never makes a second invoice.

Left out on purpose: issuer (derived from the send currency: PEN → INGENITECH S.A.C. in S/, BRL → Brasper 21 in R$), document type and environment (Fact settings), IGV rate (18% setting), discount % (already inside the commission), second proof and channel.

Found in the board and invoice screenshots: invoice numbers B001-00000001 and -02 repeat (hence the unique key); Brazilian rows also show an 18% tax and a SUNAT number; the invoice panel shows two times for one event (12:26 p. m. issued, 07:26 a. m. in the history), so store UTC and show Lima; two rows are one cent off from rounding.
5 · Billing script (Fact)

From imported orders to a PDF in the client’s inbox

A person imports a set of orders into Fact. For each order, Fact registers the sale with the tax authority, saves the official XML it gets back, builds the PDF from that XML and emails it. This replaces today’s manual billing steps: re-check, register, consolidate, email.

Personaexporta del Dashboarde importa en Fact 1 · Revisar loteformato, datos yduplicados 2 · Registrar la ventaPerú: KeyFácil → SUNATdevuelve el XML firmado 2 · Registrar la ventaBrasil: Omni → fisco BRdevuelve el XML autorizado 3 · Guardar el XMLcomprobante oficialno se modifica 4 · Crear el PDFa partir de ese XMLcon QR y datos 5 · EnviarPDF por correoal cliente 6 · Reportarresultado por ordenen la VIEW orden inválida→ queda fuera(las demás siguen) rechazo de la autoridad→ corregir y reenviar servicio caído o lento→ reintenta y consultaantes de reenviar PDF ≠ XML→ no se envía correo rebotado→ aviso al equipo Entrada: órdenes ya aprobadas por una persona rojo = camino de error, orden por orden
#StepIn plain words
1Check the batchFact reads the file and checks each order: ID number format, email, amounts that add up, not already invoiced. A bad order is set aside and the rest continue. Importing the same file twice is safe.
2Register the saleFor each order Fact asks the invoicing service to register it: KeyFácil for Peru→Brazil (which reports to SUNAT) and Omni for Brazil→Peru (which reports to the Brazilian tax authority). The answer is accepted or rejected, and the service sends back an XML, the official electronic record.
3Save the XMLStored exactly as received and never edited.
4Create the PDFBuilt from that XML, so it always shows what was registered. Fact compares the totals before saving it.
5SendEmailed to the client only after the tax authority has accepted the sale.
6ReportThe result of every order (invoice number or error) is saved and shown in the VIEW, and the daily consolidated file is produced. The Dashboard is not involved.

What Fact receives for each order

One orders row per order, exactly the fields of the first table, plus fixed settings (issuer by currency, 18% tax, document type). That is the whole input. Modeled on the boleta detail the team uses today (B001-00000003, provider APISUNAT):

{
  "order_id": "BR-0003",                       // unique, idempotency key
  "created_at": "2026-10-10T17:26:00Z",        // UTC; shown in Lima time
  "client": { "name": "MICHAEL CHECASACA MUÑOZ", "doc_type": "DNI",
              "doc_number": "48602704", "email": "client@example.com" },
  "commission": 11.98, "tax": 2.16,            // total 14.14 = 11.98 + 2.16
  "send_currency": "PEN"                       // → issuer INGENITECH S.A.C., S/
}

Fact checks total = commission + tax before sending, and writes back one invoices row. The screenshot names the provider APISUNAT while the diagram says KeyFácil: confirm which one Peru uses.

If something goes wrong

CaseWhat happens
The order data is invalidIt is set aside and listed in the report. A person fixes it at the source (VIEW or database) and exports it again.
The tax authority rejects itIt is marked with the reason, with no automatic retry. A person corrects the data and resubmits.
The service is down or slowFact retries. Before resending it asks the service whether the first attempt went through, so a sale is never registered twice.
The email bouncesThe team is alerted and the PDF stays available in the VIEW.
Why the PDF comes from the XML
  • Peru: the signed XML is what SUNAT receives. The printed version must show a QR code and a hash, with the minimum content set by SUNAT (Res. 340-2017; I did not verify the exact field list).
  • Brazil: the authorized XML is the only fiscal document. The PDF (DANFSe) has no fiscal validity (overview).
What each order must carry

Operation ID, direction (PE→BR or BR→PE), document type, the client’s ID type and number (DNI, RUC, CE, passport, CPF or CNPJ), name, email, a description and amount, and the tax code. The accountant defines which amount is billed and every tax field; Fact checks and sends them, it does not decide tax treatment.

Checks are plain rules; AI comes after, and only as the optional A2. Run everything on the services’ test mode first. On the rule that the PDF goes out only after acceptance, a Sovos summary says SUNAT advises against delivering a receipt before validation (Sovos Peru); confirm it with the accountant.
6 · AI in the flow

The chat assistant, and one optional extra

The chat assistant is part of the core flow. The rejection explainer is optional and experimental. I kept only AI that similar companies already use, and a person always decides: AI never approves a payment or changes tax data. Most sources are company write-ups, so their claims are unaudited.

What it doesSeen in similar companiesLimits
A1Chat assistant (core). One service, two channels: talks with the client on WhatsApp and inside the Web App with the same steps, asks one question at a time, fills in the same data as the form, collects the proof photo and operation number, answers “where is my order?”, and hands over to a person when asked or when unsure.Félix Pago sends remittances through a WhatsApp chatbot (Stripe case study). Rextie, a Peruvian exchange house, has a chatbot, “Lucía” (Andina, undated).Automating WhatsApp needs the official WhatsApp business service; the site only opens a plain chat link today. Rates, fees and account numbers always come from the system, never from the assistant’s own words.
A2Rejection explainer (in Fact, optional). Says in plain words why the tax authority rejected an order and what to check.None found: experimental. The problem is real: some Brazilian rejections are generic, for example code E8214 (Omie help).Build it only if real rejections show it is needed. It never edits tax data.

Left out because I found no similar company using them: reading voucher photos automatically, a triage assistant for exceptions, asking the database questions in plain language, and a custom fraud model.

7 · First release

What we can ship in four days

The normal path only: an operation from quote to PDF receipt. Special cases and AI come later.

In the MVP
  • Web App: quote, data, pay, upload proof, status.
  • A database that keeps everything: clients and accounts, quotes, operations, proof photos, who validated and when, billing batches and invoices.
  • The chat assistant: one service on WhatsApp and inside the Web App (same flow in both), for quote, data, proof and status, saving the same data as the form. Until the official WhatsApp account is ready, use a test number or Telegram.
  • The VIEW: see the photo, set the status, mark and export orders.
  • The Dashboard imports that file as today, with no change.
  • Fact: imports the set, registers each sale in test mode, saves the XML, builds the PDF and emails it.
  • Basics: staff login, private storage for photos, no secrets in public code.
Not in the MVP
  • The optional rejection explainer (A2).
  • Special cases: partial payments, payments made by someone else, wrong currency, refunds.
  • More channels beyond WhatsApp (and Telegram as a fallback), rate tiers and coupons.

Suggested four-day path proposal

Day 1 · Agree and start

  • Confirm what the database keeps
  • Get a sample Dashboard file, test access to KeyFácil and Omni, and a WhatsApp number
  • Start the Web App screens

Day 2 · Database and VIEW

  • Save operations
  • Build the VIEW: status, mark, export
  • Start the chat assistant: quote and data

Day 3 · Fact

  • Read the file, register in test mode
  • Save the XML, build the PDF, email it
  • Assistant: proof and status

Day 4 · Test and demo

  • Run sample orders from start to end
  • Fix, then prepare the demo

Needed before Day 1

How we will know it works

MeasureTodayTarget
Time to receiptUp to 3 days20 minutes from confirmation
TypingSame data typed twiceTyped once, by the client
Payment checksBy eye from chat screenshots, no recordA person checks the bank in the VIEW, with a record of who and when
People involved7About 3 (the team’s estimate; to re-estimate because validation stays with a person)
8 · To confirm

Questions that block or shape the MVP

  1. What file format does the Dashboard import and export (type and columns)? A sample would settle it.
  2. Do KeyFácil and Omni offer an API and test access? Who at Brasper can request the keys? Do they return the signed XML (and, in Peru, the receipt confirmation)?
  3. Which document does Omni issue in Brazil (national NFS-e, municipal, or NF-e)? What exactly is billed, the commission or the full amount, and which document type applies on each route? (The accountant.)
  4. Who validates payments, who operates the VIEW, and who exports from the Dashboard and imports into Fact? Are they the same people? Who validates outside business hours (Mon–Fri 7–18, Sat 8–14, Sun 12–14)?
  5. Does Brasper already have an official WhatsApp Business account, and who can set it up? Does the client need a login in the Web App, or just a link?
  6. Are the 7 people and ~60 operations a day measured or estimated?
  7. Is the rates service the same one that failed on 10 Oct? Who sets the Brasper rate and the commission/variable discount (see Rates), and how often?
  8. Which tax applies to the Brazilian rows? The board shows the same 18% “impuesto” in R$ as in S/ (see Data model).
  9. Which SUNAT document type goes to clients with a CPF (no DNI/CE/RUC)? (The accountant.)
  10. Is the optional rejection explainer (A2) needed at all, once real rejections from the test mode are known?

Still unclear on the whiteboard: the “e” in the script box, the red circle at the end of its line, the first letters of the Dashboard label (“DAP”), and “<Expo>”. I read “IV” as Intención de Venta and “eje” as the central hub.