How to update product PDFs without breaking existing Shopify links

If you publish manuals, safety sheets, certificates, size guides, or other product documents, you may eventually need to replace a file after its URL has already been added to product pages, emails, QR codes, or printed materials.

The important detail is that a Shopify CDN file URL should be treated as a file location, not as a permanent document address. Uploading or replacing a file can result in a different URL, while links already shared with customers may continue opening the previous file.

Before updating a document

Make a quick list of every place where the current link is used:

  • Product descriptions and product metafields
  • Theme sections or custom Liquid
  • Navigation pages and document libraries
  • Email campaigns and automated notifications
  • QR codes, packaging, and printed instructions
  • External marketplaces or distributor portals

This determines whether manually replacing the link is practical.

Option 1: Update every direct file link

For a small store with only a few documents, the simplest approach is:

  1. Upload the corrected file.
  2. Copy its new Shopify CDN URL.
  3. Update every product, metafield, page, and theme block that uses the old URL.
  4. Test the link in a private browser window.
  5. Keep a record of the previous file in case older orders require it.

This is straightforward, but it becomes risky when the URL has already been distributed outside the storefront.

Option 2: Use a stable storefront page

Instead of sharing the CDN URL, create a Shopify page with a stable handle, such as /pages/product-manual.

Link customers to that page and update the download button whenever the document changes. The page URL stays the same even when the underlying file changes.

This works well when one page represents one document. The disadvantage is that every page and button still has to be maintained manually.

Option 3: Use a stable document endpoint

Stores with many documents or frequent revisions can place a stable URL between the customer and the current file. The storefront URL remains unchanged, while its destination is updated to the latest approved version.

This can be implemented with a custom app proxy or a document-management app. A good implementation should:

  • Keep the public URL unchanged
  • Redirect or stream the current approved file
  • Preserve previous versions
  • Restrict redirects to approved file hosts
  • Return a clear unavailable message when the source file fails
  • Avoid exposing internal storage or credentials
  • Work from product pages, emails, and QR codes

Product-page display checks

If a PDF metafield exists but does not render consistently, also confirm that:

  • Both products use the same product template.
  • The theme block is connected to the correct dynamic source.
  • The Liquid code handles the metafield actual type.
  • The metafield is populated for the affected product.
  • The theme was saved after reconnecting the dynamic source.

A file replacement and a theme-rendering problem can happen at the same time, so test them separately.

Recommended workflow

For a few rarely updated files, direct links or stable Shopify pages are usually enough. For documents that are revised regularly or used in printed materials, use a stable storefront URL and retain a version history.

After every update, test the public URL while logged out and verify the HTTP response, file type, and final destination. This catches broken permissions, redirects, and outdated links before customers do.

I hope this gives merchants a practical way to choose an approach based on document volume and update frequency. If you use a different workflow for manuals, SDS files, or certificates, it would be useful to hear what has worked well for your store.

Yeah this matches what I’ve seen in practice.

Content > Files > Replace does keep the same filename and URL handle, but the CDN still bumps the ?v= query string. So any email, QR code, or hardcoded link that saved the old full URL (with the old v=) can keep serving the previous file until you update that link. Links that omit ?v= or that are built at render time with the Liquid file_url filter tend to pick up the current version more reliably.

For anything that goes outside the storefront (emails, packaging, QR), I’ve had the best luck with your Option 2: a stable /pages/… handle with a download button, and only swapping the file behind that button. For product pages that render from metafields, store a file reference metafield (or the filename) and output it with file_url / the file metafield’s url so you’re not pasting a frozen CDN link into the description.

One extra check after Replace: open the public link in a private window and confirm the HTTP response and file size, because browser cache can make it look like the old PDF for a bit.

Good breakdown. One thing I’d add is that for compliance-related documents, replacing the file isn’t always enough — sometimes you need to know which version was valid at the time of a specific order.

For SDS files, certificates, manuals, etc., I’d consider storing the document as a Metaobject with fields like:

  • current file

  • document version

  • effective date

  • previous version

  • product reference

Then the product page can always point to the same storefront section/page, while the actual document behind it can be updated without changing where customers go.

This also makes it much easier to keep an archive instead of simply overwriting the old version.

For QR codes especially, I’d definitely avoid linking directly to the CDN file. A stable storefront URL gives you much more control later if the file moves, gets replaced, or needs to be temporarily unavailable.

For stores with only a few PDFs this might be overkill, but once you have dozens of products/documents, centralizing it saves a lot of manual cleanup.