figma guide

Designing store locator and pickup UI in Figma: map, inventory, and checkout handoff

Design store locator maps, pickup-in-store selectors, BOPIS checkout steps, and inventory badges in Figma with component variants and Dev Mode specs for omnichannel retail.

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

Quick answer

Store locator and pickup UI connects online catalog to physical inventory through three reusable patterns: a locator map/list, a store selector modal, and checkout pickup steps. On PDP, show availability at nearby stores with stock badges and a Change store action. Checkout adds a Pickup person step and replaces shipping with Ready for pickup messaging. The locator itself is a split view—search + list on the left, map with pins on the right (stacked on mobile). Reuse saved addresses form patterns for pickup contact fields and order tracking for ready notifications. Start from the Figma guides hub and templates pillar.


Who this is for

  • Product designers on omnichannel retail, grocery, apparel, and electronics with ship-to-home and pickup options.
  • Design system teams aligning web, kiosk, and associate tools around one store entity model.
  • Engineers integrating geolocation, store inventory APIs, curbside flows, and pickup SLA timers.

Pickup journey map

StepSurfaceKey UI
DiscoverPDP / PLPStock badge, “Pickup available”
Select storeStoreSelectorModalSearch, list, map pins
CartCart summarySelected store line + change link
CheckoutDelivery methodShip vs pickup radio group
Pickup detailsCheckout stepName, phone, SMS opt-in
PaymentOrder summaryNo shipping line; pickup fee if any
ConfirmationThank you pageStore address, hours, pickup code
Post-purchaseEmail + accountOrder tracking with ready state

Verdict: store selection must be reversible until payment—always expose “Change store” in cart and checkout summary without forcing users back to PDP.


StoreLocator layout

ZoneDesktopMobile
SearchTop bar: city, ZIP, or “Use my location”Full-width search; location icon
FiltersChips: Open now, Curbside, In stockHorizontal scroll chips
Store listLeft column 40%Full-width list below search
MapRight 60% with pinsCollapsible map or full-screen toggle
Selected store cardSticky detail at list bottomBottom sheet on pin tap
StoreLocator
├── Variant: layout=split | mobileStack
├── Variant: context=pdp | standalone | checkout
├── Property: skuId (optional)
└── Layers:
    ├── SearchBar
    ├── FilterChips
    ├── StoreList
    │   └── StoreListItem × n
    ├── MapCanvas
    │   └── MapPin × n
    └── SelectedStoreCard

Use Auto Layout for list items. Map is usually a static placeholder in Figma with annotated pin states—engineering swaps the live map SDK.


StoreListItem anatomy

PartSpecNotes
Store namePrimary line”Downtown Kamloops”
Distance”2.4 km”From geolocation or searched ZIP
AddressSingle line truncatedLink opens native maps
Hours line”Open until 9 PM” or “Closed”Real-time from API
Stock badgeIn stock / Low / OutPer SKU when skuId set
Services chipsCurbside, LockerReuse badge tokens
Select buttonPrimary on selected row”Select store” vs “Selected”
StoreListItem
├── Variant: stock=in | low | out | unknown
├── Variant: selected=true | false
├── Property: storeId
├── Property: distanceKm=2.4
└── Layers:
    ├── StoreName
    ├── MetaRow (distance · hours)
    ├── AddressLine
    ├── StockBadge
    ├── ServiceChips
    └── SelectButton

Out-of-stock rows may remain visible with disabled select and link to Ship to home—do not hide the store entirely unless policy requires it.


MapPin states

Pin stateVisualInteraction
DefaultBrand color dotHover shows mini card
SelectedLarger pin + ringSyncs list selection
Out of stockMuted pinStill selectable for ship-from-store rules
ClusterNumber bubbleZoom to expand
User locationDistinct blue dotNot selectable

Annotate z-index and anchor point for engineering. Pair with search UI patterns when locator includes product search.


PDP pickup availability block

ElementPurpose
Fulfillment toggleShip / Pickup tabs or radio
Selected store lineName + change link → StoreSelectorModal
Stock message”Available today at Downtown”
Pickup SLA”Ready in 2 hours” vs “Ready tomorrow”
Unavailable fallbackShip option or other stores link

Place below size selector and above add to cart on PDP frames. Low stock should use the same semantic colors as PLP badges.


