Inspiration

We were always annoyed by struggling to figure out who paid what when we went out to dinner with our friends, and Venmo's lack of multiple users with different amounts per transaction exacerbates this difficulty. We wanted to create a product that would make splitting the bill between friends seamless and fun.

What it does

After the waiter brings you your check, you simply take a picture of your restaurant receipt, and the app creates a list of all the items your party ordered. You can then add friends you've already eaten with before to the meal, or search for new friends across the app. Once you find your friends, you can quickly tap through the items ordered during the meal and assign one to each friend. The app keeps track of whose been assigned to what, calculates tax + tip, and sends an individual charge request to each friend. Each friend can complete this charge request with their No Free Lunch account balance or bank account, and you get paid.

How we built it

We had experience creating servers in Python, so creating a server to handle TCP requests on the backend wasn't so hard. I had done some frontend web development before, but had very limited experience working with the backend, so I got familiar with MongoDB as a way to store user data. In simplest terms, our backend works as follows - the Python server receives a connection from a client, which is the app running on a user's phone. The client then makes one of 7 available API requests, which may simply read from the server or may cause the server to update the MongoDB and/or interact with the Stripe API.

On the frontend, we used React Native to implement a UI for the user to scan receipts and select users to add to a meal. We had to use a few libraries - one was to implement the camera functionality, another was to tokenize the users private bank account data.

Challenges we ran into

We ran into a lot of challenges integrating payments into our platform. We had never worked with any kind of peer to peer payment framework, so we had to do a bunch of research online about what would be the best/most cost efficient P2P payment services. After reading a bunch of articles, we settled on Stripe, a well-documented, well-established payment platform designed for merchants. However, being that Stripe is designed for merchants and business, it a.) was not optimized for enabling P2P transactions and b.) has very extensive documentation to read through. We went through a lot of growing pains trying to figure out what parts of the stripe API were appropriate for our uses; we had to try a few different solutions before we arrived at our final payment method.

As a whole, we met many challenges working with React Native, as neither of us had any previous experience. One of the main challenges we faced in the iOS environment was interfacing with the iPhone hardware camera. We found an NPM library that claimed to offer full-fledged support, but ran into numerous bugs which were exacerbated by the repository’s poor documentation. This was further complicated by the fact that the library could not be tested on the Xcode device simulator, but rather had to be built on our personal phones, which involved setting up certificate signing and reworking much of the build process.

Accomplishments that we're proud of

We got the camera working on the app, we're able to scan and itemize receipts by making calls to taggun, we've figure out how to communicate with the Stripe API, the backend server can accept connections, we have the routing set up, we figured out a system for Peer to Peer payments on Stripe.

What we learned

Working with mobile is harder than it seems, and payments are really complicated. Working with Javascript on a mobile phone provides a lot of unintuitive challenges for people like us who are accustomed to working with Javascript on the server/web side, as much of the functionality we're used to on the desktop side isn't there. Unsurprisingly, once money is involved, security and complexity of applications seem to increase exponentially, and we underestimated how difficult integrating payments would be.

What's next for No Free Lunch

Right now, our UI and server application aren't really working together at all - the next step would be to have the client app actually making the right calls to the server and updating and pulling in server data. In the future, we hope to improve our itemization of receipts, add more user functionality, and improve payment speeds.

Built With

Share this project:

Updates