Product Variations & Sizes
Work with product variants, sizes, and pricing.
Updated
On this page
Overview
Products in DashForDevs can have a multi-level variant structure: Attributes → Options → Sizes. This lets you model complex product configurations like strains with multiple weight options.
Structure
Product
└── Attribute (e.g. "Strain")
└── Option (e.g. "Blue Dream")
└── Size (e.g. "1g" at $29.99)
└── Size (e.g. "3.5g" at $89.99)
└── Option (e.g. "OG Kush")
└── Size (e.g. "1g" at $34.99)
If a product has no attributes, it will have sizes directly at the product level via main_size.
Fetching Options
import dash from "@/lib/dash"
const { options } = await dash.products.getOptions("blue-dream")
// options.variations = attributes array
// Each attribute has options, each option has sizes
Building a Variation Picker
"use client"
import { useState, useEffect } from "react"
import dash from "@/lib/dash"
export function VariationPicker({ slug }: { slug: string }) {
const [options, setOptions] = useState(null)
const [selectedOption, setSelectedOption] = useState(null)
const [selectedSize, setSelectedSize] = useState(null)
useEffect(() => {
dash.products.getOptions(slug).then(({ options }) => {
setOptions(options)
// Auto-select the main (default) option
const mainOption = options.variations?.[0]?.options?.find(o => o.main)
if (mainOption) {
setSelectedOption(mainOption)
setSelectedSize(mainOption.sizes?.[0])
}
})
}, [slug])
if (!options) return <div>Loading...</div>
return (
<div>
{/* Option buttons */}
{options.variations?.[0]?.options.map(opt => (
<button key={opt.id} onClick={() => {
setSelectedOption(opt)
setSelectedSize(opt.sizes[0])
}}>
{opt.value}
</button>
))}
{/* Size buttons */}
{selectedOption?.sizes.map(size => (
<button key={size.id} onClick={() => setSelectedSize(size)}>
{size.label} — ${size.discounted_price || size.price}
</button>
))}
{/* Add to cart */}
<button onClick={() => dash.cart.add({
productId: "prod_...",
sizeId: selectedSize.id,
quantity: 1
})}>Add to Cart</button>
</div>
)
}
Bulk Discounts
Sizes can have quantity-based bulk discounts:
{
"bulk_discounts": [
{ "min_quantity": 3, "discount_type": "percentage", "discount_value": "5" },
{ "min_quantity": 5, "discount_type": "percentage", "discount_value": "10" },
{ "min_quantity": 10, "discount_type": "percentage", "discount_value": "15" }
]
}
Display these on the product page to encourage larger orders.
Featured Variations
Get variations marked as featured across all products:
const { variations } = await dash.products.getFeaturedVariations()
// Great for homepage featured sections
Next Steps
- Add to Cart — Adding a specific size to the cart
- Search & Filters — Finding products
- Stock Management — Understanding inventory levels