Specsmith

Add a spec sheet PDF to Shopify product pages

Shopify can hold a PDF and link it to a product without any app: a file in Content → Files, a File metafield on the product, and a few lines of Liquid in the theme editor. This page walks through that, where it gets slow, and how Specsmith does the same job from your product data.

Checked against Shopify's Help Center and developer documentation, and the code of Shopify's Dawn and Horizon themes, on 19 October 2026.

The manual way

1. Make the PDF

Lay out one spec sheet per product in whatever app you design in, and export it as a PDF. Shopify's Files page takes files other than images and videos up to 20 MB.

2. Add a File metafield for products

A metafield gives every product a place to hold its own PDF. Open any product in Shopify admin, and in its Metafields section click Add definition (definitions can also be made under Settings → Metafields and metaobjects). Name it, for example "Spec sheet", click Select type, choose File, and click Save. Shopify fills in the namespace and key from the name, such as custom.spec_sheet; note it for step 4. Shopify's list of metafield types gives "a PDF file for assembly instructions" as its example of a File metafield.

3. Attach the PDF to each product

On the product, in Metafields, click the Spec sheet field, then Select file. Pick a PDF you uploaded under Content → Files (Upload files), or click Upload file to add it from your computer, then Done and Save (Shopify's steps). Repeat for every product.

4. Show a download link on the product page

A theme's own button can't take its link from a File metafield: in Shopify's dynamic sources table, a File metafield connects only to image and video settings. So the link takes a few lines of Liquid. Dawn and Horizon, Shopify's free themes, both include a Custom Liquid block for that:

  1. In Shopify admin, go to Online Store and click Edit theme.
  2. Switch the editor to your product template, and in the section where you want the link (the product information section, for example) click Add block, then Custom Liquid.
  3. Paste this into its Liquid code box, changing custom.spec_sheet if your metafield's namespace and key differ:
{%- assign sheet = product.metafields.custom.spec_sheet.value -%}
{%- if sheet.url -%}
  <a href="{{ sheet.url }}" target="_blank" rel="noopener">Download spec sheet (PDF)</a>
{%- endif -%}
  1. Move the block where you want it, and click Save.

The metafield's value is a file object whose url is the file's address on Shopify's CDN (Liquid reference). Products without a PDF show nothing. Add classes from your theme to the <a> if you want it to look like a button.

If your theme has a button block with a link setting, there's a way without Liquid: a metafield of type URL, holding the link you copy with the Link button in Content → Files, can be connected to that setting as a dynamic source. The same table allows only URL metafields there.

Themes differ. If yours has no Custom Liquid block, check its documentation; adding one means editing the theme's code.

Where the manual way gets slow

For a handful of products that rarely change, the manual way works well. It's the catalog that changes every month that gets slow.

How Specsmith does it

Specsmith uses the same parts Shopify gives you, a PDF in your store's Files and a File metafield on each product, and makes the PDFs from the product data. The screens are in the app's menu in Shopify admin:

ScreenWhat you do there
DesignPick a template (Classic, Showcase or Compact), the Paper size (A4 or US Letter), an Accent colour, a logo with Upload a logo, and the Header text and Footer text. Show a sample sheet draws a made-up product with the form as it stands. Then Save.
FieldsChoose the spec table's rows: vendor, product type, SKU, barcode, weight, price, tags, and any product or variant metafield your shop has a definition for. Each row gets a Label on the sheet and a Position. Turn the variant table and the description on or off, and Save.
PreviewSearch for a product and see its sheet in the page. Publish this product publishes that one sheet.
PublishUnder Products, choose All products or one collection, then Create spec sheets. Your browser draws each PDF, saves it to your store's Files as <handle>-spec-sheet.pdf, and the app links it to the product. Draft and archived products are skipped. Keep the page open while it runs; if you leave, you can resume.
HomeThe three steps and how many products have a sheet. Add it in the theme editor opens the theme editor to add the button.

The first time you open Specsmith, Home makes sheets for up to 10 products by itself, so the button has something to show straight away.

The button

In the theme editor, add the Spec sheet download block from the app blocks to your product page, and save. Its settings are Style (Button or Link), Label ("Download spec sheet (PDF)" unless you change it) and Open in a new tab. Shoppers see it only on products with a published sheet. The link points straight at the PDF in your Files, so downloads keep working even if the app is down. App blocks need a theme that supports them (Online Store 2.0 themes do); no Liquid to write.

Keeping sheets current

When you edit a product, Specsmith checks whether anything printed on its sheet changed, and if so Home shows the sheet as out of date. Update them redraws the marked sheets, and deletes each old PDF once the product links to its new one. Metafield and weight changes don't reach the app by themselves, so updating also checks every sheet against its product and redraws the ones that differ. Changing the design or the fields marks every older sheet out of date.

What it doesn't do

Sample sheets

Drawn by Specsmith's own renderer for a made-up shop, one per template. The shop and products are invented and the pictures are drawings; the layout, tables, description, header and footer are what the app makes from product fields and metafields.

Try it

Specsmith is free for sheets on up to 10 products; Pro covers any number (pricing). The docs cover every screen, what prints on a sheet, and the app's permissions.