Quick answer: Upload both catalog.hash and catalog.json together. Clear the player’s catalog cache on update, and version your remote load path.

A live game pushes a content update. Some players fail to load with “catalog hash mismatch”. They downloaded a stale .json but new .hash, or vice versa — partial upload.

Atomic Upload

The catalog is two files: catalog_XXX.json (the data) and catalog_XXX.hash (the integrity check). Upload them together; if a CDN serves a new .hash but cached .json, mismatch.

Upload .json first, then .hash. The .hash being newest ensures clients see consistent state.

Version the Path

RemoteLoadPath = "https://cdn.game.com/content/v[BuildVersion]/"

Each release goes to its own directory. No overwrites, no partial-state. Old clients keep using old paths until they update.

Clear Catalog Cache

Addressables.ClearResourceLocators();
var handle = Addressables.LoadContentCatalogAsync(catalogUrl);
await handle.Task;

Force a fresh catalog load. Combine with Caching.ClearCache() if bundles are also stale.

Check Catalog Update

var checkHandle = Addressables.CheckForCatalogUpdates();
await checkHandle.Task;
if (checkHandle.Result.Count > 0)
{
    await Addressables.UpdateCatalogs(checkHandle.Result).Task;
}

Built-in update check. Run at startup; pull new catalogs before loading content.

Verifying

Push update. Players on old version keep working; updated players pull new catalog cleanly. No hash mismatch errors in analytics.

“Catalog is .json + .hash. Keep them in sync, version the path, clear cache on update.”

For LiveOps, automate the upload order in your deploy script — manual CDN uploads are the #1 cause of partial-state mismatches.