figma guide

Designing buy now, pay later and installment UI in Figma: checkout, PDP, and payment handoff

Design buy now pay later badges, installment breakdowns, checkout selectors, and payment handoff UI in Figma with component variants and Dev Mode specs for ecommerce teams.

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

Quick answer

BNPL and installment UI is three layers: a PDP price callout, a checkout payment option, and a provider disclosure modal. On product detail pages, show “Pay in 4 interest-free payments of $24.99” with a learn-more link that opens a breakdown modal—not a full redirect. At checkout, BNPL sits alongside credit cards and wallets as a radio option with provider logos and eligibility messaging. Every surface needs approved, declined, and unavailable states because provider APIs gate offers by cart total and region. Reuse pricing tokens for installment amounts and form patterns for redirect-return flows. Start from the Figma guides hub and templates pillar.


Who this is for

  • Product designers on DTC, marketplace, and high-AOV retail where BNPL lifts conversion on carts over $50.
  • Design system teams aligning provider widgets, legal copy, and payment step layouts across web and app.
  • Engineers integrating Klarna, Affirm, Afterpay, PayPal Pay Later, or Stripe installments with redirect and webhook flows.

BNPL surfaces map

SurfaceComponentPurpose
PDP price blockInstallmentCalloutPre-qualify interest before add to cart
PLP card (optional)InstallmentBadgeCompact “From $X/mo” on high-ticket items
Cart summaryInstallmentCalloutRemind before payment step
Checkout paymentBNPLOptionCardSelect provider alongside card/wallet
Provider modalInstallmentBreakdownModalSchedule table + legal footer
Order confirmationBNPLConfirmationLine”Managed by Klarna” with link
Account paymentsInstallmentScheduleRowUpcoming autopay (if brand hosts portal)

Verdict: design the checkout payment card and breakdown modal first—PDP widgets are marketing wrappers around the same math and copy rules.


InstallmentCallout anatomy

PartSpecNotes
Provider logo16–20px heightUse official brand assets only
Headline”Pay in 4 interest-free payments”Provider copy may be locked—check legal
Amount line”4 × $24.99”Dynamic from cart/variant price
Learn more linkOpens modalNever hide total cost
Unavailable stateHidden or mutedBelow minimum order threshold
InstallmentCallout
├── Variant: density=compact | standard
├── Variant: state=available | unavailable | loading
├── Property: installmentCount=4
├── Property: installmentAmount=24.99
├── Property: provider=klarna | affirm | afterpay
└── Layers:
    ├── ProviderLogo
    ├── Headline
    ├── AmountLine
    └── LearnMoreLink

Place below sale price on PDP and above sticky add to cart. On mobile, keep the callout one line + link to avoid pushing primary CTA below the fold.


InstallmentBreakdownModal

SectionContentHandoff note
HeaderProvider logo + “How it works”Modal, not new tab, when possible
Schedule tableDate, amount, status4 rows for pay-in-4
Total comparisonSame as full priceNo hidden fees line item
Eligibility noteSoft credit check disclaimerLegal text from provider
Primary CTA”Continue shopping” or “Select at checkout”Context-dependent
Footer linksTerms, privacyProvider URLs
InstallmentBreakdownModal
├── Variant: provider=klarna | affirm | afterpay
├── Property: schedule[] (date, amount)
└── Layers:
    ├── Header
    ├── ScheduleTable
    ├── TotalRow
    ├── DisclaimerText
    ├── PrimaryButton
    └── LegalLinks

Use table UI patterns for the schedule. Annotate that dates are estimates until checkout authorization completes.


Checkout: BNPLOptionCard

StateUIUser action
DefaultLogo + “Pay in 4 with Klarna”Select radio
SelectedExpanded panel with summaryContinue to provider redirect
IneligibleDisabled + reason”Order below $35 minimum”
ErrorInline alertRetry or choose card
Redirect pendingSpinner + “Redirecting to Klarna…”No double-submit
BNPLOptionCard
├── Variant: provider=klarna | affirm | afterpay | paypal
├── Variant: state=default | selected | ineligible | error | redirecting
└── Layers:
    ├── RadioControl
    ├── ProviderLogo
    ├── TitleLine
    ├── Subtitle (optional)
    └── ExpandedPanel (when selected)