Checkout: ship vs pickup

Delivery optionSummary changesHidden fields
Ship to addressShipping line, address formStore selector
Pickup in storeStore address block, pickup personShipping address
CurbsideVehicle note optionalSame as pickup + spot field
DeliveryMethodSelector
├── Variant: selected=ship | pickup | curbside
└── Layers:
    ├── OptionCard (ship)
    ├── OptionCard (pickup)
    └── OptionCard (curbside, optional)

Order summary on checkout UI replaces Shipping with Pickup at Downtown and shows $0.00 or a pickup fee. Free shipping progress should hide when pickup is selected.


Pickup person form

FieldRequiredNotes
First / last nameYesMay differ from account name
PhoneYesFor ready SMS
EmailOften optionalReceipt still goes to account email
SMS notificationsOpt-in checkboxLink to policy
Alternate pickupOptional toggleSecond name field

Reuse form input states and validation error patterns. Curbside add Vehicle color / plate only if operations require it—keep optional by default.


Confirmation and ready-for-pickup states

StateUser messageUI
Order placed”We’ll email when ready”Store map thumbnail
PreparingProgress in tracking UIStepper: Placed → Preparing
Ready”Ready for pickup” + codeLarge pickup code, QR optional
Picked upCompletedArchive in history
Expired / cancelledPolicy messageLink to support

Ready state should show store hours, entrance instructions, and Add to calendar optional action. Use toasts only for ephemeral copy-to-clipboard on pickup code—not for the primary ready banner.


Standalone locator page vs modal

PatternBest forDrawbacks
ModalPDP change store, checkoutLimited map space on mobile
Full pageSEO “Stores near me”, kioskExtra navigation step
Embedded iframeLegacy retail stacksHarder to style—avoid in new designs

Verdict: one StoreSelectorModal component with density=compact for PDP and density=full for standalone page—same list item and pin components inside.


Handoff checklist

ItemDev Mode annotation
Store entity fieldsid, name, lat, lng, hours, services
Inventory APIPer-SKU quantity, SLA minutes
Geolocation permissionFallback to manual ZIP search
Selected store persistenceSession vs account saved store
Map providerPin assets, cluster rules
Pickup fee rulesFree vs flat vs waived over threshold
Analyticsstore_search, store_select, fulfillment_pickup, fulfillment_ship
a11yList selectable by keyboard; pins have text equivalent in list
Error statesLocation denied, no stores, API timeout

Use Dev Mode checklist and align store address formatting with saved addresses for consistency.


Common mistakes

MistakeWhy it hurtsFix
Store selected but cart still shows shipWrong fulfillment at checkoutSingle selectedStoreId in cart model
Map-only locator on mobileList is faster to scanDefault to list; map optional
No stock on list rowsUsers select empty storesStockBadge on every row when SKU known
Pickup code only in emailUser at store without inboxShow code in app + account
Hours static in designsClosed store selectedLive hours + “Closed” disabled state
Curbside copy on every storeWrong service promiseServiceChips per store
Reusing shipping address formConfusing labelsDedicated pickup person fields
Locator pins with no list syncAccessibility failureSelection syncs both directions

  1. Define fulfillment types with ops—pickup, curbside, locker, ship-from-store.
  2. Build StoreListItem, MapPin, and StockBadge with stock and selected variants.
  3. Compose StoreSelectorModal desktop split and mobile stack frames.
  4. Add PDP pickup block to product detail templates.
  5. Extend checkout with delivery selector and pickup person step on cart/checkout frames.
  6. Design confirmation and tracking ready states on order history rows.
  7. Hide or adapt shipping progress when pickup selected.
  8. Document API fields and analytics in Dev Mode.

FAQ

Show all stores or only stores with stock?

Default to stores with stock first, with toggle “Show all stores” for transparency. Exact sort is a product decision—annotate preferred order.

Guest checkout pickup?

Allow pickup with phone verification; prompt account creation after order with saved store preference.

Same-day vs next-day SLA?

Show dynamic SLA string from API—never hard-code “2 hours” in component defaults.

International stores?

Add country filter on locator search; currency on pricing stays checkout-scoped.

Associate-held inventory?

Optional Low stock — confirm at store badge variant when API confidence is partial.


Next steps

Share on X

§ Keep reading

Related guides.