Primeros pasos con la CLI de BananaSplit: automatiza el registro y la división de gastos con agentes de IA

Instala la CLI, añade la skill y pídele a tu agente que divida la cena de anoche. Después ve más allá: deja que convierta los recibos de tu bandeja de entrada en gastos de BananaSplit cada semana.

Ordenador retro con automate escrito en una terminal, junto a recibos y una cartera de BananaSplit

La mayoría de los gastos no necesitan una decisión. Necesitan que alguien los escriba. Una cena con el equipo, la factura mensual del hosting, el pedido de Amazon que dividiste con tu compañero de piso: ya sabes quién pagó y cómo dividirlo. Escribirlo es la parte pesada.

La CLI de BananaSplit le pasa esa parte a tu agente de IA. Dices lo que pasó con tus propias palabras y el agente lo registra en BananaSplit. Da un paso más y el agente ni siquiera necesita que se lo pidas: lee los recibos de tu bandeja de entrada y los añade de forma programada.

Esta guía te lleva de cero a las dos cosas.

1. Instala la CLI de BananaSplit

En macOS o Linux:

curl -fsSL https://github.com/teotti/banana-cli/releases/latest/download/install.sh | sh

En Windows (PowerShell):

irm https://github.com/teotti/banana-cli/releases/latest/download/install.ps1 | iex

¿Prefieres un gestor de paquetes? npm install -g @bananasplitapp/cli o bun install -g @bananasplitapp/cli también funcionan.

Después inicia sesión. Esto abre el navegador, y la CLI guarda el inicio de sesión de forma segura en tu ordenador:

banana login

Comprueba que todo está en su sitio:

banana doctor
banana balance

Si banana balance muestra tu saldo, la CLI está lista.

2. Abre tu agente

Cualquier agente que pueda ejecutar comandos en la terminal sirve: Claude Code, Codex, Cursor, Gemini CLI, OpenCode. En esta guía usamos Claude Code.

claude

3. Pídele a tu agente que instale la skill banana

La skill le enseña a tu agente cómo funciona la CLI: qué comandos existen, cómo cuadran las divisiones, cómo nombrar grupos y amigos, y cuándo preguntar antes de cambiar algo. No necesitas buscar nada de esto. Solo pídelo:

Instala la skill de BananaSplit para Claude Code con banana skill install --agent claude.

Cuando termine, abre una sesión nueva (sal y ejecuta claude otra vez) para que el agente cargue la skill.

¿Prefieres hacerlo tú? Ejecuta esto en la terminal:

banana skill install

Sin --agent, encuentra todos los agentes que tienes instalados y escribe la skill para cada uno. También puedes instalarla con npx skills add teotti/banana-cli --skill banana --global.

4. Añade tu primer gasto pidiéndolo

Ahora solo di lo que pasó:

Añade la cena de anoche en Wendy's con Leo, 40 €

Y ya está. El agente registra el gasto, lo divide y te cuenta lo que hizo. Leo lo ve en BananaSplit al momento.

Más cosas que puedes pedir:

  • "¿Quién me debe dinero, y cuánto?"
  • "Muestra los últimos 10 gastos de Viaje a Lisboa."
  • "Leo me devolvió 20 €, regístralo."
  • "Añade el alquiler, 1800 €, cada día 1 del mes, dividido con Leo."

Qué pasa por detrás

El agente busca a Leo entre tus amigos, calcula la división y ejecuta un solo comando:

banana expenses add --title "Cena en Wendy's" --amount 40 --currency EUR \
  --date 2026-10-27 --split me=20 --split Leo=20

Para una cena de grupo, usa --group. Con --group y sin división, el gasto se divide a partes iguales entre todas las personas del grupo:

banana expenses add --title "Cena de equipo en Rosetta" --amount 239 --currency EUR \
  --date 2026-10-27 --group "Equipo"

Nunca tienes que escribir estos comandos, pero puedes. Son los mismos comandos que escribirías tú, así que siempre puedes leer lo que hizo el agente, o saltarte el agente y ejecutarlos directamente. banana expenses add --help muestra todas las opciones.

5. Deja que tu bandeja de entrada alimente BananaSplit

Pedirlo es rápido. No tener que pedirlo es más rápido aún.

Muchos gastos ya llegan por correo: pedidos de Amazon, facturas de hosting, recibos de la luz, extractos de peajes. Dale a tu agente acceso a tu bandeja de entrada y convertirá esos correos en gastos por ti.

Nosotros usamos HEY, que tiene su propia CLI, así que el agente puede buscar correos y leer recibos desde la terminal. Gmail y Outlook funcionan igual a través de sus servidores MCP o sus APIs.

En una sesión que tenga las skills de HEY y de BananaSplit, prueba:

Busca correos de pedidos de Amazon de la última semana y añade cada uno a BananaSplit como gasto personal. Usa --notify-me.

