LUCENTCOMMERCEGET A FREE STORE AUDITFREE AUDIT

OPERATIONS · TECHNICAL · THEME · 23 APRIL 2026 · 7 MIN READ

The staging strategy for a store that never stops trading

Shopify has no staging environment and is not going to grow one. What it has is enough — if you know which of the four available environments each kind of change belongs in.

A quarter of work on a board, the week in progress marked

You stage on the live store, using unpublished themes, and you accept that this covers front-end changes only. A store can hold up to 20 themes with one published, so every branch can have its own theme and its own password-protected preview against real products, real inventory and real apps. What that setup cannot test is anything that writes data — checkout, payments, order flow, integrations — because putting your payment providers into test mode stops real customers buying. Those changes belong on a development store instead. Two environments, each with a job, and a clear rule about which change goes where.

IN SHORT

  • Shopify has no staging store, and the closest equivalent is an unpublished theme on the live store — real data, real apps, a preview URL, no effect on shoppers.
  • Shopify allows up to 20 themes in a store’s library with only one published at a time, which is the real ceiling on a branch-per-theme workflow.
  • You cannot test checkout on the live store: Shopify states that customers can’t place live orders while your payment providers are in test mode.
  • Anything that writes data — orders, inventory, customers, webhooks into an ERP — belongs on a development store, not on the store that is trading.
  • The GitHub integration syncs both ways: it updates the theme when the branch changes, and commits admin edits back to the branch so the two match.
  • That two-way sync is also the hazard — merchandisers edit the live theme’s settings while your branch is behind it, and a careless deploy overwrites their week.
  • Keep the previously published theme in the library after a cutover. Republishing it is the fastest rollback available, and it costs one of your 20 slots.

Four environments, and what each is honestly for

Shopify does not give you dev, staging and production. It gives you four places to work, each with different fidelity, and most staging arguments are really an argument about which one a particular change belongs in.

Local, with `shopify theme dev`. Fastest loop, runs against your store’s real data through the CLI. This is where code gets written. It is not where anything gets signed off, because it is one developer’s machine and nobody else can see it.

An unpublished theme on the live store. The highest-fidelity front-end environment that exists. Real products, real inventory, real prices, real apps, real traffic conditions — and a preview URL you can send to a client. Shopify allows up to 20 themes in the library with one published, so a theme per active branch is comfortably within reach for most teams. This is where review and sign-off happen.

A development store. A separate store you can break. Lower fidelity — different data, apps that may need reinstalling, sometimes a different plan — but it is the only place you can safely test anything that writes. Orders, refunds, inventory movements, webhook deliveries, an ERP integration: all of it here.

Production. Not an environment. A publish button.

The rule that follows is short enough to put in a README: if the change only affects what a page renders, stage it on an unpublished theme. If it changes what happens after someone clicks buy, stage it on a development store.

Why you cannot just test checkout on the live store

This is the constraint people hit first and argue with longest. To place test orders you either put Shopify Payments into test mode or enable the test payment gateway, and Shopify is explicit about the consequence: customers can’t place live orders while your payment providers are in test mode. On a store that trades continuously, that is an outage you have chosen.

The alternative Shopify offers — place a real order through a real provider, then immediately cancel and refund it — works and has costs. You may still pay processor fees, and more importantly the order is real everywhere downstream. It hits your ERP, your 3PL integration, your accounting export and your analytics, each of which now contains a transaction that was not one. For a single smoke test after a payment configuration change that is an acceptable trade. As a way of testing a new checkout flow, it is not.

So the awkward fact stands: checkout is tested on a development store or it is tested in production on real customers. Build the development store properly, because the alternative is worse than it looks.

The two-writers problem, which is the real hazard

Most theme disasters are not bad code. They are two people writing to the same theme with different ideas about what it contains.

Your repository holds the code. The admin holds the settings — and merchandisers edit those daily, through the theme editor, on the published theme. Shopify’s GitHub integration keeps a branch and a theme in step in both directions: it updates the theme when the branch is updated, and it commits changes made in the admin back to the branch so that the two always match. That is genuinely useful and it is also where the collisions live. Shopify’s own documentation notes that when both sides change at once, the commit coming from Shopify may be treated as outdated and rejected.

Three habits keep this from becoming an incident:

  • Never deploy settings blindly. A deploy that pushes settings_data.json from a branch created three weeks ago silently reverts every merchandising change made since. Decide explicitly whether settings are deployed or excluded, and write the decision down where the deploy command lives.
  • Pull before you build. A branch for a new feature should start from the current state of the published theme, including its settings, not from whatever was there last sprint.
  • Publish deliberately, with a window. Publishing is instantaneous and store-wide. Do it when someone is watching, not at 5pm on a Friday, and tell the people who answer the phones.

