V2 Wireframes

Checkout Experience

Adapted from the WM e-commerce checkout. Redesigned for dumpster rental: one-time purchase, single product, no account. Every element justifies its existence or gets cut.

Directory
Hauler Profile
Product Card
Book Dialog
Checkout
Confirmation
1

Data States

What we know vs. don't know at each entry point. Tier pre-selected, address unknown, geo context available.

Context matrix
2

Book Dialog

Exposed range calendar, tier toggle (when applicable), address + service area check. Three complexity variants: 1-tier, 2-tier, quote-only.

Range calendar 3 variants
3

Checkout

Single page. Placement + contact + payment. Sticky sidebar. No progress bar, no "What's Included" lists, no trust badge icons.

Less is more
4

Confirmation

Token-based tracking. 3-step timeline (not 6). Email notice. Done.

Token tracking
5

Mobile

Range calendar on mobile. Floating price bar + bottom sheet. Single column checkout.

Bottom sheet

What Got Cut (and Why)

ElementV1 Had ItV2 VerdictWhy
Progress bar (3 steps)YesCutFlow is dialog → checkout → done. User knows where they are. The back link is enough.
"What's Included" listYesCut"Delivery to your address" and "Pickup when you're done" are obvious. Patronizing.
Trust badge iconsYesCutEarned by the transaction itself, not clip-art. Cancellation policy does the work.
Surface type icon gridYesCutDropdown. 6 emoji icons for surface types is decoration, not information.
6-step timelineYesCut to 3"Fill It Up" and "Hauler Reviews Your Order" are not actionable. Keep: confirmed, delivery, pickup.
Container emoji icon boxYesCutThey just clicked a product card. They know it's a dumpster.
Waste stream in summaryYesCut"Household Junk (MSW)" is hauler nomenclature. Customer thinks "20 yard dumpster."
Separate gate code fieldYesMergedFolded into "Driver notes" with access notes + special instructions. One field, not three.
$0 delivery / $0 pickup rowsYesCutShowing "$0 Free" is marketing copy. Only show fees that aren't zero.
Hauler avatar circleYesCutNo hauler photos exist. A gray circle with initials adds nothing.
Sticky sidebarYesKeptAlways-visible pricing is the #1 anxiety reducer in checkout.
Overage disclosureYesKeptThe one thing that can surprise the customer. Must be prominent.
Cancellation policyYesKeptReduces booking anxiety for a $400+ commitment.
Range calendarNo (date input)AddedExposed calendar visualizes the rental period. Better UX than a date input.
Context

Data States at Entry

What we already know when the customer clicks "Book Online" — and what changes based on how they got here.

What's Known When "Book Online" Opens

DataStatusSource
Hauler (name, slug, rating, phone)KnownParent page props
Product (container, waste stream)KnownProductCard the user clicked from
Tier (days, price, tonnage, fees)KnownTierRow "Book Online" button passes tierId
Scheduling mode (flexible/fixed)KnownProduct attribute
Lead timeKnownProduct attribute (leadTimeDays)
Delivery addressUnknownCollected in dialog
Geo context (city/state)PartialDirectory URL if they came from /dumpster-rental/austin-tx
DatesUnknownSelected via range calendar in dialog
Customer identityUnknownCollected at checkout (no auth)
Key insight The tier is pre-selected BEFORE the dialog opens. Each TierRow in product-catalog.tsx has its own "Book Online" button that passes (productId, tierId). The dialog doesn't need tier selection for the common case (1 tier). It only needs a tier toggle when the product has 2+ tiers AND we want to let users switch without going back.

Product Complexity Variants

VariantFrequencyDialog Behavior
1 tier Most common No tier selection. Calendar + address + price. Simplest flow.
2 tiers Common Tier toggle at top of dialog. Pre-selects the tier they clicked. Calendar range updates on switch.
3+ tiers Edge case Same as 2-tier but toggle wraps. Still functional. Not optimized for — it's rare.
Quote only
(no Stripe / mustCall)
Varies No "Book Online" button exists. CTA is "Request Quote" or "Call for Pricing." Different flow entirely.

Address Pre-fill Opportunities

Entry PathAddress StateDialog Behavior
Direct to hauler profile Empty Address field empty. Full input required.
From city directory page
/dumpster-rental/austin-tx
City known Could pre-fill city/state. User still enters street. Service area likely valid.
From product detail page
(same hauler, different tier)
Previous entry If user previously entered address in this session (sessionStorage), pre-fill it.
Future: address-first search Full address Pre-filled and validated. Skip to calendar. Show "Change" link.
Implementation note Store validated address in sessionStorage on first entry. Subsequent "Book Online" clicks in the same session pre-fill from there. This is the WM sessionStorage pattern, scoped to just the address.
Screen 1

Book Dialog — Three Variants

Exposed range calendar. Tier toggle only when relevant. Address with inline service area validation.

