Our parents are the reason this exists. They'd come home from Costco saying they spent hundreds of dollars, but couldn't tell you exactly where it went. Groceries, household stuff, the random things you grab without thinking, it all disappears into a blur of receipts. We realized this isn't just a them problem. Everyone tracks the big expenses, rent, subscriptions, car payments, but the small everyday purchases? Those just slip through. They add up to hundreds of dollars a month that nobody ever accounts for. We built ReceiptIQ because those overlooked purchases deserve attention too.
How We Built It We built a full-stack web app with a React and TypeScript frontend powered by Vite and Tailwind CSS, and a Python Flask backend connected to a SQLite database. Users can upload physical receipts to be parsed automatically, or connect their Gmail account to pull in digital ones. We organized everything as a pnpm monorepo with shared Zod-validated types between the frontend and backend, which kept our data consistent across the whole app.
What We Learned Honestly, receipt parsing humbled us. No two receipts look the same, a Costco receipt and a pharmacy receipt are completely different documents, and getting clean structured data out of both took way more iteration than we expected. We also learned a lot about OAuth 2.0 while building the Gmail integration, and managing a monorepo with shared libraries across a React frontend and Python backend taught us how to actually structure a real project.
Challenges The hardest part was parsing. Real-world receipts are messy and inconsistent, and making the app handle that gracefully was an ongoing challenge throughout the whole build. Setting up Gmail OAuth locally without HTTPS also required workarounds we had to research carefully. And keeping the frontend and backend in sync through a shared type library, while also managing workspace dependencies, was more complex than either of us anticipated going in.
Log in or sign up for Devpost to join the conversation.