El flag --notify-me es lo importante. Normalmente no recibes notificación de un gasto que has añadido tú. Con --notify-me, BananaSplit te envía igualmente la notificación de "gasto creado", así que cada gasto automático te da un toque y puedes echarle un vistazo en el móvil:

banana expenses add --title "Amazon: USB-C hub" --amount 34.99 --currency USD \
  --date 2026-10-24 --split me=34.99 --notify-me

6. Conviértelo en una tarea que se ejecuta cada semana

Hacerlo a mano una vez por semana sigue siendo una tarea pesada. Así que el siguiente paso es pedirle al agente que lo escriba como un pequeño script y lo programe. Algo así:

Escribe un script que busque en HEY recibos de Amazon y de nuestro proveedor de hosting de los últimos 10 días y añada cada uno a BananaSplit con --notify-me. No añadas nunca el mismo recibo dos veces. Guarda en un log lo que hace. Después prográmalo para que se ejecute todos los lunes a las 10:00.

Así se hizo mi propio importador. Se ejecuta todos los lunes y su log se ve así:

2026-10-19 10:00:01 signed in to HEY as [email protected]
2026-10-19 10:00:07 signed in to BananaSplit as Diogo ([email protected])
2026-10-19 10:00:08 [amazon] 1 email(s) in HEY from the last 10 days, 0 new
2026-10-19 10:00:08 [amazon] Your Amazon.com order of "USB-C hub": already handled in an earlier run
2026-10-19 10:00:08 [hosting] no emails in HEY from the last 10 days
2026-10-19 10:00:08 done: 0 added, 1 already in BananaSplit
2026-10-26 10:00:01 signed in to HEY as [email protected]
2026-10-26 10:00:07 signed in to BananaSplit as Diogo ([email protected])
2026-10-26 10:00:07 [amazon] no emails in HEY from the last 10 days
2026-10-26 10:00:08 [hosting] 1 email(s) in HEY from the last 10 days, 1 new
2026-10-26 10:00:12 [hosting] ADDED Hosting 29.00 USD 2026-10-25 [Side project] (receipt #2291-4410)
2026-10-26 10:00:12 done: 1 added, 0 already in BananaSplit

El script

Aquí tienes una versión reducida que puedes copiar y adaptar. Hace tres cosas: busca en la bandeja de entrada, lee el importe de cada recibo y lo añade a BananaSplit. Las dos CLIs devuelven JSON con --json, lo que las hace fáciles de usar en scripts.

#!/usr/bin/env python3
"""Weekly job: receipts in HEY -> expenses in BananaSplit."""
import json, os, re, subprocess
from datetime import datetime

STATE = os.path.expanduser("~/.local/state/receipts-to-banana.json")
FOOTER = "\n\n🤖 automated"  # marks expenses this job created


def cli(*args):
    out = subprocess.run([*args, "--json"], capture_output=True, text=True).stdout
    return json.loads(out)


def log(msg):
    print(f"{datetime.now():%Y-%m-%d %H:%M:%S} {msg}", flush=True)


# One entry per kind of receipt: what to search for and where it goes.
SOURCES = [
    dict(name="amazon", query="Your Amazon.com order",
         amount_re=r"Order Total:\s*\$([\d,]+\.\d{2})", group=None),
    dict(name="hosting", query="Your receipt from",
         amount_re=r"Amount paid\s*\$([\d,]+\.\d{2})", group="Side project"),
]


def main():
    handled = set(json.load(open(STATE))) if os.path.exists(STATE) else set()
    for src in SOURCES:
        emails = cli("hey", "search", src["query"], "--date", "last_7_days").get("data", [])
        log(f"[{src['name']}] {len(emails)} email(s) in HEY")
        for email in emails:
            topic = str(email["topic_id"])
            if topic in handled:
                continue
            thread = cli("hey", "thread", "read", topic).get("data", [])
            body = "\n".join(entry.get("body") or "" for entry in thread)
            match = re.search(src["amount_re"], body)
            if not match:
                log(f"[{src['name']}] could not read an amount from {email['subject']}")
                continue
            amount = match.group(1).replace(",", "")
            args = ["banana", "expenses", "add",
                    "--title", email["subject"][:80],
                    "--amount", amount, "--currency", "USD",
                    "--date", email["updated_at"][:10],
                    "--description", f"From: {email['subject']}{FOOTER}",
                    "--notify-me"]
            args += ["--group", src["group"]] if src["group"] else ["--split", f"me={amount}"]
            cli(*args)
            handled.add(topic)
            log(f"[{src['name']}] ADDED {email['subject']} {amount} USD")
    os.makedirs(os.path.dirname(STATE), exist_ok=True)
    json.dump(sorted(handled), open(STATE, "w"))


if __name__ == "__main__":
    main()

Algunas cosas que vale la pena mantener, sean cuales sean tus fuentes:

  • Nunca añadas dos veces. Recuerda qué correos ya procesaste. Mi importador real también comprueba en BananaSplit si ya existe un gasto igual antes de añadirlo, por si un recibo llega dos veces.
  • Marca lo automático. Todas las descripciones terminan con 🤖 automated, para distinguir estos gastos de los que escribiste tú.
  • Usa --notify-me. Recibes una notificación por cada gasto nuevo, que es tu oportunidad de detectar un importe equivocado.
  • Pruébalo antes de que vaya en serio. Pídele al agente un flag --dry-run que muestre lo que se añadiría sin cambiar nada.
  • Respeta el límite de peticiones. La API de BananaSplit permite 20 peticiones por minuto, así que haz una pausa de unos segundos entre llamadas cuando una ejecución añada muchos gastos.

Prográmalo

En macOS, una tarea de launchd ejecuta el script todos los lunes a las 10:00 y se pone al día si tu Mac estaba en reposo. Guarda esto como ~/Library/LaunchAgents/net.bananasplit.receipts.plist, con tus propias rutas:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>net.bananasplit.receipts</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/bin/python3</string>
    <string>/Users/you/jobs/receipts-to-banana.py</string>
  </array>
  <key>EnvironmentVariables</key>
  <dict>
    <key>PATH</key><string>/Users/you/.local/bin:/opt/homebrew/bin:/usr/bin:/bin</string>
  </dict>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Weekday</key><integer>1</integer>
    <key>Hour</key><integer>10</integer>
    <key>Minute</key><integer>0</integer>
  </dict>
  <key>StandardOutPath</key><string>/Users/you/Library/Logs/receipts-to-banana.log</string>
  <key>StandardErrorPath</key><string>/Users/you/Library/Logs/receipts-to-banana.log</string>
</dict>
</plist>

Cárgalo una vez:

launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/net.bananasplit.receipts.plist

En Linux, una línea en crontab -e hace lo mismo:

0 10 * * 1 /usr/bin/python3 $HOME/jobs/receipts-to-banana.py >> $HOME/receipts-to-banana.log 2>&1

Para añadir un nuevo tipo de recibo más adelante, no editas el script tú. Abre el agente en la carpeta de la tarea y dile "importa también mi factura de la luz". Añade una entrada a SOURCES, hace un dry run y te enseña el resultado.

Dale algo de color al log

Un log plano cumple, pero lo leerás más a menudo si es fácil de recorrer. Pídele a tu agente:

Escribe un pequeño script en awk que dé color al log: horas en gris, inicios de sesión en azul, errores en rojo, "done" en verde, gastos añadidos en negrita, recibos omitidos en gris, HEY en morado y BananaSplit en amarillo.

Escribe algo como este colorize.awk:

# Colors importer log lines: awk -f colorize.awk
BEGIN {
  e = "\033["; reset = e "0m"; bold = e "1m"; gray = e "90m"
  red = e "31m"; green = e "32m"; yellow = e "33m"; blue = e "34m"; purple = e "35m"
}
{
  if ($0 !~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] /) { print; fflush(); next }
  ts = substr($0, 1, 19); rest = substr($0, 21)
  if      (rest ~ /ERROR|FATAL|not logged in|^done with/) c = red
  else if (rest ~ /^signed in/)                         c = blue
  else if (rest ~ /^done/)                              c = green
  else if (rest ~ /ADDED/)                              c = bold
  else if (rest ~ /already|nothing to add|dry run|no emails/) c = gray
  else                                                  c = ""
  gsub(/HEY/, purple "HEY" reset c, rest)
  gsub(/BananaSplit/, yellow "BananaSplit" reset c, rest)
  printf "%s%s%s %s%s%s\n", gray, ts, reset, c, rest, reset
  fflush()
}

