Zolo Digital
Book a call
Back to Blog

November 2, 2026

How do you build a product designer for a print-on-demand Shopify store?

How do you build a product designer for a print-on-demand Shopify store?

Start from the file your printer needs and work backwards. A print-on-demand product designer on Shopify has four parts: an editor where the customer designs, two saved files (a small preview and a print-ready file), line item properties that carry both through checkout, and a handover that sends the print file to production. Most builds only finish the first.

"Can customers design their own t-shirt?" is one of those questions that sounds like a weekend job. The editor is the weekend. The rest is where the store either works or quietly sends the printer a screenshot.

Below is how I'd approach it on Shopify today. It's the general playbook, not a tour of one client's admin.

What does the printer actually need?

Ask before you write a line of code. Print shops and POD suppliers usually specify:

That spec decides your canvas size, your export settings and what the editor is allowed to do. An editor that lets someone place a phone photo across a full A3 print area needs to warn them, not just accept it.

How should the editor work?

Keep it a canvas library (Fabric.js and Konva are common choices) inside a theme app extension or a section on the product page. The customer adds text, uploads an image, picks colours. The editor should:

Why do you need two files?

Because the cart and the printer want opposite things. The cart wants a small, fast preview the customer recognises. The printer wants a large, exact file nobody should be loading on a phone.

On Add to cart, export both from the saved design data and upload them to your own storage (an app backend, S3, Cloudflare R2). Shopify's Files API works too, but you'll want an app to manage them either way. Don't put image data into the cart itself.

How does the design survive checkout?

With line item properties. Add the preview URL, the print file URL and a design ID to the cart line:

await fetch("/cart/add.js", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ items: [{ id: variantId, quantity: 1, properties: { _design_id: design.id, _print_file: printUrl, Preview: previewUrl, }, }], }), });

Properties starting with an underscore are hidden from the customer in most themes, so _print_file travels with the order without cluttering the cart. Show the preview in the cart and order emails, so the customer sees exactly what they bought.

Two designs of the same variant become two separate lines, because their properties differ. That's what you want.

How does the order reach the printer?

Subscribe to the orders/create webhook in your app. For each line with a _print_file, send that file and the variant details to the printer: their API if they have one, or a tidy email or folder if they don't. Write the result back to the order as a note or tag, so support can see which designs went to production without opening three tools.

Plan for the boring cases: a cancelled order, an edited order, a design that failed to export. Each needs a clear status somewhere a human looks.

What do people get wrong?

Building one?

If you're planning custom or print-on-demand products on Shopify, this is the kind of build I take on: the editor, the files, the app and the handover. See Shopify app development or get in touch with what your printer needs, and we'll work backwards from there.

Instagram

Latest on Instagram

Follow @zolodigital