A counter, a QR code, and a database that fills itself
Saba Collections has sold abayas, shrugs, qimars and jilbabs in Bengaluru since 2017. Customers walked in, looked, and walked out, and the shop kept nothing: no name, no number, no way to tell them the new stock had arrived. Three builds later, every walk-in who wants the catalogue is a row the owner can read.

The problem, in the owner's words
People saw the poster at MG Road, came to the counter, asked about a piece, and left. Some came back. Most did not. The shop's WhatsApp had years of conversations and no list. When new stock came in there was nobody to tell.
Phase one: the QR code that asks for a number
Every poster and flyer carries a QR code. A customer scans it and lands on a page in the brand's own typefaces, not a form. It asks for a name and a WhatsApp number, and the button says Get my catalogue. Tap it and WhatsApp opens with the message already written. The customer sends it. The catalogue arrives within seconds.
What the customer does not see: before WhatsApp opens, the details go to a server-side function that validates the number, rate-limits the sender, throws out duplicates and bots, and writes one clean row to a Postgres table. Nothing sensitive ever sits in the browser.
- Each poster is tracked separately. The QR on the MG Road poster and the QR on the flyer in the bag are different links, so the owner knows which one is paying for itself.
- Junk never reaches the list. Repeat scans, fake numbers and automated hits are filtered before they appear.
- The owner reads it without training. A dashboard with a count, a search box and a CSV button. That is the whole interface, on purpose.
Phase two: the catalogue on the shop's own address
The catalogue moved from a PDF passed around on WhatsApp to catalogue.sabacollections.in: the collection, by category, on a page that loads on a phone in the shop's own colours. The QR code now sends people there first, and the WhatsApp step became a button on the page rather than the only way in.
Phase three: the store
Once the catalogue was drawing people, the shop wanted to sell online. That is sabacollections.in: the full range with cart and checkout, live today.
What it was built with, and why
- React 19 with TypeScript, deployed as static files, so it is fast on a cheap phone and there is no server to keep alive.
- Supabase Postgres with row-level security: the lead table cannot be read from the browser at all. Only the owner's login can.
- A Deno edge function for the write path, which is where the validation, rate limiting and deduplication live.
- The brand's own fonts, self-hosted. No third-party requests on a page whose job is to earn trust in four seconds.
What the owner has now
A list that grows on its own, a number for every poster, a catalogue that does not need re-sending, and a store. The next stock drop goes to everyone who ever asked, in one message.
Lose fewer walk-ins
The lead capture system starts at ₹75,000 and takes one to two weeks. Twenty minutes on a call will tell you if it fits your counter.