Rolls
3.71 m wide. Linear metres = area ÷ 3.71, rounded up to the next 2 m. Split into 20 m rolls plus one remainder roll. 180 m² becomes 2 × 20 m + 1 × 10 m. Each roll is a variant of the turf product (length), added with its quantity.
Synthetic turf
On the live store this posts one request to Shopify's /cart/add.js with every line and quantity below, then opens the cart drawer. Sand rate, pin rate, warranty and price come from the product's metafields, so the store owner changes them in Shopify admin, never in theme code.
3.71 m wide. Linear metres = area ÷ 3.71, rounded up to the next 2 m. Split into 20 m rolls plus one remainder roll. 180 m² becomes 2 × 20 m + 1 × 10 m. Each roll is a variant of the turf product (length), added with its quantity.
Sand = area × the product's own kg/m² metafield, sold as 20 kg bags. Pins from a per-m² rate. Jointing tape (100 m rolls) and glue (20 L drums) are added only when the order has more than one roll: joins = rolls − 1, join length = roll length.
Product metafields: turf.sand_rate_kg_m2, turf.pin_rate_per_m2, turf.warranty_years. Accessory products are picked in the section settings. The calculator is a custom Online Store 2.0 section (Liquid + JS) on a Dawn base, no page builder, no paid theme.
// /cart/add.js payload appears here