Inspiration

It all comes from a semester away in Albania. There, card payments are not so regular, so whenever my friends and I wanted to go out to eat, we would have to pay altogether and split later. However, since we were all students on a low budget, each one wanted to pay only for what they ordered, leading to chaos for the one that actually paid. They had to make sure that everyone's payments amounted to the total of the bill. That, in addition to currency conversion, resulted in a lot of work for whomever paid, and oftentimes, in a small money loss.

There are a lot of expense tracking apps which allow groups to handle these situations. However, most of them include paying plans that constrain free-only users, and none of them easily manages splitting products inside the same bill.

What it does

CamSplit includes most of the functionalities from the most known apps (creating groups, creating payments, splitting equally…), but it includes a novelty: scanning receipts. This functionality allows the user to scan a receipt, which will be uploaded to AI services, automatically extracting all the elements, quantities, and prices into a list. Each element can then be assigned to one or several people. This avoids awkward situations with unclaimed products and reduces the strain on the payer, having to make sure the whole bill was paid for.

How we built it

We built CamSplit using a full-stack architecture with modern technologies:

Frontend (Flutter): Cross-platform mobile app using Flutter 3.6+ with Dart, featuring a responsive UI with camera integration, real-time data visualization using fl_chart, and seamless state management.

Backend (Node.js/Express): RESTful API built with Express.js, featuring JWT authentication, PostgreSQL database with comprehensive data models, and robust error handling.

AI Integration: Dual OCR service implementation using both Azure Form Recognizer and Google Cloud Vision as fallback, with intelligent receipt parsing that extracts merchant information, itemized lists, prices, and dates with confidence scoring.

Database: PostgreSQL with well-structured schema supporting users, groups, expenses, bills, and complex many-to-many relationships for flexible expense splitting.

Cloud Services: Cloudinary for image storage and processing, with comprehensive API testing using Postman collections.

Challenges we ran into

AI research: Finding the most suitable OCR service which would allow to correctly scan information from tickets, and return all the necessary info.

Data Parsing: Converting raw OCR text into structured, meaningful data was difficult, especially handling various receipt formats and international currencies.

Backend-Frontend Synchronization: We initially built the backend separately from the frontend, which led to API redesigns and data model adjustments later on.

Price: Developing and maintaining CamSplit as a freelance project involves significant ongoing costs. These include database and server hosting fees to keep the app running reliably, as well as expenses for third-party services like OCR for receipt scanning. Each receipt scan incurs a charge from the AI providers, and there are also costs for secure image storage and cloud infrastructure. All of these add up, making it necessary to carefully consider pricing and feature access to ensure the project remains sustainable.

Accomplishments that we're proud of

Comprehensive Feature Set: We didn't expect to build something so large and feature-complete, including group management, receipt scanning, item-level splitting, payment tracking, and settlement calculations. It initially was going to be a simple tool for one-instance tickets, but ended up turning into something way bigger and complex.

AI Integration Success: At first we weren't even sure that a service like that would exist, but thankfully, the main one (Azure) has a specific model for extracting information from tickets.

User Experience: Creating an intuitive mobile interface that makes the traditionally tedious process of splitting bills enjoyable and efficient.

Real-World Problem Solving: Successfully addressing a genuine pain point experienced by students and travelers, which got praise from everyone who saw its functionality.

Consistency: Depsite it being a one-man team, the thing we're (I am) proudest of is having had an problematic in our day-to-day life, which lead to an idea, which lead to a project which would solve said problematic, and sticking to it until the end.

What we learned

Planning is Crucial: The real need to have use cases, workflows, and user stories ready before development begins became evident when we had to refactor significant portions of the backend.

AI Service Limitations and Pricing Realities: Through our research, we learned that many OCR and AI services charge per scan or have usage-based pricing models. This means that features like receipt scanning can be expensive to provide at scale, which is why some apps place them behind a paywall—not just to generate profit, but to cover the actual costs of these third-party services.

Mobile-First Design: Building the backend API with mobile app requirements in mind from the start would have saved significant development time.

Testing Strategy: Comprehensive testing, especially for AI services and edge cases, is essential for a production-ready application.

What's next for CamSplit

iOS Development: Currently, CamSplit has only been tested on Android. Since iOS development is a bit trickier (development costs, more restrictive), we will get on with it once it reaches a more advanced phase on Android.

App Store Launch: After additional development and fine-tuning based on user feedback, we plan to publish CamSplit on both the Google Play Store and Apple App Store.

Better Hosting & Domain: As CamSplit grows, we're considering migrating to more scalable and reliable hosting solutions to ensure smooth performance and uptime. Additionally, purchasing a dedicated domain is on our roadmap to enhance the app's professional presence and make it more accessible to users.

Share this project:

Updates