BioLinkStore
One URL that turns your catalog into a store, for people who sell on Instagram and close on WhatsApp. Set up in minutes, no card required, $0/month infrastructure without giving up architecture.
The Instagram bio link has one job. BioLinkStore turns it into a complete store.
A catalog with photos, variants and stock, three templates, and the order reaching the seller on WhatsApp already written. No commission per sale and infrastructure at $0/mo.
From a tap on the bio to an order in WhatsApp
Tap the steps or let it advance. Each step lights up the piece doing the work.
Four layers, four providers, a single schema
Each layer lives on the provider that serves it for free. The coupling between them goes over HTTPS and an API contract documented in Swagger.
Inside the API, every module follows the same line: Controller → Use case → Repository interface → Prisma repository. That is 44 use cases with one responsibility each. The domain does not import Prisma.
/api/public/:slug and the renderer maps the template column to a component. A new store is an INSERT, not a deploy. Store names are examples.refresh_tokens table./api/auth/login route receives the tokens and stores them in httpOnly cookies. It also sets a cookie with no secret in it, igs_session, which the Edge middleware can read./api/proxy/… and the proxy injects the Bearer from the cookie./api/auth/refresh, rotates the cookies and retries the original request. If the refresh fails, the client signs out.@Public() to opt out), StoreOwnerGuard (the store is yours) and PlanFeatureGuard (your plan includes this).María opens her store on a Tuesday afternoon
A made-up case with small numbers, to see what happens at each stage. Names and quantities are examples.
maria-closet; the panel queries /stores/check-username and confirms nobody has it. Name, categories, Free plan. The store exists.?preview=noir, goes back to Vitrina, sets her palette. She pastes biolinkstore.com/maria-closet into her bio. The preview shows her logo because the page carries Open Graph.OrderIntent: 2 × (18 + 0) = US$ 36, generates the message and the WhatsApp URL. The buyer lands in María's chat with the order written.Five times the obvious solution was wrong
Every challenge follows the same pattern: what anyone would do first, why it does not work, what was done and the number that proves it. The technical detail stays folded.
There is no payment gateway and no persistent cart on the buyer's side. The seller already gets paid through Pago Móvil, Zelle or cash and already closes on WhatsApp; the product does not change that, it removes the work of typing out the catalog twelve times a day.
A single filter: does this fit in the free tier without giving up architecture?
If the answer was no, another piece was chosen. If it was yes, it was abstracted just enough to be swapped later.
Go deeper
The second reason is scale: the front is served from Vercel's edge and the API scales on its own. In a multi-tenant SaaS the traffic spikes of two stores are not correlated.
strict and its decorators; Drizzle was excellent but its migration tooling was less mature when the project started.Go deeper
StorageProvider with three implementations: local for development, S3-compatible and Cloudinary. In a SaaS where every store uploads its photos, the storage provider is a cost decision that is going to change. Changing it is an environment variable, not a refactor.Go deeper
The watermark goes through the same path: sharp composes an SVG over the image before uploading it, only if the store's plan does not include removing it. GIFs and PDFs skip the step.