figma guide
Designing free shipping progress bar UI in Figma: thresholds, cart drawer, and handoff
Design free shipping progress bars for cart drawers and checkout in Figma with threshold math, milestone states, promo stacking, and Dev Mode specs engineers can ship.
Beginner
- Published
- Updated
- Jun 27, 2026
- Read time
- 6 min
- Level
- Beginner
- Editor
- Abdus Salam
Quick answer
A free shipping progress bar shows how much more the shopper must spend to unlock free delivery—usually as a horizontal meter in the cart drawer, cart page, or sticky checkout summary. Display copy like “Add $12.40 for free shipping” above a fill bar that animates as line items change. Design variants for below threshold, threshold met, already free, and error/retry. Recalculate on every cart mutation; never show stale amounts after coupons or quantity edits. Pair with shopping cart UI and pricing tokens. Start from the Figma guides hub.
Who this is for
- Product designers improving average order value without dark patterns.
- Design system teams standardizing incentive meters across cart drawer, cart page, and checkout sidebar.
- Engineers implementing threshold math, currency formatting, promo exclusions, and analytics events.
Where the progress bar appears
| Surface | Component | Purpose |
|---|---|---|
| Cart drawer / mini cart | ShippingProgressBar | Primary placement; updates on add/remove |
| Full cart page | Same component, wider | More room for copy + upsell link |
| Checkout order summary | Compact variant | Confirm benefit before pay |
| PDP sticky bar | Optional micro-meter | Rare; can feel pushy |
| Empty cart | Hidden or aspirational | ”Free shipping on orders over $50” static line |
Verdict: the cart drawer is the highest-impact surface. Checkout should show a confirmed state (“Free shipping applied”) rather than nagging the user to add more.
ShippingProgressBar anatomy
| Part | Spec | Notes |
|---|---|---|
| Message line | Dynamic currency + remainder | ”You’re $8.00 away from free shipping” |
| Track | Full-width bar, 4–8px height | Rounded ends; use semantic color tokens |
| Fill | Proportional to subtotal ÷ threshold | Cap at 100%; never overflow visually |
| Success state | Green fill + check icon | ”You’ve unlocked free shipping!” |
| Upsell link (optional) | “Shop bestsellers” | Opens curated collection, not random PLP |
| Threshold footnote | ”Orders over $75” | Static when bar hidden |
ShippingProgressBar
├── Variant: state=below | met | free | loading | error
├── Variant: density=compact | standard
├── Property: threshold=75
├── Property: subtotal=62.60
├── Property: currency=USD
└── Layers:
├── MessageText
├── ProgressTrack
│ └── ProgressFill
├── SuccessIcon (met only)
└── UpsellLink (optional)
Use Auto Layout so message and bar stack vertically with 8px gap. Bind fill width as a percentage component property for prototyping.
Threshold math comparison
| Rule type | Calculation base | Design note |
|---|---|---|
| Subtotal before discounts | Pre-coupon cart subtotal | Show bar drop when large coupon applied |
| Subtotal after discounts | Post-coupon | More generous; document in spec |
| Excludes gift cards | Merchandise only | Footnote in Dev Mode |
| Region-specific threshold | $75 US, $100 CA | Swap copy per locale frame |
| Member-only free shipping | Logged-in tier | Replace bar with loyalty badge |
| Always free | No bar | Static banner in header instead |
Rule: pick one calculation rule and document it in Dev Mode. Mixed implementations confuse QA when a coupon changes eligibility.
State matrix
| State | Trigger | UI |
|---|---|---|
| Loading | Cart hydrating | Skeleton bar + placeholder text |
| Below threshold | subtotal < threshold | Partial fill + remainder copy |
| Threshold met | subtotal >= threshold | Full fill + success message |
| Free shipping already applied | Promo or membership | Check + “Free shipping on this order” |
| Excluded items in cart | Heavy/bulky SKU | Inline alert explaining exception |
| Error | API failure | Retry link; hide fake progress |
Prototype below → add item → met on a cart drawer frame using interactive components.
Layout comparison
| Placement | Best for | Design notes |
|---|---|---|
| Top of cart drawer | Immediate visibility | Above line items |
| Below line items, above subtotal | Context near total | Works on full cart page |
| Checkout sidebar only | Minimal cart drawer | Weaker AOV lift |
| Dual: drawer + cart page | Consistency | Same component, different width |
| With progress stepper | Never combine | Shipping meter ≠ checkout steps |
On mobile, keep the bar above the fold inside the drawer—do not bury it below five line items.
Copy and localization
| Scenario | Example copy |
|---|---|
| Below threshold | ”Add $12.40 more for free shipping” |
| One item away | ”Add one more item for free shipping” (if math is item-based—rare) |
| Met | ”You’ve unlocked free shipping!” |
| Member | ”Free shipping included with your membership” |
| Excluded category | ”Free shipping does not apply to furniture in your cart” |
Bold the dynamic currency amount for scannability. Use typography styles for body + emphasis, not manual bolding per frame.
Interaction with promos and pricing
| Module | Relationship |
|---|---|
| Coupons | Recalculate bar after apply/remove |
| Gift cards | Usually do not count toward threshold |
| Pricing / sale badges | Use discounted line price in subtotal |
| Sticky add-to-cart | Do not duplicate meter on PDP |
| Checkout | Show final shipping line item $0.00 |
If a coupon grants free shipping directly, transition bar to success even when subtotal is below merchandise threshold.
Handoff checklist
| Item | Dev Mode annotation |
|---|---|
| Threshold source | CMS / shipping rules API |
| Calculation | eligibleSubtotal definition |
| Fill percentage | min(subtotal / threshold, 1) |
| Currency format | Locale-aware; no hard-coded $ |
| Update triggers | qty change, remove, coupon, login |
| Animation | 200–300ms width transition; respect reduced motion |
| Analytics | shipping_bar_impression, shipping_bar_threshold_met, upsell_click |
| a11y | role="progressbar", aria-valuenow, aria-valuemin, aria-valuemax |
| Edge case | Zero or negative remainder → hide or show met |
Use Dev Mode checklist and responsive frames at 375px drawer width.
Common mistakes
| Mistake | Why it hurts | Fix |
|---|---|---|
| Stale remainder after qty change | Broken trust | Recalculate on every cart event |
| Bar hits 100% but shipping still costs money | Excluded SKUs | Separate excluded-item messaging |
| Showing bar when always free | Noise | Static header promo instead |
| Fake progress on error | Misleading | Skeleton or hide |
| Combining with checkout stepper | Confusing IA | One progress metaphor per surface |
| Aggressive PDP meter | Feels manipulative | Keep incentive in cart context |
| Ignoring tax in spec | QA disputes | Document tax-inclusive vs exclusive |
Recommended workflow
- Confirm business rules for threshold, eligible subtotal, and regional variants.
- Build
ShippingProgressBarwith below / met / loading variants and fill property. - Place in cart drawer and full cart page at agreed position.
- Design success and excluded-item alert states.
- Add optional upsell link to a curated collection frame.
- Spec calculation, triggers, and a11y in Dev Mode.
- Prototype add-to-cart flow crossing threshold on mobile.
- Align with checkout summary shipping line at $0.00 when met.
FAQ
Show progress on empty cart?
Use a static threshold message (“Free shipping on orders over $75”) without a fill bar. Hide the meter until subtotal > 0.
Multiple thresholds (express vs standard)?
Design two-tier copy only if product requires it—e.g. “Free standard shipping” at $50, express at $100. Default to one bar for clarity.
B2B net terms carts?
Often skip consumer-style meters. Replace with contract shipping rules or account-manager note.
Does this replace order summary shipping row?
No. The bar is motivation; checkout still shows the shipping line item with final price.
Next steps
- Design shopping cart and checkout UI in Figma — drawer layout and summary rows
- Design coupons and promo codes UI in Figma — recalculation rules
- Design price tags and pricing UI in Figma — subtotal and sale pricing
- Design progress indicators and steppers in Figma — do not mix with checkout steps
- Design inline alerts and banners in Figma — excluded SKU messaging
§ Keep reading