All Case Studies
Ayurvexa store at a glance
The main facts of the Ayurvexa store migration.
| Item | Detail |
|---|---|
| Client and industry | Ayurvexa, nutraceutical supplements for liver, skin, heart, energy and general wellness |
| Market and audience | India; online buyers of health supplements |
| Engagement period | Store build activity Apr 2026 to Jun 2026; client won Apr 2026 |
| Our scope | Move from WordPress to Dcrayon's multi-brand Laravel platform, store features and redirects; Instagram management and UGC video also contracted |
| Platform and stack | Laravel 12, stancl/tenancy, Blade, Alpine.js, Tailwind CSS, Vite, PostgreSQL; Razorpay |
Challenge
Ayurvexa, a Jaipur brand of liver, skin, heart and energy supplements, moved its online store from WordPress onto Dcrayon's multi-brand Laravel commerce platform in April 2026.
A five-product supplement brand leaving WordPress
Ayurvexa sells five nutraceutical products, each aimed at one health concern: Liver Support, Skin Sculpt, Spirulina Bliss, CoQ10Life and Energize Q, plus five combination packs built from them. Its customers buy online across India. Dcrayon's CRM records the brand as a client won in April 2026, with Instagram management and UGC (user-generated content) video on the order and four invoices issued. In the same month, the platform's code history shows the Ayurvexa catalogue being imported onto Dcrayon's Laravel platform, the shared codebase that also ran other Dcrayon-built stores, each brand with its own database. This case study covers the store migration and build.
A small catalogue on a platform designed for large ones
The platform's standard homepage assumed categories with many products, shown in a scrolling category carousel above a grid of featured products. Ayurvexa has one product in each of its five health categories. Left as it was, the layout would have shown thin rows and a carousel with almost nothing to scroll.
Old WordPress links that were already in use
Product addresses from the WordPress site could still turn up in search results and in links shared earlier. A platform change without redirects would have sent every one of those visitors to an error page, and search engines would have treated the old pages as gone.
Supplement buyers who want advice before they pay
Someone choosing a liver or heart supplement often has a question first: is this right for me, and which product should I start with? A store that offers only a cart leaves that question unanswered.
Shoppers who prefer to pay on delivery
Some buyers do not want to pay the full amount before the parcel arrives. The store needed full prepaid payment as well as a middle option, where the buyer pays a small advance online and settles the rest at the door.
One brand's data, copy and messages kept apart from the others
On a shared platform, a cache, an email setting or a banner that is not scoped to one brand can show up on another brand's store. For a health brand, a wrong product photo or another brand's sender address in an order email undermines trust immediately.
Solution
Joining Dcrayon's multi-brand Laravel platform
The choice was between rebuilding Ayurvexa as a standalone WordPress or Shopify store, or adding it as one brand (a tenant) on Dcrayon's existing Laravel 12 platform. A standalone rebuild would have meant setting up checkout, courier booking, order emails and an admin panel again from nothing. The shared platform already ran those for other brands, so Ayurvexa joined it, and only the parts that are specific to a supplement brand had to be built. This sits within our custom web application work.
The platform uses the stancl/tenancy package. Every request is matched to a brand by its domain before any route runs, and requests to the central domain cannot reach a brand's pages. A central database holds the tenants and their domains, and each brand gets its own database for products, customers, orders and settings. Each brand's branding (name, logo, favicon and colours), business details (support contacts, GST number, legal name and address) and integration settings for payments, shipping, WhatsApp, Instagram, the Meta Pixel and GA4 are stored per brand, never in shared code. Files are stored per brand too: a tenant image service writes products, branding, banners and content images into that brand's own folder.
Fitting the layout to five products
Two commits on 6 Apr 2026 adapted the shared homepage. The category carousel now appears only if at least one category holds more than five products, which hides it on Ayurvexa, and when there are six or fewer featured products the grid centres them instead of leaving gaps. Brands with their own navigation get the logo on the left. A header ticker carrying Ayurvexa's offer lines, split on a separator in the theme settings, was later limited to Ayurvexa alone.
The platform resolves views in three layers: a brand's own view folder first, then the default storefront, then the core views. Ayurvexa had its own home page, product page and checkout views, with its own CSS and JavaScript, while everything else came from the shared storefront. A console command, ayurvexa:create-combos, built the five combination packs: each pairs two products, adds up their MRPs, prices the pair below the two bought separately, copies the first product's image and categories, and refuses to run outside the Ayurvexa tenant. Combos are stored as ordinary products, so they use the same cart, stock and checkout as the single supplements. Products can also carry a "Choose Your Pack" configuration, which the product page shows as pack options.
Redirects that kept WordPress links alive
On 17 Apr 2026 about 20 explicit permanent (301) redirects were added for old WordPress addresses; a 301 tells search engines a page has moved for good. The product route then works in order. A deleted product returns a 410 status, which asks search engines to drop the address instead of retrying it. An old product slug from a map of WordPress-era names, such as liver-support or coq10, redirects permanently to the current product. Anything else is matched by keywords from the slug against active product names. A fallback route at the end of the routing table applies the same 410 and keyword logic to any address no route recognises. When we checked on 13 Oct 2026, /products/liver-support and /products/coq10 both redirected to the current product pages. Redirect planning of this kind is part of our technical SEO service.
BMI calculator and free consultation booking
The BMI calculator page exists only on Ayurvexa: the controller returns not-found for every other brand on the platform. It takes weight in kilograms and height in feet and inches, and places the result in a band from underweight through to obese class II and above.
The free consultation form asks for a name, an email address, an Indian mobile number (checked against the pattern for ten-digit numbers starting 6 to 9), the product or concern the visitor is interested in (energy and stamina, liver health, skin radiance, nutrition and immunity, or heart health), a preferred date and an hourly time slot, and a question of up to 2,000 characters. Each request is saved in the store's enquiries table with the subject "Free Consultation Request" and emailed to the brand's team, and the form accepts no more than five submissions a minute from one visitor. A promotional banner on the home page can open the same form as a pop-up when the brand switches consultations on in its theme settings. A fix on 23 Apr 2026 removed hard-coded wording from the consultation email so that it reads correctly for this brand.
Razorpay, full prepaid and partial cash on delivery
Checkout only accepts a payment method from a fixed list, which covers cash on delivery, partial pay, Razorpay and UPI alongside the platform's other gateways. Guest phone numbers must be valid Indian mobile numbers, a saved address must be a valid stored address, and checkout is limited to ten attempts a minute.
For Razorpay payments, the signature Razorpay returns is checked with a constant-time comparison before the order is confirmed. Razorpay's webhook is verified against the raw request body with HMAC-SHA256 in middleware, before the controller sees it. Orders are matched to Razorpay by their Razorpay order ID and payments are written with an update-or-create, so a repeated notification updates the same record instead of creating a second one.
Partial cash on delivery takes an advance through the primary gateway. The advance amount is a store setting, the order records the advance and the balance due separately, and the payment is marked paid only when the amount received covers the full total. In late April 2026 the admin order views were updated to show what has been paid, what is still due on delivery and any refunds, and gaps in Ayurvexa's order emails were closed. This is the checkout side of our e-commerce solutions.
Keeping each brand's caches and emails separate
Separation needed checks beyond the database. Cache keys for settings and cached pages carry a tenant prefix. On 27 Apr 2026 the Instagram reels cache was made brand-specific, after Ayurvexa reels appeared on another brand's store; the key now includes the tenant ID. On 30 Apr 2026 the configuration bootstrapper, the code that loads a brand's settings at the start of each request, was changed to forget any mailer it had built for the previous brand, to clear any setting a brand does not define rather than inherit it, and to send through a brand's own mail server only when that brand has one, otherwise using the platform's mail server with the brand's address as the reply-to. Continuous integration also checks that no brand name is hard-coded into shared code.
Blade components and Alpine stores on the storefront
The storefront is server-rendered Blade with Alpine.js for interactive parts and Tailwind CSS, built with Vite. Reusable Blade components run from small to large. Small ones include alerts, inputs, the logo, breadcrumbs, trust badges and the WhatsApp and Instagram buttons. Mid-sized ones include modals, the product card, the FAQ section and the product structured-data block. Large ones include recently viewed, similar products, recommended products, the Instagram reels strip and the exit-intent pop-up. Layouts cover the storefront, checkout, guest pages and the admin panel.
Shared state lives in Alpine stores: cart for the basket, wishlist for saved items, toast for short messages, authModal for sign-in and registration, pdpPack for the pack selector on product pages, and freebie, which reads the cart and shows how far the shopper is from a free gift. Reusable Alpine components handle accordions, drop-downs, image galleries, modals, quantity selectors, search and tabs, with igReels running the reels strip and bmiCalculator running Ayurvexa's BMI page.
Structured data, sitemaps and product feeds
Product pages publish structured data for the product, brand, offer, shipping details and delivery time, the regions shipped to, the return policy, FAQ answers, the breadcrumb trail and the organisation. The sitemap index lists separate sitemaps for pages, products, categories, brands and blog posts, and is cached for an hour. A Google Merchant Center feed carries each product's ID, title, link, images, availability, price and sale price, brand, identifiers, Google product category, shipping and return policy labels, and a separate catalogue feed serves Meta. The robots file keeps private areas, such as accounts, checkout and administration, out of search. A newsletter sign-up offers a first-order code, with its own limit of five submissions a minute.
Admin access, sign-in limits and security headers
The admin panel uses its own authentication guard, requires two-factor authentication and records an audit trail of admin actions. Staff roles (manager, cashier, support and warehouse) are mapped to the admin sections each may open, such as orders, catalogue, customers, marketing, content, reports and settings. Platform-wide super administration sits on a separate guard in the central application. Repeated failed sign-ins lock further attempts for a period, keyed on the visitor's IP address and the email used. Forms are protected by Laravel's CSRF tokens (cross-site request forgery protection), and webhooks are verified by signature instead.
A security headers middleware runs on every response. A header request on 13 Oct 2026 showed HSTS (HTTP Strict Transport Security) for one year with subdomains and the preload directive, frame blocking, content-type protection, a strict referrer policy, a permissions policy that turns off the camera and microphone and limits location to the site, and a cross-origin opener policy that still lets payment windows open from checkout.
Delivery and checks on a shared codebase
Changes were tracked as commits and pull requests in the platform repository. The continuous integration pipeline compiles every Blade view, validates routes and configuration, checks that Blade directives are balanced, runs the brand-name check, builds the front-end assets and runs a dependency audit and a secret scan.
Where the Ayurvexa store keeps its data
The main tables in Ayurvexa's own database, with their real names.
| Entity | Table or file | What it holds |
|---|---|---|
| Product | products and product_variants | Supplements and combos, MRP and price in decimal rupees, pack options |
| Order | orders and order_items | Totals, paid amount, payment status, and advance and balance for partial cash on delivery |
| Payment | payments and refunds | Gateway payments and refunds, written with update-or-create |
| Consultation | enquiries | Free consultation requests with topic, date and time slot |
| Content | blog_posts and newsletter_subscribers | Blog articles and newsletter sign-ups |
| Brand registry | tenants and domains (central database) | Each brand on the platform and the domains that route to it |
Blade and Alpine pieces behind Ayurvexa
The reusable parts of the storefront, from small components to page-level widgets.
| Component level | Examples from this build | Used on |
|---|---|---|
| Small Blade components | alert, input, breadcrumb, trust badges, WhatsApp and Instagram buttons | Every page |
| Mid-sized components | modal, product card, FAQ section, product structured-data block | Listings and product pages |
| Widgets | recently viewed, similar and recommended products, Instagram reels, exit-intent pop-up | Home and product pages |
| Alpine stores | cart, wishlist, toast, authModal, pdpPack, freebie | Every page |
| Ayurvexa-only pieces | bmiCalculator, consultation form, offer ticker, own home, product and checkout views | BMI, consultation and home pages |
Ayurvexa checkout and admin safeguards
Where the store protects payments, brand data and admin access, and how each was checked.
| Control | Where it applies | How it was checked |
|---|---|---|
| Razorpay signature checked with a constant-time comparison | Checkout confirmation | Code inspection of CheckoutController |
| Webhook verified against the raw body before the controller runs | Razorpay webhooks | Code inspection of the webhook middleware |
| Brand matched by domain; central domain blocked from brand pages | Every request | Tenant route configuration |
| Tenant-prefixed caches and per-brand mail settings | Settings, page cache, reels, order emails | Commits of 27 and 30 Apr 2026 |
| Two-factor authentication and audit trail | Admin panel | Admin route middleware |
| HSTS with preload, frame blocking, content-type protection | Every response | Header request on 13 Oct 2026 |
Results
What changed for Ayurvexa's customers and team
Ayurvexa customers can shop by health concern, compare a single supplement with a combo and its pack options, check their BMI, book a free consultation for a time that suits them, ask a question on WhatsApp, and pay in full online or with partial cash on delivery. Visitors who follow an old WordPress product link land on the current product instead of an error page.
For the Ayurvexa team, orders show the amount paid and the balance due, and consultation requests arrive by email with the topic, date and time slot the visitor chose, which is what the team needs to call back. Products, combos, offers, blog posts and theme settings are managed from the store's admin panel. Sales and conversion figures for the new store are not published.
What changed for Ayurvexa customers
What the new store delivers for customers and for the Ayurvexa team.
| Outcome | What changed | Status |
|---|---|---|
| Old links still work | WordPress-era product URLs redirect to current pages; deleted products return 410 | Delivered |
| Help before buying | BMI calculator, consultation booking and WhatsApp chat | Delivered |
| Payment choice | Full prepaid via Razorpay or a small advance with the balance on delivery | Delivered |
| Clear order records | Admin shows amount paid, balance due and refunds | Delivered |
| A layout that fits five products | Carousel hidden and featured grid centred for a small catalogue | Delivered |
Key takeaways
What a shared commerce platform asks of a small brand
A small brand gets a great deal from a shared commerce platform: a working checkout, courier and payment integrations and an admin panel from the first day. The price is discipline. Layouts must adapt to catalogues of very different sizes, and every cache key, mail setting and banner has to be scoped so that one brand's content never appears on another's store. On this project, that separation work was as much of the job as the BMI calculator or the consultation form.
A platform change is also a search event. Mapping old addresses to new ones before launch, and returning a clear 410 for products that no longer exist, protects links that took years to earn. For the same platform from another brand's side, read Natually's move from Shopify to Laravel. Our article on features a Laravel store needs and our guide to UPI payment architecture in India go deeper on the build decisions.
If you are planning a move off WordPress or Shopify and want your links and checkout to keep working, talk to our team.
More work













