Skip to content

OpenShop

OpenShop is a Shopify integration framework for building apps that need background jobs, provider credentials, scheduled work, app proxy endpoints, Shopify Admin GraphQL calls, and an embedded admin UI.

Use OpenShop when you want the application code to own the integration logic while the framework handles the repetitive operational surface: OAuth installs, stored shop access, provider configuration, flow runs, step checkpoints, logs, migrations, and workers.

An OpenShop app usually contains:

  • providers for external systems such as warehouses, ERPs, CRMs, or analytics tools;
  • flows for background work such as syncing orders or reconciling inventory;
  • proxy routes for storefront app proxy and Customer Account extension requests;
  • webhooks for Shopify event handlers;
  • optional Shopify Function management UI definitions;
  • migrations and app models for PostgreSQL-backed state.

Build your first app

Create a new OpenShop project, run it locally, and verify the generated app works.

Define a provider

Add a typed connector with config fields, validation, and a health check.

Define a flow

Create a checkpointed background job that calls Shopify and a provider.

Deploy to production

Build the app, apply committed migrations, and run web and worker processes.

import { defineOpenShop, defineProvider } from 'openshop'
const warehouse = defineProvider({
name: 'warehouse',
ui: {
fields: {
apiUrl: { type: 'text', label: 'API URL' },
apiKey: { type: 'password', label: 'API key' },
},
},
methods: {
async push(config, rows: unknown[]) {
await fetch(`${config.apiUrl}/orders`, {
method: 'POST',
headers: { Authorization: `Bearer ${config.apiKey}` },
body: JSON.stringify(rows),
})
},
},
})
const app = defineOpenShop({
providers: { warehouse },
})
const syncOrders = app.defineFlow({
name: 'syncOrders',
async run({ step, connectors }) {
const orders = await step('fetch-orders', async () => [])
await step('push-orders', async () => connectors.warehouse.push(orders))
},
})
export default app.defineConfig({
flows: { syncOrders },
crons: [{ schedule: '*/5 * * * *', flow: 'syncOrders', shops: 'all' }],
})

Tutorials teach a complete first success path. Guides solve one task. Reference pages list exact APIs, options, defaults, constraints, and failure modes.