Letting a customer attach their artwork to the order
Taking a file from a customer is one line of markup, and Shopify names it as a use case itself. The questions that matter come afterwards — what travels with it, where it is stored, and how long you can count on it being there. Two of those three have no documented answer.
Taking a file from a customer is native, and Shopify names it as a use case in its own documentation: line item properties exist so customers can "customize orders or provide supplementary information. For example, you can capture monogram or engraving text, or let a customer upload a file."
It is a file input inside the product form, named the same way as any other property. Shopify's own cart example even shows how to recognise one afterwards — it tests the value for /uploads/ and renders it as a link.
So the upload works. The questions worth your attention are what comes with it, where it lives, and how long it stays there.
What actually travels
A URL, as the value of a property on that line. Not a file, not an attachment — a link. Everything else you need has to travel the same way: the DPI, the colour profile, the proof state, the job number are each another property on the same line.
And you can hide the ones the customer should not see, by prefixing the key with an underscore — the same mechanism, and the same caveats, as hiding a technical value on a personalised line. Your production values stay out of the buyer's way while remaining where your staff work.
If the same product is ordered twice with different files, the basket splits into two lines. That rule has a page of its own, and it is worth reading before you build the form, because it decides whether a buyer can raise the quantity at all.
Two limits that decide how you build this
The buyer never writes into your Files library. Shopify's Files API is Admin-only: stagedUploadsCreate and fileCreate are admin mutations, they need an admin permission (write_files or one of its neighbours), files are "processed asynchronously" and batches cap at 250. Shopify documents no storefront equivalent. So the uploaded artwork does not arrive as a tidy asset in Content → Files unless something with admin access puts it there afterwards.
And a line item cannot own a metafield. Shopify's list of things that can carry structured custom data covers orders, draft orders, products, variants and customers — but not a line of an order. Which means the structured, validated, typed approach you would reach for on a product simply does not exist one level down. Per-line information is a property or it is nothing.
Those two together explain why every print shop's setup looks improvised. It is not that they built it badly; it is the only shape available.
Artwork arriving without the details you need? Describe what has to come with each file →
The two things nobody can tell you
How big a file may be. Shopify documents no size limit for files uploaded through a product form. You will find a figure on third-party sites; we are not going to repeat it, because Shopify does not state it and a number you cannot check is worse than no number. Test it with your largest real file.
And how long it is kept — where the answer is more interesting than "undocumented". The nearest thing to an answer is a Shopify staff reply on the developer forum in August 2026: there is no automatic deletion policy for files uploaded this way, and removing the property from a completed order removes the file with it. So the risk is not that Shopify tidies your artwork away on a schedule. It is that nobody has promised it will not, and that an ordinary edit to the order can take the file. Download what you receive into your own storage as part of accepting the job, and treat the property as a pointer rather than an archive.
(The Storefront Cart API does document one limit, if you are building headless: an attribute list "must not contain more than 250 values" per line.)
Most of the older recipes for showing uploads at checkout were built on checkout files that no longer run — the dates are on the personalisation page, and the last of them has now passed.
Which route is yours
| What you need | Where it comes from |
|---|---|
| Let a customer attach a file | Native — a file input in the product form |
| Extra details beside the file | Native — more properties on the same line |
| Hiding technical values at checkout | Native — prefix the key with an underscore |
| The file in your Files library | Not native from the storefront — admin side only |
| Structured, validated data on the line | Not possible — a line cannot own a metafield |
| A guaranteed retention period | Undocumented — keep your own copy |
| Old advice about checkout.liquid | Dead — it stopped working on 13 August 2024 |
What Shopivibe does
A rule works from what a print job is, not from what is inside the file — the artwork is opened by a person, which is what proofing is. An order carrying one of your print SKUs is labelled the moment it arrives, so it sorts apart from stock orders in your Orders list and nobody has to spot it. The note to your studio goes out at the same time, and if the job should not be made until somebody has looked at the file, that line is held until they have.
It is built for you, not switched on: a person here takes it on straight away and has it working in your store within 24 hours. Part of that conversation is which products count as print jobs — that list is yours.
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.
Know which orders need artwork before they can be made? Describe it in your own words →
Checked against Shopify's documentation and the App Store on 21 September 2026.