The lab report on your product page is not the one in their jar

Attaching a certificate of analysis to a product in Shopify is a solved problem, and it is free. Attaching it to the batch a shopper is actually holding is not, because there is no batch anywhere in Shopify to attach it to. The difference looks like a missing convenience and is really a wrong claim: a shopper reading "third-party tested" on your page is shown the document for whatever you uploaded most recently, not the document for the jar in their hand.

A shopper pours a scoop, turns the tub around, and wants the certificate for the batch code printed on the bottom. Your product page has a certificate on it. It is almost certainly not that one.

The short answer, before the detail: putting one lab report on a product page in Shopify is native, free and takes about five minutes. Tying that report to the batch a particular shopper received is not possible in Shopify at all, because Shopify has nowhere to record which batch anything came from. So the merchant who does the straightforward thing ends up showing every shopper the certificate they uploaded most recently — which is right for this month's buyers and wrong for everyone else holding an older tub.

The easy half really is native, and nobody tells you

Shopify's own documentation is clear about this, and it is worth quoting because a lot of advice on the subject gets it wrong.

A product can carry a File metafield. In Shopify's words, that type "supports uploading a single file", generic files "must be less than 20MB", and — the sentence that matters — for generic files it "Will render as a downloadable link in themes."

So: define a File metafield on your product, upload the PDF, and your theme can put a Download link on the page. No app, no monthly cost, no developer. If one certificate per product is genuinely all you need — one formula, one supplier, one test that does not change — stop reading. You are done, and you should not pay anybody for this.

One thing to check in your own store before you trust that

There is a wrinkle here that we will name rather than smooth over, because it is the kind of thing that costs an evening.

The documentation says a generic file renders as a downloadable link. A merchant posting on 16 January 2026, running Dawn 2.5.0, could not get there: they had created a File metafield for the certificate, uploaded the PDFs, and found the theme editor would not offer the field at all, because the standard sections expect an image. Two people replied, one of them with a hand-written line of Liquid. Nobody from Shopify did, and the thread has no accepted answer.

We are not going to tell you the documentation is wrong, and we have not tested every theme — proving what the platform does is not what this page is for. What we will say is that this is a five-minute check worth doing before you plan around it: make the metafield, upload a PDF, and see whether your theme actually offers it. If it does, the native route is the whole answer. If it does not, you are looking at a custom block, which is the point at which "free" starts costing something.

Certificate needs to match the batch, not the product? Describe what a shopper should see when they look one up →

The part that cannot be fixed by uploading harder

Here is the wall, and it is not about files.

Shopify has no concept of a batch. Not a weak one — none. The object that holds everything Shopify knows about a sellable item describes itself as holding "the stock keeping unit (SKU), whether quantities are tracked, shipping requirements, and customs information", and reading its twenty-one fields one at a time, there is no lot, no batch, no manufacture date and no expiry. Inventory in Shopify is a number. Thirty units of a variant are thirty identical units, and the two that came from July's run are indistinguishable from the twenty-eight that came from October's.

Shopify's newer product-disclosure feature does not reach it either. Disclosures are "stored at the product grain. They are not stored per variant", and of the nine entry types Shopify provides, eight are American safety warnings — chemical exposure and choking hazards — and the ninth is a blank custom one. None of the nine carries a document: a disclosure is a heading and some text, with at most a warning pictogram.

That is why this is not a file-count problem. You can define as many metafields as you like. What you cannot do is say this document belongs to that batch, because there is no "that batch" for Shopify to point at — and you certainly cannot say which batch left the warehouse in a particular order.

So what actually ships, and why it matters more than it sounds

Follow the native route for a product you re-test every quarter and this is the sequence:

  1. January's batch is tested. You upload January's certificate.
  2. April's batch is tested. You upload April's certificate, replacing the link.
  3. A shopper who bought in February opens your product page in May, sees Download certificate of analysis, and gets April's document for a tub that was never part of April's batch.

Nothing broke. No error appeared. Your page says the product is third-party tested, and that is true. It also hands this particular reader a document that does not describe what they are holding — and for a regulated or trust-led product, that is the whole reason the certificate was on the page. The merchant who asked about this first put it more plainly than we can. On 31 March 2021 they wrote:

"I am trying to find an app that will allow me to create a button under my product and let a customer type a batch/lot number to view the corresponding COA. Does anyone know of an app or how I can accomplish this?"

Nobody from Shopify answered. The thread is still unsolved, and the only substantive reply it ever received arrived more than five years later, from somebody selling an app for it.

One caution if you go reading around this subject. The same vendor account posted into more than one of these threads in July 2026, and the App Store address it gave returns nothing. Replies in this corner are often supply rather than demand.

Which route is yours

What you need Where it comes from
One certificate per product Native — a File metafield, rendered as a download link
A certificate larger than 20 MB Not natively — the generic-file ceiling is Shopify's
The field offered in your theme editor Check your own theme; one merchant on Dawn 2.5.0 had to write Liquid
Which batch a shopper is holding Nowhere in Shopify — no batch or serial dimension exists
A shopper typing a batch code and getting that batch's document An app, or built for you
Batch as the identifying element for EU product duties A different question, and a legal one
A certificate that is never shown against an untested batch Nothing native does this

The two apps, named honestly rather than sold. COA Vault: Batch Lookup and QR, from Lot Foundry, is the one built for exactly this half: $14.99 a month with a fourteen-day trial, promising to "Show customers the lab certificate behind every batch you sell", with a storefront lookup and QR codes. Be aware it launched in June 2026 and has no reviews yet — that is not a criticism, it is a sample size of zero, and it is worth asking the vendor what happens to your documents if you leave. The cheapest file-download widget we found is Download Page and File Search MP from Hex Apps, from $4.90 a month, listed in July 2024 with 5.0 from five reviews. Worth being straight about what that one is: its listing says nothing about lab reports, certificates, batches or lots. It is a searchable file library, so it works only as well as you name your files, and it has no idea which batch anybody bought.

What Shopivibe does

You tell us which batch is live, and the certificate on the page becomes the certificate for the batch going out today — not whichever file was uploaded last. The batch a shopper looks up is the batch they were sent, because the link between the two is kept on our side, where Shopify has no field for it.

Two more things that follow from the same record, and they are the ones merchants in these threads ask for second. A batch that goes live with no certificate attached does not quietly inherit the previous one — you hear about it instead, before a shopper does. And a retest date that has passed stops a tested claim rendering against that batch at all, because a page that says third-party tested while pointing at an expired document is worse than a page that says nothing.

Being straight about the limit underneath all of it: we are not adding a batch field inside Shopify's inventory, because there is nowhere in Shopify to put one. What we keep is the record that ties your batches, your documents and your orders together, and the storefront lookup that reads it.

Describe what a shopper should be able to look up and what each batch needs to carry, and a person here has it working in your store within 24 hours.

Shopivibe solves the problem in your store and keeps what it adds maintained, including when Shopify changes something underneath. Shopivibe is free during early access, with 3,500 credits included. Credits beyond the included 3,500 cost $0.06 each.

Selling a product that gets retested every batch? Describe which document each batch should carry →

Checked against Shopify's documentation and the App Store on 21 October 2026.