Variants, line item properties or metafields? Modeling furniture specs in Shopify
A cleaning code, a stocked fabric choice, and a priced leg finish do different jobs. Give each attribute a home that preserves what the customer chose and what the vendor must build.
The OrderPilot team·
Seat height: a product specification. Fabric grade: sometimes a variant choice. A monogram on a headboard: information for that customer’s order. Then comes the leg finish that adds $120 and changes the lead time. That last choice needs more than somewhere to type “walnut.”
Choose the structure by what the attribute does. Does it change the selling price, the purchase cost, the SKU or stock identity, or the lead time? Does the vendor need it to build the piece? A catalog works well when those answers remain attached to the customer’s actual selection. The examples here are illustrative.
Ask what changes when the customer chooses
Start with the finished piece and work backward. If changing “oak” to “walnut” means a different stocked product, the choice needs a stock identity. If the finish only describes a table that is always supplied the same way, it is descriptive product information.
If the customer is choosing a finish for a piece the vendor will make, the choice also needs a route into purchasing. It might affect cost even when your selling price stays the same. “No surcharge” does not mean “no consequence.”
Write a short attribute list before building the product page. Beside each field, record who maintains it, who selects it, and who needs to read it later. The custom furniture product data checklist is useful for this first pass.
One warning sign is a field doing several unrelated jobs. A single “Details” box containing a fabric, delivery instruction, and warranty note is wonderfully flexible until someone has to buy the sofa.
Use variants for sellable stock identities
A Shopify variant represents a particular combination within a product. It suits a defined range where the choice determines the item you sell, price, and track. Shopify’s variant documentation limits a product to three options and 2,048 variants.
For a stocked chair offered in oak or walnut and linen or leather, a variant structure can be straightforward. The warehouse can count the same identity that the associate sells. A returned walnut-and-leather chair can be distinguished from the oak-and-linen chair beside it.
That clarity weakens when staff combine unrelated choices into labels simply to fit the option limit. A finish shouldn’t disappear inside a lengthy fabric name. If the customer needs separate decisions, preserve them in the structure you choose.
See Shopify’s three-option limit and the higher variant ceiling before expanding an upholstery matrix. Count both fields and combinations.
Use metafields for facts about the product
A metafield stores structured information attached to a Shopify record. Furniture examples include seat height, frame material, assembly information, and a cleaning code. A metaobject groups reusable information, such as a finish’s name, image, and description.
A metafield does not change a selling price merely because you fill it in. An app or other configured behavior can read the value and act on it, but storage and pricing are separate jobs. A field labeled “Walnut surcharge” is still just data until something applies that surcharge.
Keep cleaning codes with the fabric or product they describe, and display them where staff and customers need them. If upholstery changes, the care information should follow the chosen upholstery. Avoid copying a generic sofa cleaning code onto a configuration with a different fabric.
Reusable finish records also prevent small naming differences from multiplying. “Natural oak” should mean the same finish in the product page, the sample library, and the purchasing record.
Respect the storage and display limits
Shopify’s metafield limits allow merchants 256 definitions per resource type, with separate app limits. Most value types have a 64 KB limit, while list and reference types have their own ceilings. Metaobject reference lists can hold up to 1,024 entries.
A stored list and a visible list are different things. A basic Liquid loop can return only the first 50 reference entries; the storefront implementation needs appropriate pagination to show more. Shopify’s metaobject documentation explains the same basic loop boundary for entries.
For a store owner, the useful test is simple: select a finish well down the library and find it on the actual product page. Don’t accept the presence of the first swatch as proof that the full collection is available.
Give developers a clear requirement for the entire library, its search behavior, and what happens when a finish is withdrawn. A large field should not become a place to hide an unmaintained catalog.
Use line item properties for information on one purchase
Line item properties capture name-and-value information on a cart or order line, such as the text for a monogram. Shopify’s line item reference describes how those values are captured and displayed.
A property by itself does not create a priced variant, track separate stock, or maintain a purchase cost. Keep a free personalization field separate from the mechanism that charges for personalization. If adding embroidery costs money, the order needs a priced way to represent that service.
The vendor sees the property only if your purchasing workflow deliberately carries it into the document or message the vendor receives. Seeing “Monogram: AB” in the cart is not evidence that it appears on the PO.
Test that handoff with an actual sample order. Inspect the customer’s confirmation, staff order record, and vendor-facing document. The final document should state the accepted spelling and placement without requiring someone to reconstruct the customer’s choices from a screenshot.
Use template options for choices that drive the custom sale
OrderPilot templates put the furniture’s selectable specification beside its price, cost, and lead time. They support dropdowns, text, add-ons, swatches, number fields with per-unit pricing, and a Designer & Finishes picker that reads Shopify metaobjects.
That means your existing finish library can supply the picker. Decide which finishes belong on each template, then set the commercial details for that piece. Reusing a finish’s identity doesn’t require every sofa and table to charge the same amount for it.
A Dimensions option captures length, width, and height with minimum, maximum, and step settings. It has a flat price and no stock of its own; it is not automatically a price-per-volume calculation. Staff can see the chosen options and their lead-time contributions on the template and the Admin order line. Lead time can also appear in the online options block when enabled; it does not print on the quote PDF or PO. Keep a customer’s agreed timing explicit in the sale’s communication.
Follow a priced finish through the order
Say a table has a base price of $2,000. The customer chooses a walnut finish adding $120, making the merchandise total $2,120 before fees or tax. The vendor charges an extra $80 for that finish. The template should preserve both amounts, because they answer different questions.
The customer sees the selected finish and the quote total. Purchasing needs the exact finish instruction and its cost. OrderPilot carries the configured specification into the vendor PO, reducing the need to retype the showroom decision.
Use the product spec sheet as a readable reference for the piece and inspect it against the accepted configuration. The product spec sheet guide explains where the document helps the conversation. Before releasing the order, read the vendor document as if you had never seen the customer’s room. If it leaves you choosing between two walnuts, the record needs more detail.
Give each common attribute a clear home
Use this table as a starting decision, then adjust it to how the vendor actually sells the piece.
| Attribute | Usually belongs in | What decides |
|---|---|---|
| Fixed seat height | Metafield | Describes the standard piece |
| Stocked size or fabric | Variant | Identifies separately counted stock |
| Custom length | Template option | Customer chooses within permitted limits |
| Fabric grade | Variant or template option | Stock identity versus configured pricing |
| Finish or legs | Variant or template option | Whether stocked or ordered to specification |
| Cushion fill | Template option | Changes the build, cost, or price |
| COM yardage | Structured specification or template field | Who supplies it and how the amount is established |
| Monogram | Line item property or template text | Captures exact wording; any charge needs its own pricing |
| Fixed overall dimensions | Metafield | Describes the product rather than a choice |
| Cleaning code | Fabric/product metafield or reusable record | Follows the selected material |
The best structure lets the next person do their job without asking the salesperson what “the nicer legs” meant. Continue with the complete made-to-order Shopify guide to carry that catalog decision through the rest of the sale.
Sources
- Adding variants — Shopify Help Center.
- Metafield limits — Shopify developer documentation.
- Liquid objects: line_item — Shopify developer documentation.
- Liquid objects: metaobject_definition — Shopify developer documentation.
A choice needs more than somewhere to type its name.