Starting April 7, 2026, replacing or deleting a file in the Shopify admin no longercdn.shopify.com/... clears the cache immediately. Stale content keeps being served until the TTL expires. The fix is to dynamically output a versioned URL (?v=...).
When you replaced a file, Shopify automatically cdn.shopify.com/... cleared the cache, and the new content was served immediately.
Replacing or deleting a file no longer purges the same URL. The old content remains until the TTL expires, so there is a window where the change is not visible.
cdn.shopify.com/... URLs that are hardcodedwill keep returning the old content even after the file is replaced. Migrating to a dynamic pattern is recommended.?v=... re-append the version parameter with the latest value. Once the URL changes, the CDN treats it as a different resource and serves the new content immediately.
Stated in the article: the goal is to reduce the total volume of purge operations that occurred with every file replacement.
Stated in the article: the goal is to improve delivery consistency across multiple edge (CDN) providers.
| How it's referenced | Behavior after replacement | Verdict |
|---|---|---|
In a theme, file_url / image_url / asset_urlreferenced via a Liquid filter |
The latest ?v=... -stamped URL is output, and the new content is served |
Safe |
| Inserted into a product via the native Media uploader Upload images and videos directly |
Shopify manages the versioned reference → updates are reflected | Safe |
| URL fetched at request time by an app or external integration Fetched each time from the Admin GraphQL / Storefront API |
Always fetches the latest URL → updates are reflected | Safe |
In a product description or blog post, <img src="cdn.shopify.com/..."> Pasting directly |
Even when replaced keeps returning the original content | broken |
In theme code cdn.shopify.com/... hard-coded |
Even when replaced keeps returning the original content | broken |
| Fixed URLs printed on physical materials Same applies when apps cache URLs |
Even when replaced keeps returning the original content | broken |
Use the Liquid filter file_url / image_url / asset_url to render file references.
In descriptions, <img> instead of pasting, insert images and videos via the native Media uploader.
Do not cache URLs;at request timefetch from the Admin GraphQL API / Storefront API.
?v=...). This way, every time a file is replaced, the URL updates and customers receive the latest content.Lean toward a design where the cache key itself changes via a version parameter, ?v=... rather than purging. When the URL changes, the CDN treats it as new.
cdn.shopify.com is the landmineAny place where a fixed URL is embedded in product descriptions, blogs, theme code, or printed materials will not update when the file is replaced. Inventory these.
Implementations that store file URLs in a DB or cache in external integrations need review. Fetch from the Admin / Storefront API at request time.
Existing URLs that have not migrated to the dynamic pattern will keep returning the old content until the TTL expires. The specific TTL value is Not specified.
Standardize static asset and file references inside themes to go through file_url / image_url / asset_url . For new development—and for code reviews of existing themes—set up a mechanism (grep / linter) to detect hard-coded URLs to prevent incidents.
cdn.shopify.com .cdn.shopify.com . The explicit TTL value is not specified, so the timing of reflection needs to be verified by observing behavior.cdn.shopify.com/... fixed URLs slip past review, leaving images that cannot be updated after release.cdn.shopify.com hard-coding → URL helpers required" to CI / code review checks and automate detection.file_url / image_url / asset_url as a required replacement. Hardcoding <img> directly into product descriptions should also be banned by operational policy.?v=...). ―cdn.shopify.com should be audited immediately."