Stack with payment method cards in one vertical list. Do not nest BNPL inside the credit card form—it is a peer payment type.


Price and cart integration

RuleDesign implication
Installments on variant changeCallout updates with selected SKU price
Cart-level totalCheckout uses cart total, not line average
Discounts / couponsRecalculate installment amounts in summary
Tax and shippingProvider rules vary—show “estimated” until final
Mixed cartSome items BNPL-ineligible
Gift cards appliedReduce financed amount

Show installment math in order summary sidebar when BNPL is selected, mirroring checkout UI tax/shipping lines.


Provider redirect and return flow

StepScreenKey UI
1. Select BNPLCheckout paymentSelected card expanded
2. Place order / continuePrimary CTA label changes”Continue to Klarna” not “Pay now”
3. RedirectFull-page or popupBranded interim loader
4. ApprovedReturn URL → confirmationStandard thank-you + BNPL line
5. DeclinedReturn URL → checkoutInline alert + card fallback
6. AbandonedReturn URL → checkoutPreserve cart; no error tone

Document return URLs and error codes in Dev Mode. Use progress steppers only if checkout is multi-step—do not add fake steps for external redirect.


PLP and high-AOV badges

PatternCopyBest for
Monthly from”From $42/mo”Furniture, electronics
Pay in 4”4 payments”Fashion, beauty
0% APRRegulated financingOnly when legally accurate

Keep PLP badges smaller than PDP callouts—reuse badge/chip tokens. Hide on mobile PLP if space is tight; PDP is the canonical disclosure surface.


Handoff checklist

ItemDev Mode annotation
Minimum / maximum orderPer provider, per region
CurrencyInstallment amounts match pricing locale
Provider SDK vs redirectWidget DOM vs hosted flow
Cart recalculation eventsCoupon, shipping, gift card
Selected payment persistenceSession through redirect
Analyticsbnpl_callout_view, bnpl_modal_open, bnpl_select, bnpl_approved, bnpl_declined
a11yRadio group labels include provider name; modal focus trap
LegalProvider-mandated copy blocks—do not paraphrase

Use Dev Mode checklist and link to payment methods for shared card container specs.


Common mistakes

MistakeWhy it hurtsFix
Static installment amounts on PDPWrong math after variant changeBind to selectedVariant.price
BNPL buried under card formUsers miss financing optionPeer-level payment radio
No declined stateDead-end after redirectAlert + preserve checkout
Marketing “0%” without termsCompliance riskProvider-approved copy only
Hiding total in modalTrust and regulatory issuesAlways show full price comparison
Multiple providers with no defaultChoice paralysisOrder by conversion data or region
Callout on ineligible low-ticket SKUsBroken empty statesstate=unavailable rules
Confirmation missing provider lineSupport confusionBNPLConfirmationLine on thank-you

  1. Confirm providers and regions with finance—Klarna, Affirm, Afterpay, PayPal, Stripe each have different widgets.
  2. Build InstallmentCallout and InstallmentBreakdownModal with one provider variant set first.
  3. Add BNPLOptionCard to checkout payment step.
  4. Wire PDP placement on product detail templates below price.
  5. Design redirect, approved, declined, and abandoned return frames.
  6. Add confirmation and optional account schedule rows on order history.
  7. Document thresholds, analytics, and legal strings in Dev Mode.

FAQ

Show BNPL on every product?

Gate by category, price floor, and region. Design unavailable as hidden or collapsed—not an error state on cheap SKUs.

Pay in 4 vs longer financing?

Use separate components—pay-in-4 is simple schedule; 12-month APR needs extra disclosure and different modal layout.

Stack BNPL with loyalty points?

Usually points apply before financing—show updated installment amount when points slider moves.

Marketplace multi-seller carts?

BNPL often requires single merchant—design split-cart messaging at payment step.

In-app WebView checkout?

Redirect may break—annotate Safari/Chrome custom tab pattern for mobile app teams.


Next steps

Share on X

§ Keep reading

Related guides.