A headless ecommerce platform that replaced Shopify across a growing cannabis franchise, from catalog to checkout to courier

Client

Kindling Cannabis

Year

2026

Industry

Cannabis Retail

Services

Engineering, Architecture, CMS, Mobile App

Kindling had outgrown Shopify. Expensive apps, siloed integrations, and a customer experience that got worse with every new location.

We built four applications: a Next.js storefront, an AdonisJS API hub, an internal data center dashboard, and a React Native courier app. The hub owns every integration (COVA POS, Leafly, Moneris, CIGO, Klaviyo, Meilisearch) so catalog, checkout, delivery and content all talk to each other through a single layer.

The storefront loads in under half a second. Lighthouse performance hit 94, SEO scored 100. The Storyblok CMS gives the content team full editorial control with components that know about products, inventory and location.

94

Lighthouse performance score at launch

100

Lighthouse SEO score

<0.5s

First contentful paint across the storefront

4

Applications: storefront, API hub, data center, courier app

The Challenge

Why Shopify stopped working

App costs were unreasonable

Shopify's app ecosystem was eating the budget. Every new feature meant another $200/month subscription, another vendor to manage, another integration that didn't talk to the others.

Integrations that didn't know about each other

Inventory lived in one app, delivery in another, marketing in a third. None of them shared data. A customer could order something that was already sold out in their local store because the systems weren't connected.

More stores meant worse experience

The platform was built for one location. As the franchise grew, product syncs got slower, inventory became misleading and checkout got more confusing. Growth was actively making things worse.

A page builder that was both too rigid and too loose

Shopify's page builder couldn't pull in live product data or location-specific inventory. But it also had no brand guardrails, so pages drifted off-brand constantly. The worst of both problems at once.

Checkout was a patchwork

Multiple app dependencies fighting over the checkout flow. Shopify wouldn't keep users signed in. Saved payment methods didn't stick. Every order felt like starting from scratch.

Clean interactions while navigating from the homepage to collections

Goals

What success looked like

One platform that knows everything

Catalog, content, checkout and fulfillment all aware of each other. When inventory changes at a store, the storefront reflects it. When a customer switches locations, the cart updates. No silos.

Mobile-first from browse to delivery

Most of Kindling's customers shop on their phones. The entire experience (discovery, product pages, cart, checkout, order tracking) had to be designed for mobile first, not adapted after the fact.

Editorial independence with brand control

The content team needed to build pages, publish magazine articles and feature products without developer involvement. But within brand guardrails, not a blank canvas.

Single team, full ownership

No more calling three vendors when something breaks. One team owns the storefront, the API, the data center and the courier app. One codebase. One point of accountability.

Built with

React
Next.js
TailwindCss
Storyblok
PostgreSQL
AdonisJS
Klaviyo /Redis /Meilisearch /TypeScript /Moneris /COVA POS /CIGO

01 — Our Approach

Building the hub

Shopify was the bottleneck. Every new integration meant another app, another monthly fee, another vendor who couldn't see what the other vendors were doing. So we ripped it out and built a central API hub in AdonisJS that owns all integration logic.

COVA POS for catalog and inventory. Leafly and Uber Eats for marketplace orders. Moneris for PCA compliant payments (one of few processors that supports cannabis retail in Canada). CIGO for delivery dispatch. Klaviyo for email marketing. Meilisearch for product search. The hub sits in the middle and makes sure they all talk to each other. One backend, one source of truth, one team responsible for the whole thing.

Kindling Cannabis storefront homepage powered by the central API hub

The storefront: one of four apps all connected through the hub

02 — Our Approach

Store routing without breaking URLs

Kindling operates multiple stores across different cities. The conventional approach would be URL-based routing: shopkindling.ca/toronto, shopkindling.ca/hamilton. That fragments SEO, breaks shared links and creates maintenance overhead.

Instead, we built cookie-based store resolution. The system detects the user's location through IP, geolocation or manual postal code input and resolves the first three characters of the postal code against a store mapping table. If a customer changes their delivery address mid-checkout and it maps to a different store, a confirmation modal appears and the cart switches atomically. No URL changes. No broken links. One storefront that behaves like many.

Store routing via postal code, no URL changes needed

03 — Our Approach

A CMS that knows about products

Most headless CMS setups treat content and commerce as separate worlds. We built Storyblok components that are aware of both the product catalog and the user's location. A Hero component can feature products from the customer's nearest store. A Collection component renders location-specific inventory. A FeaturedProduct block pulls live pricing and availability.

