Shopify app development on localhost: tunnels, OAuth, and webhooks that work
A local Shopify app dev environment needs a public HTTPS tunnel, the right Node version, seeded env files, and a session store, here's how to get all four.
Shopify app development on localhost has four moving parts that trip people up: OAuth needs a public HTTPS callback, webhooks need a public URL to POST to, your app needs the Node version it was written for, and it needs somewhere to store sessions. Get those wrong and the app either won’t install or silently drops events. ReDock — a free-while-in-alpha native macOS app — sets up a Shopify app development environment that handles all four: a public HTTPS tunnel, auto-detected Node version, env-file detect and seed, and a session Postgres. To be clear up front: this is an environment for building Shopify apps, not a tool for managing a store’s products or orders.
Why localhost alone doesn’t work for Shopify apps
A Shopify app isn’t a static page you preview locally. It talks to Shopify’s platform, and the platform talks back — which is where localhost breaks down:
- OAuth redirects to a public URL. When a merchant installs your app, Shopify redirects to your callback.
http://localhost:3000isn’t reachable from Shopify’s servers, so the handshake fails without a public HTTPS address. - Webhooks are inbound POSTs. Shopify sends order, product, and app events to a URL you register. If that URL is localhost, the events go nowhere.
So the first requirement is a public HTTPS tunnel pointing at your local app. That’s the piece a plain npm run dev doesn’t give you.
The four things ReDock sets up
Here’s how ReDock covers the Shopify app dev checklist:
- Public HTTPS tunnel. ReDock exposes your local app at a real HTTPS URL so OAuth callbacks resolve and webhooks arrive. No separate tunnel tool to wire in.
- Auto-detected Node version. It reads
engines.node— including in aweb/subpackage, which Shopify app templates commonly use — and runs your app on the version it expects, instead of whatever Node happens to be on your PATH. - Env-file detect and seed. It detects the env files your app needs and seeds them, so you’re not hand-copying
.env.exampleand guessing which keys matter. - Session Postgres. Shopify apps need a session store; ReDock provisions a Postgres for it, no manual database setup.
The stacks docs cover the Shopify app environment, and the first-site guide covers importing your app.
What this environment is — and isn’t
This is the honest boundary, and it matters:
- It is a place to develop a Shopify app: run it locally, complete OAuth, receive webhooks, iterate. The Node version, tunnel, env, and database are handled so you spend time on your code, not the plumbing.
- It isn’t a store-management tool. ReDock doesn’t edit products, fulfill orders, or operate a live shop. If you’re looking for an agent that manages a storefront, that’s a different category — Shopify MCP: what agents can and can’t do draws that line carefully.
Keeping that distinction clear saves you from expecting the wrong thing.
Testing the full install flow locally
Because the tunnel is real HTTPS, you can exercise the parts that usually only work when deployed:
- Install the app against a development store and watch OAuth complete against your local code.
- Trigger webhooks and confirm your handlers receive them — testing Shopify webhooks locally walks through this without ngrok.
- Verify your env and Node setup before you ever deploy — the Shopify dev environment checklist is the pre-flight list.
Everything runs on your Mac; only the tunnel is public, and only while you’re sharing it.
FAQ
Can ReDock manage my Shopify store’s products or orders?
No. ReDock is a Shopify app development environment — it runs and exposes your app locally with OAuth, webhooks, Node, env, and a session database. It does not manage storefront data.
Do I still need ngrok?
No. ReDock provides the public HTTPS tunnel your app needs for OAuth callbacks and webhooks, so you don’t wire in a separate tunnel tool.
How does it know which Node version to use?
It reads engines.node from your app, including a web/ subpackage if present, and runs the app on that version rather than whatever Node is on your PATH.
Building a Shopify app and tired of the setup? Download ReDock to ReDock and get a working local app dev environment.