Updates
How new versions reach you, how to apply one, and how to customise your store so updates stay easy.
Most updates are a git merge · Estimated time: 5–10 min, plus a redeploy
How updates are delivered
Updates are delivered through the GitHub repository. There is no auto-updater and nothing phones home — a new version is a new commit and a new release tag on the ShipCommerce repository, and you pull it into your own copy when you choose to.
That means your store has to be a git repository. If you deployed by uploading a folder rather than by cloning, there is nothing for git to merge into and there is nothing to merge. Getting your store into git first is the prerequisite for everything below.
An update has two halves: code, which arrives as a git merge, and database changes, which arrive as migration files and are applied separately. Doing one without the other is the usual cause of a broken store after an update.
Applying an update
Updates are applied with git. To review the incoming changes before merging, or to merge on a branch, these are the steps:
# once: point an 'upstream' remote at ShipCommerce
git remote add upstream https://github.com/ShipCommerce/ShipCommerce.git
# every update
git status # must be clean
git fetch upstream --tags
git tag --list --sort=-v:refname --merged upstream/main | head -n 5
# review what is coming before you take it
git diff HEAD..<tag>
git merge <tag>
npm install
npm run db:setupReplace <tag> with the newest release tag from the list. Merging onto a throwaway branch first is a good habit on a busy store: you get to see the conflicts without touching the branch you deploy from.
If the merge conflicts
This can happen, and it is worth being straightforward about it: if you have edited files that the new release also changed, git cannot combine both versions on its own. Git stops rather than guessing, leaving the conflict markers in place for you to resolve.
Resolve the conflicted files, then finish by hand:
git add . && git commit
npm install
npm run db:setupThose last two steps matter: after a conflicted merge, dependencies and database changes are still outstanding, even once the conflict is resolved and committed.
If a conflict looks unfamiliar, stop rather than guessing. git merge --abort puts you back exactly where you started, with nothing lost, so you can look at the conflicting files at your own pace.
After updating
- Build locally. Catch problems on your machine, not in production.
npm run build - Push and redeploy. Pushing to the branch your host builds from is enough on Vercel. Remember that any new
NEXT_PUBLIC_variable introduced by a release has to be added to your host before the deployment that needs it — those values are baked in at build time. - Make sure the database is up to date. If you are unsure whether the database changes were applied — or you skipped a step — run the setup again:
npm run db:setup - Click through the critical path. Load the storefront, open a product, place a test order with card
4242 4242 4242 4242, and confirm it appears in the admin panel.
npm run db:setup is idempotent — it is safe to re-run on a database that is already set up, and it is how new database objects land after you pull an update. If in doubt, run it.
If something is broken after an update, the Troubleshooting page covers the usual suspects.
Customising without pain
You have the source code and you are meant to change it. The cost of changing it is felt at update time, when git has to reconcile your edits with the new release. A few habits keep that cost low.
Commit before every update
This is the highest-value habit by a wide margin, and git will refuse to merge over uncommitted changes. With your work committed, a merge conflict is a reviewable diff between two known states rather than a tangle of your uncommitted edits and incoming changes — and git merge --abort always gets you back to safety.
Prefer configuration over code changes
Anything you can achieve with an environment variable or a setting in the admin panel costs nothing at update time. Store name, site URL, analytics, anti-bot, admin IP restrictions, the order webhook and email settings are all configuration — see the Configuration page before you reach for the editor.
Add rather than edit, where you can
A new file you introduce yourself will never conflict, because no release touches it. Rewriting a core file guarantees you will meet it again at every future update. When you do need to modify shipped code, prefer the smallest possible edit at the point where it is needed over a broad reorganisation.
An honest caveat: ShipCommerce does not have a plugin API or an override layer, and file locations are not promised to stay put between releases. There is no mechanism that makes your customisations immune to merges — the advice above reduces the friction, it does not remove it. Deep changes to core files are entirely allowed, and the tradeoff is simply that you will review those merges by hand.
Keep your customisations legible
Small, well-described commits that touch one thing each are far easier to reapply after a conflict than one large commit that changed twenty files. When you edit a core file, a brief comment saying why makes the decision reviewable months later, by you or by whoever resolves the next merge.
Never commit .env.local. It holds your service role key, database password and Stripe secrets. It is git-ignored by default — keep it that way, and set production values in your host's environment variable settings instead.
What your plan includes
Every plan ships the same complete platform — the full source code and every feature in the release you bought. What the plan decides is how long you keep receiving new releases and whether support is included.
| Plan | Feature and minor releases | Security and maintenance patches | Support |
|---|---|---|---|
| Starter | The release available at the time of purchase. Later feature and minor releases are not included. | Not included | Not included |
| Professional | Everything published in the twelve (12) months after purchase. | Twelve (12) months. | Email, six (6) months |
| Lifetime | Every future release for as long as the product is actively maintained. | All future patches. | Priority email, twelve (12) months |
Updates are delivered through the repository on every plan that includes them. The full and binding terms — including what support does and does not cover — are on the Purchase Plans page.
An update period ending does not switch anything off. The copy you have keeps working, and your licence to it is unaffected. You simply stop receiving new releases.
Questions
Email hello@shipcommerce.io. For a failed update, include the command you ran and the full output — a conflicted merge is usually a two-minute answer once someone can see which files git stopped on.