Loading...
Loading...
Apply when installing, publishing, upgrading, or rolling back a VTEX IO storefront theme app (`vendor.store-theme` or any app that owns `store/blocks.json`, `store/routes.json`, and `store/contentSchemas.json`). Covers how Site Editor and theme content are scoped by the app's MAJOR version, why a major version bump leaves the new major with no merchant content and silently falls back to default theme content, the safe install-in-workspace, migrate- content with the `updateThemeIds` mutation, smoke-test, then promote workflow, the 3-way mine-wins merge that `vtex workspace promote` performs against `vtex.pages-graphql` VBase (with automatic per-minute `userData_backup` snapshots when conflicts are resolved), and the support-led recovery path. Use for any operation that changes which version of a content-holding app is installed in `master`.
npx skill4agent add vtex/skills vtex-io-storefront-theme-versioningvendor.store-themestore/blocks.jsonstore/routes.jsonstore/templates/store/contentSchemas.jsonmastervtex release patch | minor | majorvtex publishvtex deployvtex install vendor.store-theme@X.Y.Zmasterinterfaces.jsonvtex-io-render-runtime-and-blocksreact/vtex-io-storefront-reactmanifest.json#settingsSchemavtex-io-app-settingsvtex-io-masterdata-strategystore/vtex.pages-graphqlvendor.app@MAJOR.x:templateacme.store-theme@0.x:store.homeacme.store-theme@0.x:store.productpatch0.0.610.0.62minor0.1.00.2.0major0.x5.xvtex.pages-graphqlvtex.store-themevtex release majorpatchminorupdateThemeIdsvtex.pages-graphql@2.xvendor.app@{oldMajor}.xvendor.app@{newMajor}.xvtex use rollout-workspace --productionvtex linkvtex installvtex workspace promoteupdateThemeIdsvtex.pages-graphql@2.xvtex install vtex.admin-graphql-ide@3.xvtex browse admin/graphql-idevtex installvtex workspace promotevtex workspace promoteupdateThemeIdsupdateThemeIdsupdateThemeIds5.x4.xvtex workspace promotevtex.pages-graphqlMineWinsConflictsResolverbasemastermineMineWinsConflictsResolvervtex.pages-graphqlbasemastermineuserData_backupsubject: "conflicts_resolution"io_vtex_logsupdateThemeIdsvtex release majorMAJOR.xmasterupdateThemeIdsvtex.pages-graphql@2.xvtex.pages-graphqlmasterupdateThemeIdsvtex.pages-graphqlvendor.app@MAJOR.x:templatevtex.store-themeupdateThemeIdsvtex install vendor.app@X.Y.ZXvtex ls --production | grep store-themeXupdateThemeIdsvtex release majorstore/blocks.jsonstore/routes.jsonstore/templates/store/contentSchemas.jsonpatchminorupdateThemeIdsvtex use theme-rollout --production # creates and switches to a production-flag dev workspace
vtex install acme.store-theme@5.0.0
vtex install vtex.admin-graphql-ide@3.x # required to access the GraphQL IDE
vtex browse admin/graphql-ide
# In the IDE, select the app `vtex.pages-graphql@2.x` from the dropdown and run:
#
# mutation {
# updateThemeIds(
# from: "acme.store-theme@0.x",
# to: "acme.store-theme@5.x"
# )
# }
#
# Expected response: { "data": { "updateThemeIds": true } }
# Validate Site Editor, Pages, and Redirects in this workspace, then:
vtex workspace promotevtex release major
vtex publish
vtex install acme.store-theme@5.0.0
# installed straight to master — no merchant content is visible under @5.x
# and the storefront falls back to default vtex.store-theme contentmastervtex use $name --productionvtex workspace promotemastermastermastervtex installmastervtex use theme-rollout-2026-04 --production # creates and switches to a production-flag dev workspace
vtex install acme.store-theme@5.3.5
# if this install crosses a MAJOR boundary, run updateThemeIds before smoke tests.
# fetch home, PDP, PLP, search, custom routes from $workspace--$account.myvtex.com
# only after smoke tests pass:
vtex workspace promotevtex use master
vtex install acme.store-theme@5.3.5
# any failure is now publicmastervtex publishpages-graphqlupdateThemeIds# pull the published artifact and confirm it ships the custom blocks
vtex apps files acme.store-theme@5.3.5 store/ | grep -E 'umMaisUm|customHeader'
# matches the block IDs the active theme depends onvtex publish
vtex install acme.store-theme@5.3.5
# published artifact is the boilerplate fork; it is missing every custom block
# referenced in the merchant's stored contentvtex workspace promotevtex workspace promotevtex.pages-graphqlMineWinsConflictsResolver@vtex/apibasemastermineupdateThemeIdsbasemastermineuserData_backupvtex.pages-graphqlsubject: "conflicts_resolution"Coordinate the rollout window with the merchant ops team:
- Pause Site Editor edits on master from the moment `updateThemeIds`
runs in the dev workspace until `vtex workspace promote` completes.
- Smoke-test in the dev workspace, then promote.
- After promote, validate Storefront → Site Editor, Pages, Redirects
on master.
If a conflict-resolution log appears (subject: "conflicts_resolution"),
record the backup paths surfaced by pages-graphql in `io_vtex_logs`.
The snapshot lives in the `userData_backup` bucket of vtex.pages-graphql
and can be fetched via the VBase v2 API for support escalation."Promote will replace master, so we don't need to coordinate."
- Merchants keep editing Site Editor in master during the rollout.
- Promote merges those edits with mine-wins; every conflicting key is
silently overwritten by the dev workspace value.
- Without a smoke-test or coordination, the lost edits are not noticed
until shoppers report missing content.master1. Decide the SemVer bump deliberately
- patch → bug fix, no block contract change
- minor → new optional block, backward-compatible additions
- major → ANY structural change that breaks an existing block contract
(avoid when possible; requires the updateThemeIds migration)
2. vtex release [patch|minor|major]
vtex publish
3. Switch to a production-flag dev workspace
(vtex use both creates and switches in one step)
vtex use theme-rollout-YYYY-MM-DD --production
4. Install the new version in the dev workspace
vtex install vendor.app@X.Y.Z
5. If the bump crosses a MAJOR boundary (including downgrades such as 5.x → 4.x):
a. vtex install vtex.admin-graphql-ide@3.x (if not already installed)
b. vtex browse admin/graphql-ide
c. In the IDE, select the app `vtex.pages-graphql@2.x` from the dropdown
d. Run:
mutation {
updateThemeIds(
from: "{appVendor}.{appName}@{oldMajor}.x",
to: "{appVendor}.{appName}@{newMajor}.x"
)
}
Keep the literal "x" in both keys; do not replace it with a minor or
patch number or the mutation silently fails.
e. Expected response: { "data": { "updateThemeIds": true } }
If the bump is patch or minor inside the same major, skip this step —
content keys are preserved automatically.
6. Smoke-test in the dev workspace against the full page set
- $workspace--$account.myvtex.com/ (home)
- $workspace--$account.myvtex.com/<pdp-slug>/p (product)
- $workspace--$account.myvtex.com/<category> (PLP)
- $workspace--$account.myvtex.com/<dept> (department)
- $workspace--$account.myvtex.com/<search>?_q (search)
- any /institucional/* or other custom routes
- VTEX Admin → Storefront → Site Editor, Pages, Redirects
- account, login, cart, checkout entry
7. If anything is wrong: stop. Do not promote. Investigate.
If everything renders correctly:
- Coordinate the promote window with the merchant ops team so that
no Site Editor edits land on master between `updateThemeIds` in
the dev workspace and `vtex workspace promote`. Promote performs
a 3-way mine-wins merge against pages-graphql VBase, so any
conflicting master edit will be overwritten by the dev workspace.
- vtex workspace promote
8. Re-test on $account.myvtex.com (master) and the public domain.
- Validate Storefront → Site Editor, Pages, Redirects on master.
- If the public CDN serves stale content, validate with cache-busting
query strings; the edge will refresh on its normal TTL.
- If `io_vtex_logs` shows a `subject: "conflicts_resolution"` entry
for `vtex.pages-graphql` in this account around the promote time,
record the listed backup paths. They live in the `userData_backup`
bucket of pages-graphql and can be fetched via the VBase v2 API
if a recovery is needed later.
9. Keep the dev workspace for at least one business day in case a fast
re-promote is needed.master1. vtex use rollback-YYYY-MM-DD --production
(vtex use both creates and switches; there is no `vtex workspace create`)
2. vtex install vendor.store-theme@<previous major version>
3. If the rollback crosses a MAJOR boundary (it almost always does), run
updateThemeIds in vtex.pages-graphql@2.x to migrate stored Site Editor
edits, Pages, and Redirects from the broken major back to the previous
major:
mutation {
updateThemeIds(
from: "{appVendor}.{appName}@{brokenMajor}.x",
to: "{appVendor}.{appName}@{previousMajor}.x"
)
}
4. Smoke-test the rollback workspace end-to-end (storefront pages and
VTEX Admin → Storefront → Site Editor, Pages, Redirects).
5. vtex workspace promote
If `updateThemeIds` returns false, the GraphQL IDE shows an error, or
content does not appear after migration, escalate to VTEX support
before promoting; do not promote a workspace whose Site Editor content
has not been validated.
If a previous promote merged in something unwanted, before re-promoting
check `io_vtex_logs` for a `subject: "conflicts_resolution"` entry on
`vtex.pages-graphql` for this account around the original promote
time. The entry lists per-minute snapshot paths inside the
`userData_backup` bucket (`store/templates.{base|master|mine}.<TS>.json`,
`store/content.{...}.json`, `store/routes.{...}.json`) which can be
fetched through the VBase v2 API:
GET https://infra.io.vtex.com/vbase/v2/{account}/{workspace}/
buckets/vtex.pages-graphql/userData_backup/files/{path}
This recovery path requires an admin auth token and is documented in
`vtex/pages-graphql` `TROUBLESHOOTING.md`. Treat it as a support-led
escalation, not a routine self-service step, and always test the
restored payload in a non-master workspace first.Patch / minor bump
acme.store-theme @ 0.0.61 → 0.0.62
storage key prefix unchanged: acme.store-theme@0.x:*
merchant content carries over automatically
Major bump
acme.store-theme @ 0.0.61 → 5.0.0
storage key prefix changes: acme.store-theme@0.x:* → acme.store-theme@5.x:*
the new major starts empty from the resolver's point of view
run updateThemeIds in vtex.pages-graphql@2.x inside the production-flag
dev workspace to rekey Site Editor edits, Pages, and Redirects from
acme.store-theme@0.x to acme.store-theme@5.x, then promotevtex release majorupdateThemeIdsmasterupdateThemeIdsvtex linkvtex installlinkvtex workspace promoteupdateThemeIdsvtex.store-themevtex workspace createvtex use {workspaceName} --productionxupdateThemeIdsacme.store-theme@5.0.0acme.store-theme@5.xupdateThemeIdsvtex.pages-graphql@2.x?utm_source=<value>5.x4.xupdateThemeIdsvtex workspace promotevtex.pages-graphqluserData_backupvtex.pages-graphqlupdateThemeIdsupdateThemeIdsvtex use $name --productionmasterupdateThemeIdsvtex.pages-graphql@2.x{ "updateThemeIds": true }updateThemeIdsvtex workspace promoteio_vtex_logssubject: "conflicts_resolution"vtex.pages-graphqluserData_backupvtex-io-app-contractvtex-io-storefront-theme-appstore/blocks.jsonstore/routes.jsonvtex-io-render-runtime-and-blocksvtex-io-data-access-patternsvendornameversionvtex releasevtex publishvtex installvtex installvtex use {workspaceName} --productionvtex workspace promotemasterupdateThemeIdsvtex.pages-graphql@2.xMAJOR.xvtex/pages-graphqlTROUBLESHOOTING.mdMineWinsConflictsResolverbasemastermineuserData_backupvtex.pages-graphqlstore/