El archivo de log sigue siendo texto plano. Los colores solo se añaden cuando lo lees:

tail -f ~/Library/Logs/receipts-to-banana.log | awk -f colorize.awk

Ahora una ejecución fallida salta a la vista en rojo, y un gasto nuevo destaca en negrita entre las líneas grises de "nada nuevo".

Lo que ganas

Cuenta los gastos que escribiste el mes pasado. Para la mayoría de la gente son entre 15 y 40, a un minuto cada uno más o menos si cuentas abrir la app, encontrar el grupo y revisar la división. Es entre media hora y una hora al mes, todos los meses, en un trabajo que no requiere pensar.

Con la CLI y una skill, los gastos puntuales se convierten en una frase para tu agente. Con una tarea semanal, los recurrentes dejan de necesitarte: aparecen en BananaSplit, ya divididos, con una notificación en el móvil. Sigues viéndolo todo. Solo que no lo escribes.

Instala la CLI, pídele a tu agente que instale la skill y pídele que añada lo último que pagaste. Todo lo demás está en la página BananaSplit para agentes de IA y en la documentación.

El newsletter de BananaSplit

Notas del producto, novedades del lanzamiento, posts del blog e ideas sobre plata compartida de quienes están armando BananaSplit.

Al suscribirte, aceptas nuestros Términos y nuestra Política de Privacidad.