figma guide

Designing flash sale and countdown timer UI in Figma: urgency, badges, and handoff

Design flash sale banners, PDP countdown timers, and promo urgency UI in Figma with sale states, timezone rules, and Dev Mode specs for PLP and checkout.

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

Quick answer

Flash sale UI communicates time-bound pricing through countdown timers, sale badges, and promo banners tied to a real end timestamp. Show days : hours : minutes : seconds (or hours : minutes : seconds under 24h) on PDP and PLP cards, plus site-wide promo banners when the sale is active. When the timer hits zero, swap to regular price—never leave a frozen “00:00:00” on screen. Design before / active / ending soon / ended variants and document timezone (store local vs user local). Start from the Figma guides hub.


Who this is for

  • Product designers running seasonal promos, lightning deals, or cart-level flash discounts.
  • Design system teams standardizing sale badges across PLP, PDP, cart, and checkout.
  • Engineers syncing server-side sale windows with client countdowns and cache invalidation.

Flash sale touchpoints

TouchpointComponentPurpose
Site bannerFlashSaleBannerSale name + global end time
PLP cardSale badge + mini timerScan urgency in grid
PDP buy boxFull countdown + strikethrough priceConversion at decision point
Cart line item”Deal ends in …”Prevent checkout delay surprises
CheckoutPrice lock noticeOptional if cart holds sale price
Post-saleEnded state + regular priceNo ghost discounts

Verdict: every surface that shows a sale price needs either a timer or static “Ends [date]” copy—pick one system-wide so shoppers are not confused.


CountdownTimer anatomy

PartSpecNotes
Label”Deal ends in” / “Sale ends tonight”Short; avoid ALL CAPS shouting
DigitsDD : HH : MM : SS or HH : MM : SSMonospace tabular nums
UnitsOptional sublabels d/h/m/sHelps accessibility
Urgency colorToken from semantic color systemOften sale-urgent, not raw red
IconLightning bolt optionalUse sparingly on PLP badges
CountdownTimer
├── Variant: phase=upcoming | active | ending_soon | ended
├── Variant: format=full | compact | text_only
├── Variant: placement=pdp | plp_badge | banner | cart
├── Property: endTimestamp=ISO8601 (annotation)
└── Layers:
    ├── Label
    ├── DigitGroup (days, hours, mins, secs)
    ├── Separator (:)
    └── EndedMessage ("Sale ended")

Use component properties for phase rather than duplicating frames per product.


Sale phase states

PhaseConditionUI treatment
UpcomingBefore startAt”Starts in …” or hidden until live
ActiveBetween start and endFull countdown + sale price
Ending soonLast 1–4 hours (configurable)Accent border or pulse on badge
EndedAfter endAtRemove timer; show compare-at price only
ExtendedMarketing extends saleUpdate timestamp; avoid “extended again” fatigue

Prototype with variant swap at ended state—never show sale price without an active phase variant.


Layout comparison

PlacementBest forDesign notes
PDP above priceHigh-consideration itemsFull digit groups; link to promo terms
PLP corner badgeGrid scanningCompact HH:MM or “Ends today”
Sticky buy barMobile long PDPSlim single-line timer
Hero bannerSite-wide flash eventCountdown + CTA to sale category
Cart summaryCheckout anxiety reductionText-only “Price held until …”

On mobile PLP, a text-only “Ends in 2h” badge often beats four digit boxes at 160px card width.


Price and badge sync

ElementSale activeSale ended
Current priceDiscountedRegular
Compare-atStrikethrough MSRPHidden or same as current
Badge”Sale” / “-30%” / “Flash”Removed
TimerRunningHidden
Coupon fieldMay stack or exclude—document rulesStandard promos only
Cart totalRecalculates at endAlert if price changes

Align badge colors with status chips—sale is not the same token as error or success.


Timezone and accuracy rules

RuleHandoff note
Source of truthServer endAt UTC; client converts
Display timezoneStore policy: “All times ET” vs user local
Clock skewRefresh from API every N minutes; tab visibility refetch
Ended handlingSoft refresh PLP prices without full page reload
Accessibility<time datetime="…"> equivalent in spec
LocaleRTL digit order unchanged; label translated

Document in Dev Mode: “Timer drift > 60s triggers resync.”


Interaction with other promo UI

ScenarioBehavior
Stacking coupon + flashShow breakdown in cart; timer still applies to base sale
Gift card + flashUsually allowed; note in promo terms frame
Member-only early accessSeparate phase=members_early variant
Waitlist / notify meTimer irrelevant; hide sale UI
Multi-currencyCountdown universal; price localized

Avoid two competing countdowns on the same PDP—merge into one primary timer.


Handoff checklist

ItemDev Mode annotation
startAt / endAtISO8601 from CMS or commerce API
Phase transitionsPoll or WebSocket for live events
Ended fallbackComponent variant phase=ended
PLP cacheTTL ≤ shortest remaining sale window
Analyticsflash_timer_view, flash_atc_before_end, sale_expired_at_checkout
a11yAnnounce phase change politely, not every second
Reduced motionStatic “Ends Dec 24, 11:59 PM ET” instead of ticking digits
LegalLink to promo terms modal

Use Dev Mode checklist and dark mode tokens if sale banners appear on dark headers.


Common mistakes

MistakeWhy it hurtsFix
Client-only timerWrong end time across timezonesServer authoritative timestamps
Frozen 00:00:00Looks brokenSwap to ended variant immediately
Sale badge without end dateFalse urgencyAlways pair badge with time bound
Different sale prices PLP vs PDPAbandonmentSingle variant price feed
Aggressive red everywhereAlarm fatigueSemantic sale tokens, one accent
Timer after sale in cartCheckout disputesRecalculate + alert banner
Countdown in email mockups onlyN/A for Figma UI kitScope to live storefront components

  1. Define sale tokens in color system (sale, sale-urgent, sale-ended).
  2. Build CountdownTimer with phase variants and compact/full formats.
  3. Add SaleBadge for PLP cards linking to same endAt property.
  4. Integrate into PDP buy box above price block; mirror on sticky bar if used.
  5. Design site FlashSaleBanner with link to sale category or search filters.
  6. Spec ended + extension flows and cart price-change alert.
  7. Prototype active → ending soon → ended on one product frame.
  8. Document timezone policy and API refresh cadence for engineering.

FAQ

Show seconds on PLP cards?

Usually no—use hours/minutes or “Ends today” to reduce visual noise. Full seconds belong on PDP or cart.

Fake perpetual countdown?

Avoid it—regulatory and trust risk. Use evergreen “Limited stock” only when inventory-backed.

Multiple overlapping sales?

One primary timer per SKU. Secondary promos use static badges without competing clocks.

Lightning deal vs site-wide flash?

Lightning = SKU-scoped short window; site flash = category or catalog. Same component, different scope property in handoff.


Next steps

Share on X

§ Keep reading

Related guides.