Content authors build editorial pages (including a full magazine-style blog) without touching code. The CMS enforces brand guidelines through component constraints, supports A/B testing on any component, and publishes with draft preview and webhook-driven revalidation. No deployments needed.

Storyblok CMS page builder for Kindling Cannabis with ecommerce-aware components

Page builder in Storyblok with product-aware and location-aware components

Kindling Cannabis magazine article with editorial content and embedded products

Magazine-style blog with location-aware product collections

04 — Our Approach

Search that keeps up with shoppers

Cannabis product catalogs are big, messy and full of strain names that customers only half remember. Shopify's default search couldn't handle it. Typos returned nothing. Partial queries returned everything. Filters were slow enough that people gave up.

We dropped in Meilisearch and indexed the full COVA catalog with typo tolerance, synonyms and faceted filtering. Search results come back in under 50ms. Customers can type 'bleu dream' or 'blue drm' and still land on what they want. Filters for THC range, price, category and brand update instantly. The whole thing runs on the hub, so inventory counts and pricing stay accurate to the store the customer is actually shopping from.

Sub-50ms search with typo tolerance across the full catalog

05 — Our Approach

Checkout without the friction

Cannabis checkout in Canada is regulated, complicated and usually painful. Age verification, delivery windows, store-specific inventory holds, PCA compliant payment processing. Most platforms bolt these on as afterthoughts and it shows.

We built a single-page checkout that handles all of it without making the customer feel any of it. Moneris processes the payment. CIGO gets the delivery dispatch. COVA locks the inventory. The hub coordinates the sequence so nothing falls through, and the customer sees one clean flow from cart to confirmation. On mobile (where most of Kindling's traffic comes from) checkout completes in under 60 seconds.

Kindling Cannabis checkout flow showing cart to confirmation in a single page

Single-page checkout coordinating five integrations behind one clean flow

What We Built

Headless architecture

Four decoupled applications (storefront, API hub, data center, courier app) all communicating through a single AdonisJS backend. No Shopify dependencies.

Instant search

Meilisearch-powered product search that returns results as you type. Filters by strain, brand, THC, CBD, product type and more.

Multi-location routing

Cookie-based store resolution via IP, geolocation and postal code. The storefront adapts to the user's location without changing URLs or breaking shared links.

Stepped checkout

A 4-step checkout (cart, fulfillment, delivery details, payment) that handles store switching, delivery validation and Moneris tokenization without overwhelming the user.

CMS page builder

Storyblok with ecommerce-aware components. Hero, Collection and FeaturedProduct blocks pull live product data and respect the user's location context.

Delivery integration

CIGO-powered delivery dispatch with a dedicated React Native courier app for shift management, trip acceptance, location tracking and proof of delivery.

Catalog sync

COVA POS sync in batches of 500 products. Multi-location inventory resolution, assortment management and Meilisearch indexing so the storefront always reflects what's on shelves.

Magazine blog

Full editorial blog with location-aware product collections embedded in articles. Content authors publish and feature store-specific products without developer help.

Results

Kindling went from a Shopify store held together by expensive apps to a unified platform where catalog, content, checkout and delivery all flow through one system. The franchise model finally has infrastructure that scales with it.

Performance 94, SEO 100, FCP under half a second

The storefront is fast. Lighthouse scores speak for themselves: near-perfect performance, perfect SEO, and first contentful paint in under 500ms.

Full editorial independence

The content team builds pages, publishes magazine articles and features location-specific products in Storyblok. No developer tickets. No waiting.

Everything talks to everything

Catalog, checkout, delivery, content and marketing all flow through one API hub. A change in one system is visible across all of them.

A partner, not a vendor

In the client's words: LT functions like partners who take ownership. Kindling's success is LT's success. When road bumps hit, we took accountability.

Lessons

01

Adding steps to checkout made it faster. Counterintuitive, but a 4-step flow (cart, fulfillment method, delivery details, payment) isolates each concern so the user never sees the underlying complexity of store switching, delivery validation and payment tokenization.

02

Building one API hub instead of point-to-point integrations paid for itself immediately. Adding a new integration means connecting it to the hub, not rewiring six other systems.

03

Cookie-based store routing instead of URL-based routing kept the SEO clean. Shared links work for everyone. One sitemap. No duplicate content problems across locations.

Outgrowing your ecommerce platform?

We build headless commerce platforms for multi-location retailers. One team, one codebase, full ownership. Let's talk about yours.