Early implementation
The original stack that established embeddable cart and checkout as the core proposition.
- CodeIgniter
- Vanilla JavaScript
An embeddable ecommerce SaaS that adds cart and checkout to almost any website. I spent 7+ years helping evolve it, taking ownership of complex engineering across its backend, APIs, merchant workflows, storefront, integrations and infrastructure.
Traditional ecommerce tools often require merchants to move into a hosted storefront or rely on an iframe. Shoprocket's model was different: add a real cart and checkout to an existing website with a small embed.
That is a harder product. Commerce is a chain of dependent workflows, not a list of features. Product configuration affects inventory. Inventory affects checkout. Checkout triggers payment. Payment creates an order. Orders connect to fulfillment, shipping, taxes and customer workflows, all of it on websites the team did not control.
A cart and checkout that sit on a merchant's existing site, so the storefront has to stay predictable on sites nobody on the team controls.
Orders sit at the intersection of customers, products, payments, fulfillment, taxes and shipping, not just a database record.
One SaaS platform serving tens of thousands of independent stores, each with isolated data and business logic.
It was making interconnected commerce workflows behave reliably, especially when product, inventory, payment and order state all depend on each other.
One path through the system
Not just CRUD, attributes, options, variants, pricing and inventory relationships across physical, digital, service and subscription types.
Orders sit at the intersection of customers, products, payments, fulfillment, taxes and shipping.
Payment state has to stay consistent with order state while handling failures, retries, refunds and asynchronous provider callbacks.
External systems can fail, retry or respond asynchronously, integrations have to be designed around unreliable communication.
Related engineering notes: order systems , payment webhooks , tenant isolation .
The product evolved, so the engineering foundation had to evolve with it. Shoprocket started on CodeIgniter and vanilla JavaScript; as the merchant base and product scope grew, I rebuilt V2 on Laravel, Livewire, Alpine.js and Tailwind CSS, modernizing a live commerce platform while preserving the workflows that already mattered.
The original stack that established embeddable cart and checkout as the core proposition.
Rebuilt from the ground up so the dashboard and commerce layer could keep growing.
New product types, payment methods and sales channels followed real merchant needs.
The challenge wasn't swapping frameworks. It was keeping the business running while the system changed underneath it.
Read Rebuilding a live commerce platform on Laravel without breaking merchants for the migration perspective.
I've worked with Shoprocket's founder for 7+ years, including building V2 from the ground up and owning most of the engineering across its backend, APIs, merchant workflows, storefront and integrations.
Products and variants across physical, digital, service, licence-key, donation and subscription types, plus inventory and catalog workflows.
The path from cart to a recorded order, including a provider-agnostic payment layer, refunds, retries and recovery from failed or duplicate payments.
The dashboard merchants use to run products, orders, customers and inventory, built so the operation can grow without another rebuild.
The public REST API and its authentication, inbound webhooks from payment and third-party services, and integrations such as Zapier.
The customer-facing cart and checkout, implemented in vanilla JavaScript so commerce can sit on websites nobody on the team controls.
Shipping options, tax handling and the operational rules that have to work across currencies and regions.
The embed needs to behave predictably on thousands of different websites. Underneath it is a Laravel API and a multi-tenant architecture that keeps each merchant's store and data isolated. The storefront itself is vanilla JavaScript.
Orders · Payments · Inventory · Shipping · Tax
Vanilla JavaScript embed, public REST API, webhooks and Zapier
Laravel API with Livewire, Alpine.js and Tailwind CSS powering the merchant experience.
MySQL-backed multi-tenant commerce data and business workflows.
A provider-agnostic payment layer across Stripe, Stripe Connect, PayPal, PayU and crypto, with webhook handling, refunds, retries, duplicate-payment protection and recovery from failed payments.
Queued and scheduled jobs, so the slower work never blocks a merchant request.
A public REST API with token and OAuth authentication, and verified inbound webhooks from payment and third-party services.
AWS infrastructure designed to keep checkout responsive as demand changes.
Shoprocket is interesting because real commerce is a system of systems. These are the kinds of problems the work had to take seriously.
One SaaS platform serving thousands of independent merchant stores, with each store's data and business logic kept isolated.
Supporting several product types, variants and inventory in a single catalog, without turning every merchant into a special case.
Connecting cart, checkout, payments, recorded orders and refunds as one set of state transitions, not a pile of separate features.
Taking money across Stripe, Stripe Connect, PayPal, PayU and crypto, and staying correct when webhooks fail, retry or fire more than once.
A public API, Zapier and inbound webhooks from systems that can fail, repeat or arrive asynchronously.
Keeping the embed predictable on thousands of third-party websites, and checkout responsive, as the product kept growing.
The storefront embed is vanilla JavaScript, and it had to stay lightweight enough to sit on websites the team did not control. Shoprocket published this load-time comparison as a product benchmark.
Dashboard workflows, commerce configuration and the vanilla JavaScript storefront that runs on a merchant's own site.
These are Shoprocket's public scale figures. The engineering sat underneath them across a 7+ year relationship, from the original stack through V2 and the commerce systems that followed.
sellers using the platform
orders processed
products sold
countries
This was not a one-off freelance task. After years of engineering on Shoprocket, this is how Ryan Badger, the CEO, describes the work.
“I’ve had the pleasure of working with Indesh for several years across multiple projects, and I can confidently say he’s one of the best developers I’ve worked with. His technical skills are exceptional, particularly in Laravel, APIs, SaaS platforms, and scalable backend systems. He consistently delivers high-quality work, communicates clearly, and always approaches challenges with professionalism and attention to detail.
Beyond his technical ability, Indesh is reliable, trustworthy, responsive, and genuinely enjoyable to work with. His English is excellent, deadlines are met, and he takes real ownership of his work. I would recommend him without hesitation to anyone looking for a highly skilled and dependable developer.”
I help evolve the systems businesses depend on. Building a SaaS or ecommerce product, or evolving one that's already in production? Let's talk.