figma guide

Designing gift cards and vouchers UI in Figma: balance, redemption, and handoff

Design gift card purchase, redemption, balance display, and wallet UI in Figma with payment-method states, partial apply rules, and Dev Mode specs for ecommerce checkout.

Published
Updated
Jun 21, 2026
Read time
8 min
Level
Beginner

Quick answer

Gift card UI is a payment method, not a discount row—separate it from promo codes with its own entry field, applied-balance row, and wallet surfaces for saved cards. Build GiftCardField (number + PIN optional), AppliedGiftCard with remaining balance, and GiftCardBalanceRow in OrderSummary that reduces amount due rather than showing a negative discount. Model purchase flows (digital delivery, physical card, email recipient), account wallet with multiple cards, and partial apply when balance < order total. Pair with cart/checkout, forms, and price tokens. Start from the Figma guides hub.


Who this is for

  • Product designers shipping DTC stores, marketplaces, and omnichannel retail with gift card programs.
  • Design system teams aligning gift card display across checkout, account wallet, and marketing landing pages.
  • Engineers implementing gift card APIs, partial redemption, fraud checks, and ledger balance updates.

Gift card surfaces

SurfaceGoalKey components
Checkout apply fieldRedeem at paymentGiftCardField, AppliedGiftCard
OrderSummary balance rowReduce amount dueGiftCardBalanceRow
Account walletSaved cards + historyGiftCardWalletCard list
Purchase flowBuy new cardGiftCardPurchaseStep wizard
PDP / marketingPromote gift cardsHero CTA + denomination picker
Email / digital deliveryRecipient experienceStatic mock + copy spec
Order detailPayment breakdownPaymentMethodRow gift card line

Verdict: never reuse PromoCodeField for gift cards—the mental model is wallet balance applied to payment, not a percentage off subtotal. Separate components prevent engineers from routing both through discount logic.


GiftCardField anatomy

PartPurposeSpec tip
Label”Gift card” or “Redeem gift card”Distinct from “Promo code” label
Card number input16–19 digit entryMask display optional: **** **** **** 1234
PIN fieldSecurity for physical cards4–8 digits; separate input
Apply buttonValidate + attach balanceLoading state during API
Helper textWhere to find number”On back of card below barcode”
Error messageInvalid / zero balanceBelow field group
GiftCardField
├── Variant: layout=inline | stacked
├── Variant: state=empty | focus | loading | error | success | disabled
├── Property: hasPin (boolean)
└── Layers:
    ├── Label
    ├── CardNumberInput
    ├── PinInput (optional)
    ├── ApplyButton
    ├── HelperText
    └── ErrorMessage

Use form input states for focus and error borders. On mobile, stack card number and PIN full-width—inline PIN fields are hard to tap.


Validation states

StateTriggerVisualCopy examples
EmptyDefaultNeutral borderPlaceholder: “Card number”
FocusUser taps fieldFocus ring
LoadingApply clickedSpinner on button
Invalid numberAPI 400Red border”We couldn’t find this card”
ExpiredDate passedRed border”This gift card expired”
Zero balanceBalance $0Error message”This card has no remaining balance”
Already appliedDuplicateInfo message”This card is already applied”
SuccessValid + balance > 0Show AppliedGiftCard”Gift card applied — $50.00 available”

Prototype Apply → loading → success/error with interactive components. Document fraud rate-limit UI: after 3 failures, show inline alert “Try again in 15 minutes.”


AppliedGiftCard component

PartPurposeSpec tip
Card labelMasked numberGift card •••• 4821
Available balanceRemaining after apply$50.00 available
Applied amountWhat covers this order−$50.00 applied
Remaining after orderIf partial$0.00 remaining on card
Remove actionUnapply before pay”Remove” link or × icon
AppliedGiftCard
├── Variant: density=compact | comfortable
├── Variant: coverage=full | partial
├── Property: balance (number)
├── Property: appliedAmount (number)
└── Layers:
    ├── Icon (gift or card)
    ├── CardLabel + BalanceText
    ├── AppliedAmount
    └── RemoveButton

Place below promo section if both exist—visual order: discounts first, payment methods second.


OrderSummary gift card rows

Row typeWhenDisplay
GiftCardBalanceRowCard appliedGift card label + −$50.00
AmountDueRowAfter gift cardUpdated total prominently
RemainingBalanceNotePartial apply”Pay remaining $24.50 with card below”
Multiple cardsStacking allowedStacked rows per card

Gift card rows use payment adjustment styling—not green discount styling. Use neutral or text/primary for amounts; reserve green for explicit “You saved” promo lines.

