§ 02Case study
Royal Algae
A D2C store for a sea moss wellness brand
A live e-commerce store with phone-OTP guest checkout, Razorpay and cash-on-delivery, server-side GST pricing and PDF invoices. I built the React storefront and admin, and most of the checkout backend.
- Role
- Full-stack · Freelance
- Timeline
- Mar – Jun 2026
- Core stack
- React, Vite, Tailwind CSS
- Live
- nhhw.in

Fig. 1The live store. Orders are created only after Razorpay's signature checks out.
01
The brief
A wellness brand selling sea moss wanted first-time visitors to buy without creating an account, pay online or cash on delivery, and get a proper GST invoice. I worked with their agency. Another developer had set up the Laravel base with users, products and roles; I built the React storefront and admin panel, and wrote most of the checkout, payment, sign-in and invoicing code on the backend.
02
Checkout without accounts
Guests confirm their phone number with a one-time code from MSG91. Codes are stored hashed, five wrong tries locks the number out, and there are send limits per number and per IP. Prices, GST and shipping are always worked out on the server from the database. Whatever total the browser sends is ignored.
03
No lost or doubled orders
For online payments, the checkout waits in a pending table until Razorpay's signature checks out. The browser's confirmation and Razorpay's webhook can both arrive, sometimes at the same moment, so the code that turns a pending checkout into an order locks the row inside a transaction. Whichever arrives second finds the order already made. Each order gets a PDF invoice stored on Cloudflare R2.
04
The storefront
The store is React with Vite and Tailwind. Pages are pre-rendered at build time with Puppeteer so search engines see real content, and the build fails if a page comes out nearly empty. In the admin panel, images are compressed in the browser before upload, and there's a small rich-text editor with an allow-list sanitizer.
By the numbers
- API routes
- 48
- PHPUnit tests
- 13
- payment modes
- 2
- in production
- Live