What a cutover looks like when the shop is open

For a front-end release, the sequence is short and the value is all in the last item.

Review on the unpublished theme against the live one at three widths. Confirm which settings are being carried across and which are being left alone. Publish. Walk the critical paths on the real store immediately — home, a collection, a product with variants, add to cart, into checkout as far as the payment step. Then watch conversion and JavaScript errors for an hour rather than declaring victory in a channel.

The rollback plan is the part teams skip because it feels superstitious. It should not: the previously published theme is still in the library unless somebody deleted it, and republishing it puts the store back in seconds. That is a better rollback than most applications have. It costs one of your 20 theme slots, which is the cheapest insurance on this list. Keep at least the last known-good version, and prune old branches rather than old releases when the library fills up.

The one thing a theme rollback does not undo is a settings change. If the release included new sections with new settings, republishing the old theme restores the old arrangement — which is usually what you want, and worth knowing before you need it.

Apps, integrations and the environments they need

Everything above concerns the theme. Custom apps and integrations need their own answer, and it is a more conventional one.

A custom app has staging in the ordinary sense: its own hosted instance, its own database, its own credentials, pointed at a development store. What makes it awkward is that the other side of the integration frequently has no sandbox. Your ERP might; your 3PL might not; a legacy system almost certainly does not. Where there is no sandbox, the realistic approach is a recording of real payloads replayed against your staging instance, plus a hard rule that staging credentials cannot reach a production endpoint. That rule needs to be enforced in configuration, not in a person’s memory.

Webhooks deserve particular care because they are the most common source of the worst kind of accident: a staging app subscribed to a production store, quietly processing real orders. Subscriptions are per store, so keep the development store’s webhook targets and the production store’s in separate configuration that cannot be copied between them by accident.

And check the apps themselves. An app installed on your development store may be on a different plan, a different version, or absent entirely — which means a front-end change that depends on an app is one of the few cases where the development store is the *less* faithful environment, and the unpublished theme is the right place to test it.

The setup we would actually recommend

Resist the pyramid. Teams coming from application development often try to build four tiers with data syncing between them, and on Shopify the maintenance of that exceeds the risk it removes. The cheapest setup that works:

One repository with a branch per change, connected to unpublished themes for anything that needs review. One development store, kept installed and configured, for anything that writes data. A written rule about which changes go where. A deploy that never pushes settings without someone deciding. And the previous theme left in the library after every publish.

That is a weekend of setup and it covers most of what a trading store needs. If you want the next step up, it is not another environment — it is automating the checks on the one you have, which we covered in [theme CI](/blog/theme-ci-testing-a-shopify-theme-before-it-ships).

The thing most worth protecting is the habit rather than the tooling. Stores that stay stable are not the ones with the most environments; they are the ones where nobody has pushed to the live theme from a laptop in two years. That discipline is most of what a [maintenance and store management arrangement](/services/support) is actually buying.

Questions this raises

Does Shopify have a staging environment?

Not as a product. The nearest equivalent is an unpublished theme on the live store, which gives you real data and real apps with a private preview URL and no effect on shoppers. For anything that writes data — orders, inventory, integrations — you need a separate development store.

How many themes can I have for staging?

A store can hold up to 20 themes with one published at a time. That is enough for a theme per active branch on most teams, but it is a real ceiling — prune merged branches, and keep the last known-good published theme as your rollback.

Can I test checkout without stopping real orders?

Not on the live store. Shopify states that customers can’t place live orders while your payment providers are in test mode, so enabling test mode on a trading store is a deliberate outage. Test checkout on a development store, and keep live testing to a single real-then-refunded order after a configuration change.

How do I stop a deploy overwriting merchandising changes?

Decide explicitly whether `settings_data.json` is part of your deploy, and configure the deploy command accordingly rather than relying on anyone remembering. Start every branch from the current published theme’s settings, and treat a settings revert as a production incident, because that is what it looks like to the people who made those changes.

Should I use a development store as a copy of production?

Keep one configured and useful, but do not chase a faithful copy. Data drifts immediately, apps may be on different plans or missing, and the effort of syncing it exceeds the value. Use it for behaviour that writes data, and use an unpublished theme on the live store for anything visual or app-dependent.

What is the fastest way to roll back a theme release?

Republish the previous theme. It takes seconds and it is why the old theme should survive every cutover. What it will not undo is settings work done since the release, so confirm what the release changed in configuration before you rely on it as a complete rollback.

NEXT STEP

Free store audit

A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritised list of fixes.