Catalog, checkout, payments, returns, campaigns, partners, reviews, email and AI content are modules on one database, not integrations.
A platform, a CMS, a reviews widget, an affiliate tool, an email tool and a BI seat. Each one holds a piece of the truth, none of them agree, and every one of them sends an invoice.
Because reviews and orders share a database, a verified-buyer badge is a join rather than a claim. That is the whole difference between twenty-three modules and twenty-three subscriptions.
Build, sell, grow, run
The admin computes the work, puts it on a calendar, and talks to the services you already use.
Each one is computed from live store data and shows what it is worth. Ship the order and the task disappears.
A sale is live when now is inside its window. No job to run, nothing to switch off.
Search, actions and the AI assistant open from anywhere in the admin.
Payments, email, storage, cache and analytics each work through their own interface.
The products block reading your catalog with your theme settings. No template was forked and no starter was cloned to get here.
4 colours · in stock
$1286 colourways · machine washable
$96order.paid, cart.abandoned, return.approved, collab.commission.accrued. A workflow is an event name and a function — waits of days survive restarts.
Payments, email, storage, cache, analytics and newsletters each sit behind their own interface. An unconfigured service hides its screens rather than failing halfway.
Every module sits in one of four groups, and every one reads the same tables.
Build
Blocks, pages, themes and AI-written content.
Sell
Catalog, stock, cart, checkout, payments, markets.
Grow
Discounts, campaigns, partners, reviews, email, search.
Run
Orders, returns, customers, reporting and the API.
It also means more for the assistant to work with. An AI that only sees products can write product descriptions. This one sees orders, customers and reviews, so it can suggest an action rather than a sentence.
No account, no CLI login and no dashboard in between. Configuration is checked at startup, so a missing value stops the boot rather than breaking checkout later.
Postgres, Redis, S3 and an email sender are required. Stripe is only needed for checkout — browsing and carts work before payments are wired.
Wemovedoffahostedplatformandkepteveryorder.
Sarah Chen
Founder, Oat & Ash
Write it into the same codebase. The compiler checks it fits.
lib/rules/workflows.ts
Durable{
event: "cart.abandoned",
name: "recover-abandoned-cart",
run: async (payload, step) => {
await step.sleep("settle", "3d")
await step.run("send-offer", () =>
queueEmail({ template: "cart-recovery", to: payload.email })
)
},
}A full cart-recovery flow. The three-day wait survives restarts and deploys, and the email is sent once.
React to any domain event in one entry
Add a block type the compiler then demands you finish
Place your own module into a PDP section
Inherit list, detail, mutations, activity, and permissions
Plus payment providers, outbound webhooks, swappable services, and checks that fail the build when an extension is wrong.
How extensibility worksThese are seams inside your own copy of the code. There is no versioned plugin API.
None behind a paid tier
One Prisma schema
Across 151 files
Each bindable to a workflow
What you clone is what you run. There is no private repository behind it.
Everything from catalog to collabs is included, with no paid tier holding modules back.
Pick an event and write what should happen. Waits of days survive a deploy.
Reviews and orders are in the same database, so a verified-buyer badge is checked against a real order.
Clone the repository and every module is already there.