Technical · Shopify
Shopify product options apps vs. a prescription lens configurator
Every optical store on Shopify hits the same question: how do you charge for lenses, coatings and tints on top of a frame? Most stores reach for variants or a general product options app first. Here’s how those behave once orders start flowing — in the cart, at checkout, in POS and in your reports — and what a dedicated lens configurator does differently.
Key takeaways
- Variants are fine for frame colour and size. They are the wrong tool for a lens build with four or more independent decisions.
- Line-item properties carry the lens spec well, but they can’t change price — so they’re usually paired with add-on products that shoppers can remove on their own.
- A Cart Transform function expands one configured frame line into priced lens component lines, which keeps the bundle intact and the order readable.
- Check the constraints before you build: one cart transform function per app per store, no support for selling plans, and price-override updates limited to Shopify Plus.
The problem: one frame, many priced decisions
A single-vision lens in 1.50 index with no coatings might be free with the frame. A progressive in 1.74 with anti-reflective, blue-light and a gradient tint is a large part of the order value. Your store has to price every combination correctly, keep it attached to the right frame, and show it on the order in a way your POS, accountant and lab can read.
Approach 1: product variants
Add lens type, index and coating as variant options on every frame.
- Works for: very small lens menus, or stores selling only non-prescription or reading glasses.
- Breaks on: combinatorics. Shopify allows up to 2,048 variants per product, but each new lens choice multiplies the matrix, and every lens price change becomes a bulk edit across your whole frame catalogue.
- Reporting: lens revenue is buried inside the frame SKU, so you can’t see how much you sell in lenses versus frames.
- Shopper experience: a theme’s variant picker isn’t designed to explain what an index or a coating does, or to recommend one.
Approach 2: a product options app (line-item properties + add-ons)
General product options and product configurator apps add custom fields to the product page and store the answers as line-item properties on the cart line (Shopify’s Liquid docs note that properties whose names start with an underscore are hidden from customers at checkout). Because properties can’t change a line’s price, the extra charge is usually carried by separate add-on products placed in the cart alongside the frame.
- Works for: engraving, gift wrap, monograms — single add-ons with a fixed price. The spec travels with the order.
- Breaks on: integrity. The add-on is a separate cart line, so shoppers can remove it, change its quantity or keep it after deleting the frame — and you ship a frame with mispriced lenses.
- Maintenance: you end up with hidden helper products for every price point, and theme updates can break the script that keeps them in sync.
- Not lens-aware: a generic options form doesn’t know that ADD only applies to multifocals, that index should follow prescription strength, or that a shopper with no prescription needs an eye-test booking instead of a text field.
Approach 3: Cart Transform function
A Cart Transform function runs inside Shopify’s cart and can expand one line into several. The configurator adds the frame with the lens build attached; the function expands it into the frame plus priced lens component lines, using your pricing rules.
- Integrity: the lens lines are generated from the frame line, so the bundle can’t be split by the shopper.
- Reporting: lens type, index and coatings land on the order as their own lines — reportable, taxable, readable by POS and accounting.
- Pricing: one rule set (type × index matrix, add-on prices) instead of thousands of variant prices.
Know the constraints before you commit. Per Shopify’s documentation, a store can run a maximum of one cart transform function per app; transforms are rejected when a selling plan (subscription) is on the line; Order Edit isn’t supported; full POS support depends on the variant being set to require components; and lineUpdate price overrides are limited to Shopify Plus and development stores. Expanding a line into components doesn’t carry that Plus restriction.
Side-by-side
| Variants | Options app + add-ons | Lens configurator + Cart Transform | |
|---|---|---|---|
| Price management | Per variant, per frame | Per helper product | Central rules |
| Bundle can be split by shopper | No | Yes | No |
| Lens revenue visible in reports | No | Partly | Yes |
| Scales to a full lens menu | No | With effort | Yes |
| Needs an app / Shopify Function | No | Usually a script | Yes |
| Works with subscriptions | Yes | Yes | No |
What we recommend
Use a product options app for what it’s built for — one-off personalisation. Prescription lenses are a different job: a guided, multi-step build with optical rules, an Rx, and pricing that has to stay attached to the frame.
Keep variants for what they’re good at — frame colour and size. Put the lens build in a configurator, carry the spec as properties, and let a Cart Transform turn it into priced lines. That’s the architecture LensPath runs on: the configurator on the frame page, and a Cart Transform that splits lens charges into their own line items so our clients’ POS and accounting treat lens revenue as revenue.
If you’re building it yourself, start with the Cart Transform constraints above — they’re the ones that decide whether the approach fits your store.
Sell the lenses, not just the frame.
LensPath adds a guided prescription-lens configurator and in-store eye-test booking to your Shopify store. 14-day free trial.