Build Shopify appswith real workflows.
Build custom Shopify apps from typed flows, reusable providers, observable runs, retries, logs and an embedded admin UI.
Build Shopify integrations from real app primitives.Flows, providers, crons, webhooks, functions and run logs are first-class code.
The framework owns the repeatable pieces.
OpenShop gives agencies, freelancers and ecommerce teams a code-first base for Shopify integrations.
Checkpointed flows
Write Shopify jobs as typed flows with named steps that can resume after failure.
Provider contracts
Define external connectors once, including typed config fields for the admin UI.
Crons, webhooks, functions
Schedule flows, handle Shopify webhooks and register Shopify Functions from config.
Run visibility
Inspect runs, logs, provider status and retries from the embedded admin.
Real OpenShop features, shown in code
These examples come from the OpenShop demo app and README: sync flows, provider config, crons, webhooks, functions, logs, tests and MCP tools.
export const syncOrders = app.defineFlow({ name: 'syncOrders', input: type({ limit: 'number.integer > 0' }), async run({ input, shopify, connectors, step, logger }) { const orders = await step('fetch-orders', async () => { logger.info({ limit: input.limit }, 'Fetching latest orders from Shopify...') return shopify.graphql(`#graphql query GetRecentOrders($first: Int!) { ... }`) }) await step('send-to-warehouse', async () => { await connectors.warehouse.push(orders) }) },})OpenShop flows are typed jobs with named checkpointed steps. If a run fails mid-way, retries resume from the failed step.
Start from the CLI.
Initialize a new OpenShop app, then define flows, providers, webhooks and scheduled jobs in code.
Build the app your client actually needs.
Start with flows, providers, webhooks and run visibility, not app scaffolding.