Single-option shipping forces every customer into the same cost-speed tradeoff, driving cart abandonment when buyers need faster delivery or want to avoid paying for speed they don't need. Baymard research attributes roughly half of all checkout abandonment to shipping friction. Missing express or economy tiers also hides revenue: urgent buyers will pay a premium for overnight, and price-sensitive buyers require a cheap ground option to convert at all. From a user-experience (UX) perspective, the absence of choice signals an unfinished store.
High because it directly suppresses conversion across the entire purchase funnel and caps achievable revenue.
Define at least two shipping methods with distinct rates and timeframes (for example standard ground and express), persist them as a configuration or database table, and render them as a radio or dropdown control inside the checkout flow. Wire the selected method into the order total before payment. See components/ShippingMethodSelector.tsx:
const methods = [
{ id: 'std', label: 'Standard', cost: 599, days: 5 },
{ id: 'exp', label: 'Express', cost: 1499, days: 2 },
]
ID: ecommerce-shipping-tax.shipping-calc.multiple-methods
Severity: high
What to look for: Enumerate all shipping methods defined in the codebase (configuration files, database seeds, or constants). For each method, count whether it has: (1) a distinct label, (2) a distinct rate or rate calculation, (3) a distinct delivery timeframe. Report: X methods found with Y complete configurations.
Pass criteria: At least 2 distinct shipping methods are available for customer selection, each with a unique rate and delivery timeframe. Methods must be selectable in the checkout UI via radio buttons, dropdown, or similar control.
Fail criteria: Fewer than 2 shipping methods exist, or the shipping method selector UI is missing/non-functional, or methods exist but share identical rates and timeframes.
Skip (N/A) when: The store is digital-only or uses a managed fulfillment service with a single pre-determined shipping method (no in-house method configuration).
Detail on fail: "1 shipping method found: 'Standard ($9.99, 5-7 days)'. No express, overnight, or alternative options configured." or "Shipping method selector renders 3 options but all share the same $5.00 rate."
Remediation: Add multiple shipping methods to your checkout flow in components/ShippingMethodSelector.tsx:
// components/ShippingMethodSelector.tsx
export function ShippingMethodSelector({ methods, selected, onChange }) {
return (
<div className="space-y-3">
{methods.map(method => (
<label key={method.id} className="flex items-center gap-2">
<input type="radio" value={method.id} checked={selected === method.id} onChange={(e) => onChange(e.target.value)} />
<span>{method.label} — {method.days} days (${(method.cost / 100).toFixed(2)})</span>
</label>
))}
</div>
)
}