When a product has four or five defining attributes — finish, wattage, size, compatibility — and the combinations aren't just SKU variations but genuinely different pricing and stock units, most POS systems force you into workarounds. We've built a lighting retailer's POS where this was the exact operating reality.
Lightspeed and Square both support product variants. Their variant models work well for fashion retail (size × colour), for basic electronics (storage × colour), and for most standard retail product structures. They fail when the product has more than two or three independent variant axes, when different variant combinations have structurally different pricing (not just price overrides), or when the variant matrix is sparse — where most combinations don't exist as actual products.
A lighting retailer with the product attributes we described (finish, wattage, size, compatibility) has thousands of theoretically possible combinations, but only a few hundred actual products. The variant matrix is sparse. Standard POS systems require you to create every variant as a product record — including the ones that don't exist — or to use workarounds (custom fields, serialised SKUs) that make inventory tracking unreliable.
The custom solution: a product data model that represents attributes and variants as first-class entities, with explicit stock records only for combinations that actually exist. The checkout flow resolves attributes in sequence (customer selects finish, system shows available wattages given that finish, customer selects wattage, system shows available sizes, and so on) rather than presenting an undifferentiated dropdown of all variants. This is a different data model from anything off-the-shelf POS provides — it's a schema decision, not a configuration one.