# Multiple shipping methods are available and properly configured

- **Pattern:** `ab-001220` (`ecommerce-shipping-tax.shipping-calc.multiple-methods`)
- **Severity:** high
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-001220
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-001220)

## Why it matters

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.

## Severity rationale

High because it directly suppresses conversion across the entire purchase funnel and caps achievable revenue.

## Remediation

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`:

```tsx
const methods = [
  { id: 'std', label: 'Standard', cost: 599, days: 5 },
  { id: 'exp', label: 'Express', cost: 1499, days: 2 },
]
```

## Detection

- **ID:** `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`:

  ```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>
    )
  }
  ```

Taxons: user-experience

HTML version: https://auditbuffet.com/patterns/ab-001220
