Skip to content
JL
All Projects
01Web DevelopmentPlanned

Tindahan — A Store Operating Assistant

Tindahan is a full-stack store assistant I built for small Philippine stores, combining inventory, sales, barcode scanning, receipt intelligence, reports, staff access, and cloud-based processing in one simple system.

Overview

Tindahan is a full-stack store management application I built for small neighborhood stores and mini-marts in the Philippines.

I wanted to build something that could replace the usual mix of notebooks, calculators, spreadsheets, and memory without turning into a complicated POS or enterprise system. The idea was simple: make everyday store operations easier to keep track of without making the owner feel like they need training just to use the app.

What originally started as a static prototype eventually grew into a working SaaS application with inventory management, sales, barcode scanning, receipt processing, reports, staff accounts, cloud storage, background workers, billing, and English/Filipino support.

I kept the interface intentionally simple. Clear actions, familiar language, large controls, and focused workflows mattered just as much to me as the backend behind them.

What Tindahan Can Do

The main parts of the application revolve around the things a small store actually deals with every day.

Inventory handles product creation, categories, stock adjustments, low-stock tracking, inventory history, manufacturer barcodes, and Tindahan-generated barcode labels. Stock changes are recorded instead of silently replacing the old quantity, so there is always a history of what happened.

Sales works more like a lightweight counter tool. Products can be searched or scanned using a camera or barcode scanner, several items can be added to one sale, stock is checked before confirmation, and completed sales can still be reviewed or corrected later.

There are also reports, search, and notifications for things like weekly or monthly sales, top-selling products, low-stock items, inventory movements, receipt history, and products that need attention.

Owners can invite staff without sharing their password, and every staff member gets their own account. Tindahan also supports English and Filipino, light and dark appearance modes, notification preferences, receipt retention, and subscription controls.

Receipt Intelligence

This is probably my favorite part of the project.

Instead of manually typing every item from a supplier receipt, the user can take a photo or upload one.

Tindahan sends the image to private AWS S3 storage, processes it through an AWS Lambda worker, and uses Azure AI Document Intelligence to extract things like the supplier, receipt date, product descriptions, quantities, prices, and totals.

The result is then turned into a review screen where the user can fix quantities, match receipt items with products already in the store, create missing products, exclude non-stock lines, or scan a barcode to identify an item.

The important part is that OCR never changes the inventory by itself.

Tindahan can suggest what it thinks is on the receipt, but the owner still has the final say. Stock only changes after the receipt has been reviewed and approved.

I liked this approach because it keeps the convenience of automation without letting the system blindly make changes to important store records.

Behind the App

There ended up being quite a bit more going on behind Tindahan than I expected when I first started it.

The application is built with Next.js, React, TypeScript, PostgreSQL, Prisma, NextAuth, AWS S3, AWS Lambda, Azure AI Document Intelligence, Xendit, Resend, ZXing, Vitest, Playwright, pnpm, and GitHub Actions.

I separated the application into features such as Inventory, Sales, Receipts, Reports, Accounts, and Billing instead of putting everything directly inside the pages.

There are also a few things happening in the background that users hopefully never have to think about: duplicate sale protection, stock conflict checking, private receipt links, store-to-store data isolation, idempotent receipt approvals, secure staff invitation tokens, rate limiting, background receipt processing, and safer logging.

A lot of that work isn't very exciting in a screenshot, but it's what made the project feel like an actual application instead of just a nice-looking demo.

The Part That Gave Me the Most Trouble

Receipt processing was easily the most stubborn part.

At one point an image could successfully reach S3 but still fail later during confirmation. Other times the Lambda worker received the upload but couldn't process it correctly. I also dealt with OCR issues, browser camera problems, database migration mismatches, and failed receipt states that originally had no good recovery path.

The final flow ended up crossing several services:

Browser → AWS S3 → Database → AWS Lambda → Azure Document Intelligence → Receipt Review → Inventory

Getting every part of that chain to work together took a lot more debugging than simply getting each service working on its own.

That part of the project probably gave me the most headaches, but seeing an actual receipt go through the whole pipeline and end up as a reviewable stock update made it worth it.

Design

I also spent a lot of time making sure the production application didn't slowly drift away from the original prototype.

As more real features were added, things like long product names, errors, loading states, disabled buttons, receipt lines, modals, and mobile layouts started exposing problems that weren't obvious in a static design.

Rather than redesigning everything as I went, I kept comparing the application against the original prototype and adjusted new features to fit into the same visual system.

Tindahan also has its own loading system, including contextual loading messages and an animated version of the storefront logo for page transitions instead of relying entirely on generic spinners.

Current Status

Tindahan is currently a release-candidate / test-mode SaaS project.

The main application is working: accounts, onboarding, inventory, sales, barcode scanning, receipt intelligence, reports, search, notifications, staff access, private cloud storage, background processing, subscriptions, billing history, email support, and receipt retention are all implemented.

The project currently has 148 passing automated tests, with linting, type checking, production builds, database migrations, and release database verification also passing.

I'm keeping payments and some provider-level services in test mode for now, so I wouldn't call it a publicly launched commercial product yet. The application itself, though, has reached the point where I'm comfortable calling Tindahan one of the biggest projects I've built.

See it in action: Try Tindahan ↗