Design rule applied Every element here either collects data we don't have, confirms data we do have, or helps the user make a decision. The product summary is one line (they just clicked from the card). The price is one number. No breakdown in the dialog — that's checkout's job.

Variant A: Single Tier (most common)

Book This Dumpster

20 yd Dumpster · 14 days · 3 tons $450
We'll confirm this address is in their service area.
Select delivery date
April 2026
Su
Mo
Tu
We
Th
Fr
Sa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
May 2026
Su
Mo
Tu
We
Th
Fr
Sa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Delivery / Pickup Rental period Unavailable
Apr 8 Apr 22 · 14 days
Need it longer? You can extend after delivery.
You won't be charged yet
Why "You won't be charged yet" earns its space This is a $400+ considered purchase from an unfamiliar brand. The #1 reason people abandon booking dialogs is fear that clicking "Continue" triggers a charge. This single line costs zero pixels of layout and directly addresses conversion anxiety. Every hotel booking site uses this pattern.

Variant B: Two Tiers

Book This Dumpster

20 yd Dumpster · 2 tons $375
7 days
$375
14 days
$450
Select delivery date
April 2026
Su
Mo
Tu
We
Th
Fr
Sa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
May 2026
Su
Mo
Tu
We
Th
Fr
Sa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Apr 8 Apr 15 · 7 days
You won't be charged yet
Tier toggle behavior The tier the user clicked on the product card is pre-selected. Switching tiers updates three things simultaneously: (1) the price in the product line, (2) the calendar range length, (3) the date summary below. The tier toggle lets users comparison-shop without going back to the product card. For 1-tier products, this toggle doesn't render at all.

Variant C: Quote Only (no Stripe / must-call)

No dialog opens. The product card shows different CTAs:

No Stripe connected
CTA: "Request Quote" → phone link or contact form
mustCall = true
CTA: "Call for Pricing" → tel: link

These paths already work in product-catalog.tsx. No wireframe needed — different flow entirely.

Screen 2

Checkout

Single page. Three sections + sidebar. Every field collects data we need. Nothing decorative.

Yeehaul
← Back to Lone Star Hauling

Where should we put it?

Pre-filled from booking dialog. Edit if needed.
3 optional fields → 1 V1 had gate code, access notes, and special instructions as separate fields. Combined into "Driver notes" — one textarea. The hauler sees it as a single string anyway (placementParts.join(" | ") in current checkout-form.tsx). Three inputs for one data point is noise.

Your details

Confirmation and tracking link sent here.
Text me delivery updates

Payment

Stripe CardElement
Your rental includes 3 tons. Weight over that is $85/ton, charged to this card after the landfill weighs it.
I understand overage charges may apply based on actual weight.
I agree to the Terms and Cancellation Policy.
Secure payment via Stripe · Free cancellation within 24 hours
Conditional rendering Fee rows only appear when > $0. The current PriceBreakdownPanel already does this. No "$0 Free" marketing lines. If delivery is included, it's included — don't list it.
Screen 3

Confirmation

Token-based tracking. Three timeline steps. No noise.

Yeehaul

Booking Confirmed

Your 20 yd dumpster with Lone Star Hauling is scheduled.

YH-2026-04-08-7X3K
Confirmation sent to [email protected] with a link to track your order, request changes, or contact your hauler.
Delivery
April 8, 2026
Pickup
April 22, 2026
Address
4812 Shoal Creek Blvd
Total Paid
$450.00

What's Next

Booking Confirmed

Payment processed. You're all set.

2

Delivery · April 8

We'll text you the day before and when the driver is en route.

3

Pickup · April 22

Dumpster picked up and weighed. If over 3 tons, overage appears on your tracking page.

Mobile

Mobile Adaptations

Range calendar works at 375px. Floating price bar + bottom sheet. Single column.

Book Dialog (mobile)
9:41🔋
Yeehaul ×
20 yd · 14 days $450
Delivery address
123 Main St, Austin, TX
Select delivery date
April 2026
Su
Mo
Tu
We
Th
Fr
Sa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Apr 8 Apr 22 · 14 days
Need longer? Extend after delivery.
You won't be charged yet
Checkout (mobile)
9:41🔋
Yeehaul
Where should we put it?
Address
4812 Shoal Creek Blvd
Placement
Left side of driveway
Surface
Select surface
Your details
Full name
Email
Phone (optional)
Payment
Stripe CardElement
3 tons included. $85/ton overage.
$450
View details ↑
Order Summary Sheet
9:41🔋
Order Summary
Hauler Lone Star Hauling
Dumpster 20 yd Roll-Off
Delivery Apr 8
Pickup Apr 22
Rental period 14 days
Base rental $450.00
Total $450.00
$85/ton overage beyond 3 tons · Free cancellation 24h
Mobile calendar Single month view on mobile (not dual). Swipe or arrow to navigate months. The range highlight works the same — delivery date at start, pickup at end, rental period shaded. shadcn's RangeCalendar handles this responsively.