Lashiro's
An online store for an eyelash supply distributor. I designed and built it end to end: the catalog with real stock, WhatsApp orders and the panel the business uses to run it all.
- Client
- An eyelash supply distributor in Barquisimeto, Venezuela
- Role
- Design, development and deployment
- Product
- Online store and admin panel
- Status
- In production since 2026
The problem
The business sold through Instagram and lost sales because its storefront couldn't say what was in stock. Lashiro's shows which size is available, builds the order and leaves it written out in WhatsApp, where payments were already being arranged.
Since August 2026: 133 commits, from the first catalog to the panel and customer accounts.
From catalog to WhatsApp
A customer's journey on the phone, captured from the live site.
On desktop
The grid lies down: curls in rows and lengths in columns, with a legend for each state. If a size is sold out, the customer taps it and asks to be told when it is back.

The other side: the panel
The business manages the catalog, the stock and its customers from a private panel. It was designed for desktop first, but with nothing that doesn't work on a phone.
Stock by exact quantity
It is edited cell by cell. The store only sees available, low or sold out: the number never leaves the panel.
No confirmation dialogs
Every change applies instantly and can be undone. If something feels dangerous, the answer is to show better what happened.
Customers and alerts
Each customer is recognized by their phone number, and you can see who stopped buying. Anyone who finds a size sold out can ask to be told when it is back.
The panel holds data about the business and its customers, so I don't show it in screenshots.
Decisions
Stock doesn't ship in the build
Each product page is frozen at build time because it rarely changes; stock is read separately, with short revalidation. If stock shipped in the build, the site would lie between deploys, and that was exactly the problem to solve.
No payment gateway
In Venezuela people pay with Pago Móvil, cash dollars, Zelle or Binance, and no gateway integrates them easily or cheaply. The site builds a numbered order and sends it through WhatsApp: no gateway, no PCI, no reconciliation and no disputes.
BCV dollars and bolívares
Each price is converted once on the server at the official rate and rounded to the cent, so what the store adds up matches what the customer sees. If the rate doesn't arrive, the base currency is shown; never a hand-typed rate.
Built for slow mobile data
Customers arrive from Instagram, on their phones and on poor connections. That's why there is handwritten CSS instead of a component library, fonts served from the site's own domain, AVIF images and the heavy lifting on the server.
Every read counts
The project lives on Firestore's free plan, with 50,000 reads a day shared by the store, the panel and the tests. A page load costs one read per product and the whole stock just one; saving in the panel costs nothing, and there are alerts before the limit is reached.
Security lives in the rules
Firestore rules are the real boundary, not the login screen: writing to the catalog is authorized against the list of admins, never against simply being signed in. Server routes check the token before anything else, and the rules have their own tests.
Login never comes before the cart
You always buy as a guest. Accounts are optional, nobody signs in with their phone number without a code, and when an account is deleted its orders become anonymous.
What it is built with
- Web
- Next.js 16 with Server Components, React 19, TypeScript, CSS Modules
- Data
- Firestore, Firebase Auth and a service account only the server uses
- Deployment
- Vercel, per-branch previews and security headers
- Integrations
- Official BCV rates and WhatsApp orders
Contact
To talk about a project, an opportunity or something you saw here.





