Not published by Open Mercato. Review the code before you install it. Open the repository.
When to use
Use when a Shopify store stays the sales front and the app needs its catalog, customers and orders on a schedule.
When not to use
Import only: nothing is written back to Shopify.
What it adds
3 events other modules can react to.
3 permissions to give to roles.
Works with
Shopify
Readme
This is the author's README, shortened. To install, use the steps in Install.
The catalog tests those steps. Install notes in the README may be out of date. The author declares Open Mercato >=0.6.6 <0.7.0. The catalog's test installed it on 0.9.
@northbound-run/sync-shopify
Sync a Shopify store into an Open Mercato app — products, collections, customers, orders and inventory — mapped onto Open Mercato's native catalog, customer and sales entities. Import-only, read-only against Shopify, and safe to run on a schedule.
The package registers five independent Data Sync integrations under one shared Shopify connection. Each can be enabled, scheduled and run on its own.
Show the full README
Integration
Shopify → Open Mercato
Notes
Products
products, variants, prices
Per-product variant reconciliation; deletes handled on full sync
Collections
collections → product categories
Membership synced; smart-collection rules are not preserved
Customers
customers, addresses
Addresses reconciled per customer
Orders
orders, lines, discounts, payments, fulfillments
Totals reconciled to the cent; limited to the last 60 days unless the app holds read_all_orders
Inventory
daily stock snapshots + out-of-stock history
Owns one table; enables demand-planning corrections
Requirements
An Open Mercato app on @open-mercato/core 0.6.x or later, with the integrations and data_sync modules enabled.
Node.js 24+ (native fetch, AbortSignal.timeout).
PostgreSQL (the framework's database).
A configured credential encryption key — Vault KMS or TENANT_DATA_ENCRYPTION_FALLBACK_KEY. Without one, storing the Shopify credentials fails outright (the framework encrypts them at rest).
For scheduled and background syncs: @open-mercato/queue on its Redis/BullMQ strategy and @open-mercato/scheduler. Without them the sync still runs on demand, but not unattended.
module add registers the module in src/modules.ts and runs mercato generate. db:migrate applies the single migration this package ships (the inventory snapshot table).
The package declares @open-mercato/core / @open-mercato/shared as peer dependencies — your app provides them. This matters: the Data Sync adapter registry is process-global, so a second, nested copy of core installed under this package would leave the adapters invisible to queue workers.
The --allow-third-party flag is required because the package is not under the @open-mercato scope — it is a supply-chain opt-in, nothing more.
Connect a Shopify store
This module authenticates with Shopify's client credentials grant: your app exchanges its own client ID and secret for a short-lived access token, with no browser redirect and no user login. It is the grant Shopify intends for a server-to-server integration against a store you control, which is exactly the self-hosted case here.
Why no access token to paste? Newer Shopify apps do not expose a permanent Admin API token in the UI — only a client ID and client secret (the value beginning shpss_). The module mints and refreshes a 24-hour token from those automatically; you never handle the token yourself.
Configure its Admin API access scopes (see below).
Install the app on the store. The client credentials grant only works for a store the app is installed in.
From the app's Settings → API credentials, copy the Client ID and Client secret.
2. Required scopes
Configure these on the app, then release a new app version — scope changes take effect only on release, and an already-installed app must re-approve them.
Scope
Enables
read_products
products, variants, prices — and collections
read_customers
customers and addresses
read_orders
orders (last 60 days — see below)
read_inventory
inventory levels and unit cost
First 4,000 characters. Full README on npm or in the repository.
Technical details for maintainers and agentsTest results per Open Mercato version, anatomy, versions, receipts, quality and agent rules.
0.8.0 · previousEvery import resolves against the published 0.8.0 packages. Not installed yet. Queued for Sunday's run (02:17 UTC).
next · 0.10.1-develop.7701Every import resolves against the published 0.10.1-develop.7701 packages. Not installed yet. Queued for tonight's run (02:17 UTC).
Transitions
29 Oct 20260.9 · OM 0.9.0new → verified · confirmedmodule 0.5.0receipt
Quality
Verified on 0.9 · 5 of 5 rules pass
✓VER-1Receipt on 0.9: verified (0.5.0).
✓VER-2Fits statically on 0.9: ok.
✓VER-3Supply chain: ok.
✓VER-4No lint errors.
✓VER-5Tarball repository.url matches the descriptor.
Installed in a new Open Mercato 0.9.0 app on 29 Oct: scaffold, install, add, generate, typecheck, initialize, build, start, smoke. A module's own code runs during the test. Verified is a compatibility signal, not a security review. How levels work