figma guide

Designing shopping cart and checkout UI in Figma: line items, totals, and handoff

Design cart drawers, line items, quantity steppers, promo codes, and checkout steps in Figma with variants, empty states, and Dev Mode specs for ecommerce flows.

Published
Updated
Jun 17, 2026
Read time
7 min
Level
Beginner

Quick answer

Cart and checkout UI spans three surfaces: mini-cart or drawer (quick edit), full cart page (review), and stepped checkout (shipping → payment → confirm)—each reuses the same LineItem and OrderSummary components. Build LineItem with thumbnail, title, variant text, price, quantity stepper, and remove action; wrap items in CartPanel with sticky OrderSummary (subtotal, discounts, shipping, tax, total). Model empty cart, loading, and error states explicitly. Pair with forms, modals, and progress steppers. Start from the Figma guides hub.


Who this is for

  • Product designers shipping DTC stores, marketplaces, and subscription checkout.
  • Design system teams aligning cart density across web and mobile breakpoints.
  • Engineers implementing quantity limits, promo validation, tax/shipping APIs, and payment element slots.

Cart and checkout surfaces

SurfaceGoalKey components
Mini-cart / drawerFast review without leaving browseCartDrawer, LineItem compact
Full cart pageEdit quantities, apply promosCartPage, LineItem full, PromoField
Checkout stepsCollect shipping + paymentCheckoutStep, OrderSummary sticky
Order confirmationReceipt + next actionsConfirmationCard, read-only summary
Abandoned cart emailRecovery (marketing)Static mock—link to live components

Verdict: one LineItem component with density=compact | comfortable beats separate drawer and page components that drift apart after the first sprint.


LineItem anatomy

PartPurposeSpec tip
ThumbnailProduct image64–80px square; export @2x
TitleProduct name2-line clamp max
VariantSize, color, SKUtext/secondary 14px
Unit pricePer-item pricesm PriceDisplay
Line totalqty × pricemd, right-aligned
QuantityStepper or inputMin 1, max stock
RemoveIcon button or linkConfirm on expensive items optional
LineItem
├── Variant: density=compact | comfortable
├── Variant: state=default | disabled | error
├── Property: quantity (number)
├── Property: maxQuantity (number optional)
└── Layers:
    ├── Thumbnail
    ├── Details (title + variant)
    ├── PriceColumn (unit + line total)
    └── Actions (qty + remove)

Use horizontal auto layout with fixed thumbnail width; let title wrap in the flexible column.


Quantity controls

ControlBest forStates
Stepper (− / +)Most cartsdefault, min disabled, max disabled
Numeric inputB2B bulk ordersfocus, error (exceeds stock)
DropdownLow max (1–5)Rare—use dropdown
StateVisualCopy
DefaultEnabled stepper
Min reached disabled
Max stock+ disabled”Only 3 left”
ErrorRed border on input”Maximum quantity exceeded”
UpdatingSkeleton on line totalOptimistic UI note

Prototype stepper with interactive components swapping quantity property—production debounces API updates.


OrderSummary block

RowOrderNotes
Subtotal1Sum of line totals
Discount / promo2Negative amount; green optional
Shipping3”Calculated at next step” or estimate
Tax4Label jurisdiction if required
Total5Bold, lg price
Savings (optional)6”You save $12.00” below total
OrderSummary
├── Variant: sticky=on | off
├── Layer: Rows (auto layout vertical)
├── Layer: Divider
├── Layer: Total row
└── Layer: Primary CTA

Sticky summary on desktop checkout: right column fixed while left scrolls forms. On mobile, summary collapses into accordion or top summary bar—document breakpoint behavior.


Checkout step patterns

StepContentComponents
1 — Cart reviewLine items + promoCartPage, PromoField
2 — ShippingAddress form, methodAddressForm, shipping radio group
3 — PaymentCard / wallet slotPayment iframe placeholder frame
4 — ReviewRead-only summary + place orderLineItem read-only, legal checkbox
ConfirmationOrder ID, email sentEmpty-state-style success

Use progress stepper or breadcrumbs for orientation—stepper for <5 steps, breadcrumbs when users may jump back to cart.


Promo code and gift card

