Documentation Index
Fetch the complete documentation index at: https://docs.launchmystore.io/llms.txt
Use this file to discover all available pages before exploring further.
App Versioning & Rollback
LaunchMyStore tracks every release of your app as an immutable version record. Merchants install a version, not just an app — which means a bad release can be rolled back per-merchant without you re-publishing fixed code, and merchants can choose between auto-update (always run the latest) or pinning (stay on a known-good version). This page walks through the full lifecycle: create → publish → deprecate → rollback.Why Versioning Matters
Safe rollouts
Publish a version. If reports come in, deprecate it — auto-update merchants stay where they are; new installs get the previous version.
Per-merchant rollback
A single merchant hitting an edge case can pin themselves to v1.4.2 while the rest of the world runs v1.5.0.
Audit trail
Every publish, deprecate, and rollback is recorded with actor + timestamp in the version changelog.
Predictable behavior
Once a version is published, its
extensions, functions, and wasmPaths are frozen. Editing them creates a new version.Version Lifecycle
| Status | Meaning | Installable? | Visible in Marketplace? |
|---|---|---|---|
| draft | Created but not yet released | No | No |
| published | Current live version | Yes (default for new installs) | Yes |
| deprecated | Previously published, superseded | Yes (rollback target) | No (existing installs only) |
published again. Cut a new version instead.
Semver Requirements
Every version string must be valid semver:1.0.0✅2.3.1-beta.4✅1.0❌ (missing patch)v1.0.0❌ (no leadingv)
semver.gt().
-beta, -rc.1) are allowed and follow standard semver precedence: 1.5.0-beta.1 < 1.5.0-rc.1 < 1.5.0.
Create a Draft Version
extensions / functions are omitted, the API snapshots the app’s current values. The snapshot is immutable — re-installing the app will not push fresh extension code into a published version. Cut a new version instead.
Response (201):
Publish a Version
- Validates the target version exists and is in
draftstatus - Marks the previous published version as
deprecated(deprecated_at= now) - Marks the target version
published(published_at= now) - Updates the parent app’s
versioncolumn to the new version string - Cascades to installations: every
app_installationrow withauto_update = truegetsinstalled_versionupdated to the new version - Writes a row to
app_version_changelogwithaction = 'published'
auto_update = false (pinned) are left untouched.
Deprecate a Version
deprecated and stamps deprecated_at. Existing installations are not migrated — merchants pinned to it stay there. New installs and auto-update merchants will fall back to the most recent non-deprecated version.
Use this when:
- A version has a critical bug and you’ve already published a fix
- You want to remove a version from the marketplace listing without forcing migrations
List Versions
Version Stats
Per-Installation Rollback (Merchant Side)
A merchant who hits a bug in1.5.0 can roll their store back to 1.4.2 without affecting any other merchant.
- Verifies the target version exists and is
publishedordeprecated(cannot rollback todraft) - Updates
app_installation:installed_version = '1.4.2'pinned_version = '1.4.2'auto_update = false← key side effect
Resume Auto-Update
When the merchant is ready to re-join the auto-update channel:- Sets
auto_update = true - Clears
pinned_version - Updates
installed_versionto the currentpublishedversion
Auto-Update vs Pinned
| Setting | When publishes happen | Use case |
|---|---|---|
auto_update = true (default) | Installation jumps to new version immediately | Most merchants — they want bug fixes & features |
auto_update = false (pinned) | Installation stays on pinned_version until manually changed | Enterprise merchants on a change-control schedule, or merchants who hit a regression |
Snapshotting What Goes In a Version
A version captures three things at publish time:extensions— JSON manifest of every block, snippet, checkout extension, post-purchase extension, and admin extension shipped by the appfunctions— JSON manifest of every function (cart_transform, shipping_rate, etc.), including their input schema and targetwasmPaths— R2 storage paths for compiled WASM modules
Breaking Changes & Migrations
If a new version requires merchants to do something (re-grant scopes, configure new settings, etc.):- Bump the major version (
1.x.x→2.0.0) so the change is visible - Document the breaking change in
releaseNotes - Consider keeping the previous major version
publishedfor 30+ days so merchants have time to migrate - Use the
app/scopes_updatewebhook (sent on every publish) to notify yourself when an installation actually picks up the new version
CLI Workflow
Thelms CLI wraps the version endpoints. Run any of these from inside an app project — --app is inferred from .lmsrc.json and only needs to be passed explicitly when you’re outside the project directory.
Merchant-side rollback
These commands act on a specific installation (a merchant’s install of your app), not on the app itself. Use them when a merchant reports a regression or wants to opt back into auto-updates.lms app rollback calls POST /apps/store/installations/:id/rollback and lms app resume-auto-update calls POST /apps/store/installations/:id/resume-auto-update — see Per-Installation Rollback above for the server-side behavior.
Best Practices
Test before you cut a version, not after
Test before you cut a version, not after
Drafts in CustomerLMS are records, not installable artifacts — the install path requires a
published or deprecated version, so there’s no “install this draft on a test store” shortcut. Instead, test before you bump the version:- Iterate locally with
lms app dev(live-reloads extensions into a dev store) andlms function test(runs declarative functions against fixture inputs). - Install your app on a developer-owned test store from a previous published version, then point that install at your in-progress code via the dev tunnel.
- Only run
lms app deploy(orversion create+version publish) once the change is green on the test store.
Keep at least one prior published version available
Keep at least one prior published version available
Don’t deprecate the previous version the same minute you publish a new one. Wait 24-48 hours so any auto-update merchants who hit a bug have a known-good rollback target.
Use semver to communicate intent
Use semver to communicate intent
PATCH (1.4.2 → 1.4.3) for bug fixes. MINOR (1.4.0 → 1.5.0) for backwards-compatible features. MAJOR (1.x.x → 2.0.0) for breaking changes that need merchant action.
Write release notes for humans, not machines
Write release notes for humans, not machines
releaseNotes is shown to merchants in the dashboard before they auto-update. “Fixed bug in cart” is useless. “Fixed: cart total was off by $0.01 when discount + tax both applied” is useful.Keep extension code in your app repo, not in the version snapshot
Keep extension code in your app repo, not in the version snapshot
Treat the version snapshot as a build artifact. Your source-of-truth is your git repo + CI pipeline that calls
lms app version create on every release tag.Related
- App Lifecycle — install/uninstall webhooks fire on every version change
- CLI Setup —
lms app version *commands - Webhooks —
app/scopes_updatenotifies you when a merchant picks up a new version