Introduction
Multi-tenant headless e-commerce platform fronting Shopify — one deploy serves many shops.
Nordcom Commerce is a multi-tenant headless e-commerce platform. A single Next.js deployment serves an arbitrary number of shops. Each shop is identified by hostname — no subpaths, no per-tenant builds. One deploy, many storefronts.
Platform pillars
Multi-tenancy by hostname. Middleware intercepts every request, resolves the Host:
header to a Shop row in Convex, and rewrites the URL to the tenanted App Router
tree before any page code runs. New tenants are added as database rows, never as code.
Shopify as the commerce layer. Product catalog, inventory, cart, checkout, and customer
accounts run through the Shopify Storefront and Admin APIs. The @nordcom/commerce-shopify-graphql
package wraps gql.tada and injects the @inContext directive automatically — route handlers
never touch Apollo directly.
A Convex-native content layer. Structured page content, navigation, articles, and
per-product metadata live in Convex, with the content shapes defined as field descriptors in
@nordcom/commerce-cms. The editor is mounted in the Admin app at /cms; the Storefront reads
content through the Convex cms/read functions. Block-level Shopify data is injected at the
storefront render boundary — the CMS package has no Shopify dependency.
Tag-based cache invalidation. The @tagtree family of packages declares cache tag schemas
as typed TypeScript objects. Shopify webhooks, the Convex revalidation pipeline, and manual
calls all target the same tag vocabulary — no hand-rolled string concatenation, no stale
entries after a mutation.
How the docs are organized
| Section | Contents |
|---|---|
| Docs | Platform concepts, getting started, app narratives, and operations guides |
| Packages | Narrative per-workspace docs: purpose, API surface, and changelogs |
| Reference | Auto-generated TypeDoc API reference for every exported symbol |
| Errors | Per-error-code pages with causes, examples, and throw-site listings |
The Reference tab is generated at build time from JSDoc and TypeScript types across the
monorepo. Concepts and Packages tabs are hand-written. Both link to each other using
typed cross-reference pills — click any symbol in a code block or prose to jump to its
Reference page.