ElementPlacementStates
PromoFieldBelow line items or in summarydefault, applying, success, error
Applied promoSummary rowCode + remove link
Gift cardSeparate expandable sectionCollapsed by default
StateUIMessage example
DefaultText input + Apply buttonPlaceholder: “Promo code”
ApplyingButton loading
SuccessGreen inline alert”SAVE20 applied”
InvalidError on field”Code expired or invalid”
Stacking ruleNote in Dev Mode”One code per order”

Do not hide promo behind multiple modals unless fraud requires it—discoverability drives conversion.


Cart drawer vs full page

AspectDrawerFull page
Width360–420pxContent max-width ~1200px
LineItemcompactcomfortable
SummarySubtotal + CTA onlyFull OrderSummary
Empty stateCentered in drawerFull viewport
CTA”Checkout” → checkout”Proceed to checkout”
CloseX or overlay clickN/A

Show item count badge on cart icon in navigation—badge component with count property max 9+.


Empty, loading, and error states

StateDrawerCart page
EmptyIllustration + “Your cart is empty” + shop CTASame + category links
LoadingSkeleton line items × 2Full page skeleton
Item unavailableLineItem state=error + remove suggestionStrike item + notify
Checkout errorToast or top banner”Payment failed—try again”
Session expiredModal redirect loginPreserve cart note

Reuse empty state patterns—do not leave a blank drawer.


Accessibility requirements

RequirementImplementation
Cart iconaria-label="Cart, 3 items"
Quantity stepperaria-live="polite" on line total update
RemoveConfirm dialog for high-value optional; focus trap in modal
Promo erroraria-describedby on input
Total changeAnnounce after promo applied
KeyboardTab through line items; stepper buttons focusable

Run accessibility plugins on error red and disabled stepper grays.


Handoff to engineering

DeliverableTypeNotes
lineItems[]arrayid, title, variant, qty, unitPrice, imageUrl
summaryobjectsubtotal, discount, shipping, tax, total
currencyISO codeSame as price component
promoCodestring optionalValidated server-side
onQuantityChangecallbackDebounce 300ms typical
onRemovecallback
checkoutStepenumcart | shipping | payment | review
paymentSlotframe name#payment-element mount point

Publish Patterns / Commerce / Cart in your team library. Payment UI is often iframe-hosted—draw a labeled placeholder frame with min height 200px. Link Dev Mode checklist.


Real-world examples

Fashion DTC drawer

Compact LineItem × 2, subtotal $118.00, primary “Checkout”. Free shipping progress bar: “Add $32 for free shipping” using progress indicator below items.

Marketplace full cart

Comfortable rows with seller grouping subheaders. Promo field expanded. Sticky summary on desktop; mobile floating bar with total + checkout.

Subscription checkout

Single plan LineItem (no thumbnail), annual toggle from segmented control, payment step with Apple Pay + card tabs.


Common mistakes

MistakeConsequenceFix
Different line item in drawer vs pageVisual driftOne component, density variant
No empty cart stateConfusing zero stateDedicated empty state
Tax shown before addressWrong totals”Calculated at checkout” placeholder
Tiny tap targets on stepperMobile frustration44×44px min touch
Remove without undoAccidental lossToast with undo 5s
Promo success without summary rowUser doubts discountShow negative line in summary
Payment as static card UIPCI mismatchPlaceholder frame for provider
No loading on qty changeFeels brokenSkeleton line total
Cart badge missing on navUsers forget itemsBadge on icon
Checkout without step indicatorAnxietyStepper or breadcrumbs

FAQ

Drawer or dedicated cart page first?

Both for serious ecommerce—drawer for speed, page for promo and cross-sell. Share components.

Show product ratings in cart?

Usually no—reduces scan speed. OK on upsell rows below summary.

Guest checkout?

Design email-first step without forcing account creation; account creation optional on confirmation.

Mobile sticky checkout bar?

Yes when summary scrolls off-screen—show total + CTA fixed bottom; document safe area for notched phones per mobile frames guide.


Bottom line

Reuse LineItem and OrderSummary across drawer, cart page, and checkout so quantity, pricing, and promo behavior stay consistent end to end. Model empty, loading, and payment placeholder states up front—cart is where trust breaks if totals lag or discounts disappear. Continue with pricing UI, forms, tables, and the tutorials hub.

Share on X

§ Keep reading

Related guides.