Case studies · Oct 26, 2026 · 11 min read
Leaderbrock Sports is a sports marketing agency from Valencia with a sales team spread across Europe and America. We built the app that team works with: the agenda, the day's route and expenses from a photo of the receipt, and the web panel from which the office plans, supervises and approves. We built all of it, the backend, the web and the app, from a clickable demo in May 2026 to the release of 26 October 2026.
Before the app, the team planned its week in a shared spreadsheet, kept its receipts in an envelope and wrote them down by hand, and nobody in the office knew where each rep was on a trip. The app replaces those three processes, and each role sees its own part of them.
As in Boathous, the backend is reactive Java. The web and the app share one API client and one domain package, so a rule such as how an amount is formatted or which role can open which screen is written once and holds on both.
The field app and the office panel talk to one Spring Boot backend, which stores data in PostgreSQL, keeps receipts encrypted in S3-compatible storage, sends receipts to the AI to be read and sends push and email notices.
| Part | Technology | Why |
|---|---|---|
| Backend | Java 25, Spring Boot 4.1 with WebFlux, PostgreSQL through R2DBC, Flyway | Reactive end to end: the live map, notifications and receipt reading share one service |
| Office panel | React 19, Vite 8, Tailwind 4, FullCalendar, MapLibre | Planning, expense review and the team's map on a large screen |
| App | Expo SDK 57, React Native 0.85, Expo Router | One codebase for iPhone and Android, with camera, background GPS, Face ID and push |
| Shared code | A Bun monorepo: API client, domain, stores and design tokens | The logic of both apps lives in one place and is tested once |
| AI | Spring AI with Anthropic or OpenAI | Reading receipts and an assistant; the provider is a setting, not a rewrite |
| Files | S3-compatible storage, encrypted by the application | Receipts and photos only come out through an authenticated endpoint |
| Notifications | FCM, Resend and WebSocket | Push, email and in-app messages with one contract |
Backend and web run as Docker images on one server, with a staging copy next to production. A deploy goes to staging first, and the previous version is not retired until the new one reports healthy. iPhones install the app through TestFlight and Android phones download an APK the admin publishes from the panel; at startup the app asks whether there is a newer version and whether updating is mandatory. An internal app does not need a public store.
A rep pays for lunch with a client, takes a photo of the receipt and moves on. The app has its own camera with a framing guide and flash, and also takes a photo from the gallery or a PDF from Files: JPEG, PNG, WebP, HEIC or PDF, up to 15 MB.
An expense goes through four states: draft, pending, approved or rejected. Finance and admins review the whole organisation. Each verdict reaches the rep by push, by email and inside the app, and is written to an audit trail.
The agenda looks like Google Calendar on purpose: it is what the team already knew. Every event takes the colour of its owner's country, the same on the web and on the phone. A rep sees the agenda of their country and the meetings they are invited to; the other roles see the whole organisation.
A rep starts the day's route with one button. It ends on its own after eight hours at most and can be started again. Admins and finance see the whole team on a live map over WebSocket, a manager only their part of the org chart, and anyone without a signal for more than five minutes is marked as out of touch.
A noisy GPS fix is not a trip. We keep it, but we do not draw it.
Positions are deleted after 90 days. Locating employees has its own rule in Spain, article 90 of the data protection law (LOPDGDD), and before using the app each person reads to the end and accepts the prior information written by the company's lawyer, with a record that cannot be altered and a receipt.
The app holds the names, emails and phones of a team in several countries, photos of their receipts and their positions. We designed it so that a copy of the database or of the files does not tell anyone who is who.
| When | What arrived |
|---|---|
| May 2026 | A clickable demo of the web and the app, with a simulated receipt reader, to agree on the screens |
| Jun 2026 | The backend for the agenda, expenses and routes, the AI that reads receipts, and both apps on real data |
| Jul 2026 | The live map, push notifications, background GPS, passkeys, the accounting export and Holded, access requests and the timesheet |
| Aug 2026 | Production on the company's own domain, and the app on TestFlight and as an APK with update notices |
| Sep 2026 | Closing a meeting with its outcome, each expense on the day's route, the duplicate warning, the live team and the prior information |
| Oct 2026 | Release channels, flights and trains confirmed on the map, the whole team's stops and meetings, and uploads in the background |
The backend carries 714 test classes, 48 of them against a database, with a floor of 78% of lines covered, and the monorepo 685 test files. Of the more than 1,200 commits, about 120 come from AI agents and the rest are ours, the two of us. Many of the recent changes answer something the team asked for, and the docs record each one with its date.
If your team still plans in a spreadsheet and keeps its receipts in an envelope, this is the kind of custom software we build, with a mobile app for the people out in the field.
It gives a sales team spread across several countries its agenda, the day's route and expenses from a photo of the receipt on the phone, and gives the office a web panel to plan, follow the team on a live map and review and approve expenses.
The photo or PDF goes to the backend, where an AI model reads the merchant, amounts, VAT, currency, date and category. The server checks that base plus VAT gives the total and creates a draft that the rep reviews, corrects if needed and then presents.
No. The AI only fills in a draft. The rep confirms it and finance or an admin approves or rejects it, and each verdict is written to an audit trail.
No, it is an internal app. iPhones install it through TestFlight and Android phones from an APK the admin publishes, and the app warns at startup when there is a new version.
Each person reads and accepts the prior information written by the company's lawyer before using the app, as article 90 of Spain's LOPDGDD requires, positions are deleted after 90 days and every personal field is encrypted.
Case studies · Oct 26, 2026 · 12 min read
ReservPark notices through the car's Bluetooth that you parked, asks whether you are leaving when you walk back to the car and tells drivers nearby, and lets people rent out their garage by the hour or by subscription. How we built the native detection, the background location rules, the 30-minute free spots and garage bookings that cannot be oversold.
Case studies · Oct 26, 2026 · 12 min read
A store receives a delivery and has to know what came in. Almacén-Pro, an internal tool we built for a client's stores, reads the delivery note's PDF and turns it into a list the staff check off by scanning each product. How we read the PDF without guessing, scan without coverage and merge the work of two phones without losing a scan.
Case studies · Mar 28, 2026 · 9 min read
Boathous connects boat owners with the people who want to rent their boats, on the web and in an iOS app. How we built its reactive Java backend, the split payments on Stripe, real-time chat with translation, search in twelve languages and an AI assistant that answers for the owner but never confirms a booking itself.