Inspiration
We built BunqTally to solve a common social pain: one person pays, everyone says “I’ll send it later,” and settlement becomes fragmented across chats and reminders. We wanted to make bill-splitting feel immediate, fair, and low-friction.
Our second inspiration was utility beyond one payment moment. Instead of only answering “who owes what,” we wanted BunqTally to also answer “how are we spending over time?”
What it does
BunqTally turns a receipt into a complete settlement workflow:
- Scans receipts and extracts line items automatically.
- Splits each item across friends, including weighted/partial quantity splits.
- Generates payment requests and tracks paid/pending status.
- Sends WhatsApp reminders with payment context.
- Provides AI spending insights:
- category breakdown,
- month-over-month movement,
- budget warnings,
- short narrative coaching.
For weighted splits, each contact pays:
share(i,j) = (weight of contact j on item i / total weight on item i) * item total
Where:
- item total = unit price * quantity
- i = receipt item
- j = contact
Example: if an item total is €12 and weights are 2 and 4, shares are €4 and €8.
How we built it
We implemented BunqTally as a full-stack application:
- Backend: Laravel API (controllers, services, Eloquent models, migrations)
- Frontend: React + TypeScript + Vite + Tailwind CSS
- Database: SQLite for rapid iteration
- Integrations: bunq API (payments), OpenWA (WhatsApp), Anthropic Claude (receipt parsing + insights)
Engineering decisions that mattered:
- Flexible allocation model
We used per-item allocation rows with aweightfield, so equal and partial splits share one consistent math model. - Backward-compatible API migration
We introduced weighted payloads while temporarily supporting legacycontact_ids. - Reliability-first UX
Added strong validation, clearer error states, and deterministic fallback paths for demo and real use.
Challenges we ran into
- External dependency reliability (AI credits, session state, upstream errors).
- OpenWA connectivity/session readiness and deployment complexity.
- Environment drift (multiple local ports/processes causing mismatched behavior).
- Cross-shell differences (PowerShell vs Bash syntax and command chaining).
- Migrating split logic from toggle-based assignment to weighted allocations without breaking existing flows.
Accomplishments that we're proud of
- End-to-end experience from receipt scan to settlement and reminders.
- True weighted partial-quantity splitting.
- Real-time payment status visibility in the UI.
- AI Spending Coach that adds value after settlement.
- Improved reliability through validation, error clarity, and safer rollout patterns.
What we learned
- Reliability and observability are product features, not just engineering concerns.
- Small UX reliability improvements dramatically increase user trust.
- Data model choices made early can unlock advanced features quickly.
- Integrations require explicit health/status checks and graceful degradation.
- Hackathon speed works best when paired with strict scope and robust fallbacks.
What's next for BunqTally
- Production hardening (secrets, monitoring, retries, alerting).
- Better debt-netting and group settlement optimization.
- Price intelligence across merchants for recurring items.
- Smarter reminder automation and follow-up logic.
- Expanded analytics and personalized budget coaching.
- CI/test coverage expansion and public deployment for user feedback.
Built With
- anthropic
- bunq
- css
- html
- javascript
- laravel
- openwa
- php
- react
- sqlite
- tailwind
- typescript
- vite
Log in or sign up for Devpost to join the conversation.