ScenarioSubtotalGift cardAmount due
Full coverage$45.00−$45.00$0.00
Partial$75.00−$50.00$25.00
Multiple cards$100.00−$30 + −$20$50.00

Link row math to price display tokens—same decimal rules as cart line items.


Purchase flow (buy a gift card)

StepContentComponents
1. AmountDenomination pickerDenominationChip ($25, $50, $100, custom)
2. DeliveryEmail vs physicalDeliveryMethodCard
3. RecipientTo, from, messageForm fields
4. ScheduleSend now vs future dateDate picker
5. Review + paySummaryReuse checkout payment block
DenominationChip
├── Variant: state=default | selected | disabled
├── Property: amount (number)
└── Layers:
    ├── AmountLabel
    └── CustomInput (optional variant)

Physical card shipping adds address step—reuse checkout address components. Digital-only stores skip address entirely.


Account wallet

ElementPurposeSpec
GiftCardWalletCardSaved card tileBalance + masked number + expiry
Add card CTALink external cardOpens GiftCardField modal
Transaction historyLoad / redeem logTable or list
Empty stateNo cards savedEmpty state + buy CTA
GiftCardWalletCard
├── Variant: state=active | expired | zero_balance
├── Property: balance (number)
├── Property: expiresAt (date optional)
└── Layers:
    ├── CardArt (brand gradient)
    ├── MaskedNumber
    ├── BalanceAmount
    ├── ExpiryLabel
    └── ActionLink ("View history")

Show wallet in account sidebar nav under Payments or Wallet—not buried in order history.


Stacking rules with promos

RuleUI treatment
Gift card + promo allowedBoth sections visible; totals recalc together
Mutually exclusiveError on second apply: “Can’t combine with gift card”
Promo on subtotal, gift on remainderDev Mode note on calculation order
Gift card buys gift cardBlock with error

Document calculation order in handoff—designers often show final total without explaining intermediate steps engineers must implement.


Responsive behavior

BreakpointApply fieldWallet
MobileStacked inputs; sticky amount dueSingle-column cards
TabletInline Apply on wide fields2-column grid
DesktopCollapsible “Gift card” section in checkout3-column grid

On mobile checkout, show updated amount due immediately after apply—users shouldn’t scroll to find the new total.


Handoff checklist

ItemDev Mode annotation
Card number formatStrip spaces; validate length
PIN requiredPhysical vs digital cards
Partial apply logicmin(balance, amount_due)
Multiple card stackingMax cards per order
Balance API timingReal-time vs cached
Remaining balance storageOn card entity after order
Fraud lockoutUI after N failed attempts
Email delivery templateMatch purchase confirmation UI
Analyticsapply_gift_card, purchase_gift_card
CurrencySingle-currency vs conversion note

Use Dev Mode checklist and link GiftCardBalanceRow to checkout OrderSummary props.


Common mistakes

MistakeWhy it hurtsFix
Gift card in discount rowWrong tax + ledger logicSeparate payment adjustment row
Same field as promo codeUser confusionDistinct labels and sections
No partial apply UIAbandoned high-value cartsShow remaining balance + amount due
Balance not updated after applyDistrust at paymentLive recalc with loading skeleton
No wallet in accountRe-entry every orderSaved cards in account area
Purchase flow without delivery specBroken recipient emailsEmail mock in Figma + copy doc

  1. Define program rules (denominations, PIN, stacking, expiry) with PM/finance.
  2. Build GiftCardField + AppliedGiftCard separate from promo components.
  3. Add GiftCardBalanceRow to checkout OrderSummary with partial-apply states.
  4. Design purchase wizard if store sells cards—denomination + delivery + recipient.
  5. Create account wallet with GiftCardWalletCard and history.
  6. Document stacking rules with promo and payment methods.
  7. Prototype checkout apply → partial pay → order detail payment breakdown.
  8. Spec digital delivery email aligned to purchase confirmation UI.

FAQ

Gift card or store credit after return?

Different UI—store credit from returns may auto-apply; label it “Store credit” not “Gift card” unless they share the same backend.

Can users split across gift card + credit card?

Yes—show amount due after gift card with payment method selector below. Hide card form when amount due is $0.

Physical card barcode scan?

Add Scan card camera CTA on mobile GiftCardField—static frame mock + “Opens camera” note for engineers.

Marketplace seller gift cards?

If cards are seller-specific, show seller name on AppliedGiftCard and block cross-seller application—mirror multi-seller returns grouping.


Next steps

Share on X

§ Keep reading

Related guides.