Un libro de cuentas — over WhatsApp

CuentasClaras

“Cuentas claras, amistades largas.”

Clear accounts, long friendships. A proportional expense ledger, run entirely by texting a phone number — no app to install, no forms to fill in. Income doesn't have to split 50/50: the ledger divides costs however you configure it, and adjusts automatically when the numbers change.

Checking system status… live —
240+automated tests
0build warnings allowed
<$1AI cost / month
2FAby WhatsApp code

Talk to it like a person

01 — In use

No categories to select, no amount fields to tap through. A message in plain Spanish or English is enough — the split, the split rule, and the confirmation come back the same way.

WhatsApp — CuentasClaras
You gasté 350 pesos en el súper, los dos
CuentasClaras Listo ✅ 350.00 MXN registrado (a3f4). Escribe 'undo a3f4' para deshacerlo.
You la renta subió a 20000, recuérdame el 15 a las 3pm
CuentasClaras Recordatorio configurado: renta $20,000.00 MXN, el día 15 a las 15:00. Le toca a Alex: $12,000.00, a Sam: $8,000.00.
You tacos 200 los dos, uber 85 solo yo, café 60 solo yo
CuentasClaras ¿Confirmas estos 3 gastos?
1. tacos $200.00
2. uber $85.00
3. café $60.00
Responde sí/no.
You sí
CuentasClaras Listo ✅ 3 gastos registrados: tacos $200.00 (b4a1) · uber $85.00 (c92e) · café $60.00 (f03d)

What's in the ledger

02 — Features
01

Natural-language capture

Spanish and English, understood by Claude and mapped to a structured record — the model never sees or touches a balance, it only extracts.

02

Batch capture, confirmed before it's written

List several expenses in one message — a whole receipt, a backlog from your own notes — and get the parsed list echoed back first. Nothing is written until you reply sí; one ambiguous item holds the whole batch rather than guessing at it.

03

Proportional splitting

Shared costs divide by income ratio, not evenly — recalculated automatically as a raise takes effect from the next cycle, never rewriting the past.

04

Spending goals, with rollover

Cap discretionary spending in a bucket you describe in plain language — "outings: restaurants, bars, movies." Every entry is classified against that description fresh, every time, so editing it reclassifies your whole history on the next read. Some goals reset each period; others bank unused cap forward for a bigger purchase later.

05

Daily digest

Each partner gets a same-day summary of what the other logged — visibility without a notification for every single purchase.

06

AI-coached weekly check-in

A once-a-week, goal-focused message — congratulating a comfortable week, or naming a real pattern when a goal's at or over cap, referencing an actual streak ("3 weeks running under budget"). Never an invented one: commentary is grounded only in that week's real entries.

07

Monthly statements

An xlsx and a PDF, generated and delivered as a WhatsApp document, every month, automatically.

08

Recurring payments

Rent, a car payment — adjust the amount by chat, get reminded on a day and hour you set, with the split computed fresh each time.

09

On-demand status — no AI required

Ask "cómo voy" any time and get today's activity, total, and balance back instantly — answered entirely from the ledger itself, so it keeps working even if the model or its rate limit is unavailable.

10

Reversals, not deletions

Every correction is a new row that voids the old one. Nothing is ever edited or removed — the history stays complete and auditable.

11

Admin dashboard

A browser-side panel for income history, assets, spending goals, and the full ledger — for the occasional, sit-down administrative moment chat isn't built for.

Guarded like it matters

03 — Security

This is household income data, reachable from the open internet. It's treated that way.

§

Two-factor by WhatsApp

A password alone isn't enough — a one-time code goes to the phone of whoever is signing in, and only that phone.

§

Constant-time comparison

Password checks run in fixed time, hash-to-hash, closed against timing attacks.

§

Per-IP rate limiting

Five login attempts, fifteen minutes, partitioned per client — one person's mistakes can't lock the other out.

§

Signed webhooks

Every inbound message is HMAC-SHA256 verified against the raw body before anything else runs.

§

A closed guest list

Two allowlisted phone numbers. Anyone else's message is logged and dropped — it never reaches the model.

§

Refuses rather than guesses

An uncovered date, an orphaned reversal, a missing income period — all fail loudly instead of assuming.

Built with

04 — Stack
Domain & API
C# / .NET 8 ASP.NET Core Minimal APIs EF Core PostgreSQL
Intelligence & messaging
Claude Haiku 4.5 Microsoft.Extensions.AI WhatsApp Business Platform
Web
React TypeScript Vite
Reporting & infra
ClosedXML QuestPDF Docker Compose Caddy Oracle Cloud (ARM)

The books balance

05 — Engineering
240+ tests across five projects — xUnit, real Postgres via Testcontainers
0 warnings tolerated — TreatWarningsAsErrors, no exceptions
0 packages in the domain layer — the balance math trusts nothing else
6 forced-choice tools — one structured reply per message, never free text
3 firewall layers hardened by hand — iptables, VCN, source-port routing
$0 infrastructure cost — Oracle's Always Free ARM tier
1 person, end to end — extraction prompts to network hardening

A real service, not a demo.

06 — Availability

This isn't a prototype sitting in a repo — it's running right now (the status line at the top of this page is checking live, this instant), handling real household income for real people, every day. Built, deployed, and operated end to end by one engineer. I take on a small number of builds like this one for other households — if that's you, this is what you'd get.

§

Configurable, not fixed

Proportional, equal, personal, or one-sided splits, chosen per expense. Income ratios update from a form, take effect on the next cycle, and never rewrite the past.

§

I build and run it — you just use it

Deployment, monitoring, security hardening, and every future feature are mine to own. You get a phone number to text and a dashboard to check, nothing to maintain.