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.

Published
Updated
Jun 27, 2026
Read time
6 min
Level
Beginner

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

SurfaceComponentPurpose
Cart drawer / mini cartShippingProgressBarPrimary placement; updates on add/remove
Full cart pageSame component, widerMore room for copy + upsell link
Checkout order summaryCompact variantConfirm benefit before pay
PDP sticky barOptional micro-meterRare; can feel pushy
Empty cartHidden 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

PartSpecNotes
Message lineDynamic currency + remainder”You’re $8.00 away from free shipping”
TrackFull-width bar, 4–8px heightRounded ends; use semantic color tokens
FillProportional to subtotal ÷ thresholdCap at 100%; never overflow visually
Success stateGreen 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 typeCalculation baseDesign note
Subtotal before discountsPre-coupon cart subtotalShow bar drop when large coupon applied
Subtotal after discountsPost-couponMore generous; document in spec
Excludes gift cardsMerchandise onlyFootnote in Dev Mode
Region-specific threshold$75 US, $100 CASwap copy per locale frame
Member-only free shippingLogged-in tierReplace bar with loyalty badge
Always freeNo barStatic 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

StateTriggerUI
LoadingCart hydratingSkeleton bar + placeholder text
Below thresholdsubtotal < thresholdPartial fill + remainder copy
Threshold metsubtotal >= thresholdFull fill + success message
Free shipping already appliedPromo or membershipCheck + “Free shipping on this order”
Excluded items in cartHeavy/bulky SKUInline alert explaining exception
ErrorAPI failureRetry link; hide fake progress

Prototype below → add item → met on a cart drawer frame using interactive components.


Layout comparison

PlacementBest forDesign notes
Top of cart drawerImmediate visibilityAbove line items
Below line items, above subtotalContext near totalWorks on full cart page
Checkout sidebar onlyMinimal cart drawerWeaker AOV lift
Dual: drawer + cart pageConsistencySame component, different width
With progress stepperNever combineShipping 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

ScenarioExample 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

ModuleRelationship
CouponsRecalculate bar after apply/remove
Gift cardsUsually do not count toward threshold
Pricing / sale badgesUse discounted line price in subtotal
Sticky add-to-cartDo not duplicate meter on PDP
CheckoutShow 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

ItemDev Mode annotation
Threshold sourceCMS / shipping rules API
CalculationeligibleSubtotal definition
Fill percentagemin(subtotal / threshold, 1)
Currency formatLocale-aware; no hard-coded $
Update triggersqty change, remove, coupon, login
Animation200–300ms width transition; respect reduced motion
Analyticsshipping_bar_impression, shipping_bar_threshold_met, upsell_click
a11yrole="progressbar", aria-valuenow, aria-valuemin, aria-valuemax
Edge caseZero or negative remainder → hide or show met

Use Dev Mode checklist and responsive frames at 375px drawer width.


Common mistakes

MistakeWhy it hurtsFix
Stale remainder after qty changeBroken trustRecalculate on every cart event
Bar hits 100% but shipping still costs moneyExcluded SKUsSeparate excluded-item messaging
Showing bar when always freeNoiseStatic header promo instead
Fake progress on errorMisleadingSkeleton or hide
Combining with checkout stepperConfusing IAOne progress metaphor per surface
Aggressive PDP meterFeels manipulativeKeep incentive in cart context
Ignoring tax in specQA disputesDocument tax-inclusive vs exclusive

  1. Confirm business rules for threshold, eligible subtotal, and regional variants.
  2. Build ShippingProgressBar with below / met / loading variants and fill property.
  3. Place in cart drawer and full cart page at agreed position.
  4. Design success and excluded-item alert states.
  5. Add optional upsell link to a curated collection frame.
  6. Spec calculation, triggers, and a11y in Dev Mode.
  7. Prototype add-to-cart flow crossing threshold on mobile.
  8. 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

Share on X

§ Keep reading

Related guides.