Skip to content
AKArnav Kumar
All work

§ 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
nhhw.in
The Royal Algae storefront hero, with a sea moss product on a beach
razorpay signature ok → order created once

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

Stack

ReactViteTailwind CSSLaravelPHPMySQLRazorpayCloudflare R2PHPUnit