You can build a Shopify product customizer without a monthly app in two ways. For simple options, use Shopify's built-in variants and line item properties, which cost nothing. For complex products with live previews and calculated prices, build a custom JavaScript configurator that adds a fully specified, correctly priced item to the normal Shopify cart. Apps are the fast middle ground, but most charge every month for as long as you sell.
We built the second kind for KH Art & Framing, a family frame shop in Arlington, Virginia. Customers upload their art, choose a frame and mat, see it rendered to scale, and get a live price. Below are the options, their limits, and how the frame builder works, including the trick that lets it charge an exact custom price with no app.
- Variants handle priced choices, but cap at three options and 2,048 variants per product, and some themes and apps still stop at 100.
- Line item properties capture text and file uploads for free, but they can't change the price.
- Product option apps are quick to set up, but you pay monthly and live inside the app's limits.
- A custom builder can price anything. The hard part is getting that price into Shopify's checkout.
- Our answer: a hidden $0.05 product, with the quantity set to match the price, so checkout charges the exact amount.
Your options for custom products on Shopify
| Option | Monthly cost | Can change price? | Good for | Limits |
|---|---|---|---|---|
| Variants | None | Yes, per variant | A few fixed choices: size, color, material | 3 options, 2,048 variants |
| Line item properties | None | No | Engraving text, notes, file uploads | Information only |
| Product options app | Monthly subscription | Usually, by the app's method | Many options without code | The app's features, fees and page weight |
| Custom JS configurator | None after the build | Yes, with a workaround | Live previews, calculated prices, complex rules | Up-front build cost, and you maintain it |
Variants: free, but they run out fast
Shopify's variant documentation says a product can have up to 2,048 variants and up to three options, as of October 2026. The same page warns that some third-party themes, apps and sales channels might not support more than 100 variants.
Three options sounds like a lot until you list what a custom product actually needs. Even a stripped-down frame, with 10 sizes, 19 moulding finishes and 4 mat styles, is 760 variants across three options. That's before glazing, mat color, backing or hanging hardware, and before the customer's own art size, which isn't a fixed list at all.
Variants are the right answer when your choices are few and fixed. A candle in three scents and two sizes doesn't need anything else.
Line item properties: free, but no pricing
Line item properties are extra fields on the product form, named properties[Your field]. Whatever the customer enters travels with that cart line into the order. Shopify's theme docs give monogram text and file uploads as examples. A property whose name starts with an underscore is private: hidden at checkout, but visible on the order in the admin (Cart API reference).
The catch is that properties don't change the price. The line still costs whatever the variant costs. If "add engraving" should cost $10, a property alone can't charge it.
Product options apps: fast, but you rent them
Apps in the Shopify App Store add option fields, conditional logic and add-on pricing without code. For a shop with a handful of personalized products, that's often the right call, and we'll say so.
The trade-offs show up over time. You pay every month for as long as you sell. You're limited to the app's option types and preview features. The app's scripts load on your pages. And if you cancel, the builder goes with it.
A custom configurator: you own it, but you have to solve pricing
A custom JavaScript builder can do anything the browser can: live renders, calculated prices, validation rules, file uploads. It lives in your theme, so there's no monthly fee.
The hard part is the price. A storefront can't set an arbitrary price on a cart line. Shopify's built-in way to change line prices is a Cart Transform Function, which is delivered as an app, and its price-override operation is limited to development stores and Shopify Plus as of October 2026. The rest of this guide is about how we got around that for a store on a standard plan.
Worked example: the KH Art & Framing frame builder
KH Art & Framing has framed art in Arlington since 1990. Custom framing is a hard product to sell online: the options interact, the price depends on measurements, and the most common regret is getting the size wrong. You can try the public demo at framing.zohadigital.co.
What the customer does
- Upload their art and pick one of six product types: framed print, frame without glazing, canvas gallery wrap, mounted, flat print or rolled poster.
- Choose the size and paper, then a mat: none, single, double or float, with weighted bottoms.
- Choose a frame from 14 Larson-Juhl moulding profiles in 19 finishes, transcribed from the manufacturer's spec sheets.
- Choose glazing up to museum glass, plus spacers, backing and hanging hardware.
The flow asks for one decision at a time. Each finished step collapses to a one-line summary, and a sticky price dock shows the running total.
The to-scale render
The preview is drawn on an HTML canvas: mitred moulding painted from the manufacturer's photo, mat bevels and glazing reflections. A "To scale" view hangs the finished piece above an 84-inch sofa, because misjudging size is the most common custom-framing regret.
Guardrails that a framer would apply
- A live resolution (DPI) check on the upload, with soft and hard warnings.
- Mat geometry limits.
- No real glass above a size threshold.
- A check that the moulding's rabbet is deep enough for the art, mat, glazing and backing stack.
- Any warning the customer clicks past is recorded on the order.
Live pricing that matches the picture
The price follows the way a framer actually quotes: fitting, glazing, mat (doubled for a double mat), mounting, moulding priced per foot, the print, and extras. Like a framer working from pre-cut glass, it bills at the next chart size up from the art-plus-mat "sandwich." The rate-card version is stamped on every order.
One design rule matters more than any feature: geometry is computed once and used by both the renderer and the pricing engine. A frame that looks a certain way is guaranteed to be priced that way.
From our work: The whole builder is about 66 KB of JavaScript gzipped, or about 75 KB including its stylesheet and cart patch. It's built with Preact, Preact Signals and Vite, and ships to the theme as one JS file and one CSS file. A logic smoke test runs the pricing and rules across more than 160 configurations.
The $0.05 trick: exact prices with no app
Here's the problem again: the builder knows the frame costs $247.85, but Shopify's storefront can only add products at their own prices.
So the builder adds a hidden "carrier" product priced at $0.05, and sets the quantity to cover the price. A $247.85 frame is 4,957 units of the carrier. Because the cart line is a real product at a real quantity, the total is correct everywhere Shopify uses it: cart, checkout, tax, reports, refunds, discount codes and Shop Pay. No app, no backend, no monthly fee.
Why a nickel and not a penny
Shopify caps how many units can sit on one cart line, and it doesn't document where that cap is. At a penny per unit, the ceiling per line is about $990. At a nickel, it's about $4,950, which covers large custom pieces. Prices round up to the next 5 cents, and the breakdown shows a visible "Rounding" line so nobody is surprised by a few cents.
Carrying the order details
The builder is designed to send the item to Shopify's Cart AJAX API, a POST to /cart/add.js, with line item properties attached:
- Visible properties: a readable work order, so the shop can see what to make at a glance.
- Private properties (names starting with an underscore): the full spec as JSON, the price breakdown, every cut dimension for the workbench, and the warnings the customer accepted.
- Three file attachments: the original artwork, a PNG of the preview, and the spec file.
A small script, about 11 KB before compression, rewrites the displayed quantity in the cart page and cart drawer, so the customer doesn't see 4,957 as the quantity.
The honest trade-offs
- The admin shows the real quantity. Orders read "4,957 × Custom Framing." Staff need to know that's normal.
- "Units sold" is meaningless for the carrier product. Report on order count or revenue instead.
- Theme updates can break the display. A new theme version may change the cart markup the patch looks for. The price is never affected, only what the cart shows.
- Turn off inventory tracking on the carrier product. Left on, it's the most common setup error, and add-to-cart fails with a 422 error.
The upgrade path, if the store ever needs one, is a Cart Transform Function. That means building and maintaining a real app, and the price override needs Shopify Plus.
Where the frame builder stands today
We'd rather be clear than impressive. The builder's interface, renderer and pricing work, and the public demo at framing.zohadigital.co runs with a mock cart. The Shopify cart integration described above is written, but it has not yet been run against the live store, and file attachments on the live store are untested. Treat the cart section as the design, not a shipped result.
Some pricing inputs are also still being finalized with the shop, including the moulding rate per foot, so demo prices are placeholders, not the shop's quotes. Saved and shareable designs are planned, and would need a small backend.
Which approach should you choose?
- A few fixed choices, each with its own price: use variants. Check that your theme handles your variant count.
- Personalization that doesn't change the price, like a name or a photo: use line item properties. Test file uploads on your own store before launch.
- A handful of personalized products and no developer: an options app is often the right call. Compare its yearly cost with a one-time build.
- Calculated prices, live previews or real production rules: a custom configurator. Budget for the build, keep the code in your theme, and plan who maintains it.
Before you build anything custom, write down every choice a customer makes, how each one changes the price, and what your team needs on the order to make the product. That list decides the approach. If you also sell on Etsy, note that Etsy caps variations per listing, so a full builder usually means Shopify; our Shopify vs Etsy guide covers that trade-off.
If your product has more rules than an app can handle, our Shopify and Etsy team builds configurators like this one, and we'll tell you if an app would do the job for less.
Frequently asked questions
Do line item properties change the price in Shopify?
No. Line item properties attach information to a cart line, like engraving text or an uploaded file, but the price still comes from the variant. To charge for an option you need a variant, an add-on product, an app, or a Cart Transform Function.
How many variants can a Shopify product have?
As of October 2026, Shopify allows up to 2,048 variants and three options per product. Some themes, apps and sales channels still only handle 100 variants, so check yours before relying on the higher limit.
Can customers upload a file on a Shopify product page?
Yes. Shopify's theme documentation lists file uploads as a use for line item properties, and the file is attached to the order. Test it end to end on your own store, including how the file shows in the admin and order emails.
Is a custom product builder bad for page speed?
It doesn't have to be. Load it only on the product pages that need it and keep the bundle small. Our frame builder is about 66 KB of gzipped JavaScript, one script and one stylesheet in the theme.