Screen 1 of 7 Hauler-Branded

Home Page

The landing page for the hauler's hosted website. Hero CTA drives calls to the AI phone agent. Secondary CTA links to YeeHaul product pages for online booking. Everything auto-populates from existing data.

Data source This entire page is assembled from: haulers table (name, description, rating, reviewCount, hoursOfOperation), products + productRentalTiers (service cards with pricing), haulerServiceCities (area mention), and provisioned_numbers (AI phone number). The hauler configures zero of this — it materializes on subscription.
lone-star-disposal.yeehaul.app
★ 4.8 · 127 Google Reviews · Austin, TX

Lone Star Disposal

Locally owned since 2014. Roll-off dumpster rentals with transparent pricing and same-day delivery across the greater Austin metro.

10 Yard
Small cleanouts & remodels
From $325
View on YeeHaul →
20 Yard
Kitchens, roofing, mid-size jobs
From $425
View on YeeHaul →
30 Yard
Large renovations & construction
From $525
View on YeeHaul →
40 Yard
Demolition & estate cleanouts
From $675
View on YeeHaul →
See full pricing & availability on YeeHaul →
Questions? Call (512) 555-0147 for a free quote — or browse all options on YeeHaul →

Lone Star Disposal has been serving the greater Austin metro area since 2014. What started as a single-truck operation has grown into one of Central Texas's most trusted dumpster rental services.

We believe in straightforward pricing, reliable delivery, and treating every customer's property like our own. Our team handles everything from small garage cleanouts to large construction site waste removal.

4.8 ★
Google Rating
127
Reviews
18
Cities Served
4
Dumpster Sizes
Austin Metro Area

30-mile standard delivery radius · Extended delivery up to 50 miles · Same-day available

  • Austin
  • Round Rock
  • Cedar Park
  • Georgetown
  • Pflugerville
  • Leander
  • Hutto
  • Kyle
  • Buda
  • San Marcos
  • Lakeway
  • Bee Cave
  • Dripping Springs
  • Manor
  • Taylor
  • Bastrop
  • Elgin
  • Liberty Hill

Don't see your city? Call us at (512) 555-0147 — we may still be able to serve your area.

✓ Accepted

  • Household junk & furniture
  • Construction & demolition debris
  • Roofing shingles
  • Yard waste & brush
  • Concrete & asphalt
  • Appliances (no Freon)

✗ Not Accepted

  • Hazardous waste or chemicals
  • Tires & batteries
  • Paint & solvents
  • Medical waste
  • Freon-containing appliances

Phone

(512) 555-0147

Tap to call · Instant quotes

Location

8501 N Lamar Blvd
Suite 200
Austin, TX 78753

Hours

Mon – Fri: 7:00 AM – 6:00 PM
Saturday: 8:00 AM – 4:00 PM
Sunday: Closed

Two zones, one page Above the fold is the action zone: tight hero + dumpster grid. Optimized for the visitor who knows what they want — call or click in under 5 seconds. Below the fold is the trust zone: about, service area, materials, contact, footer. Generous white space, proper section rhythm, breathing room. This is for the careful buyer who scrolls to build confidence. Both zones serve the same goal (call or YeeHaul click) but the top is conversion-dense and the bottom is trust-rich. The page feels like a real business website, not a stripped landing page. Every section still renders from existing data — no hauler configuration.
Static → static = instant Both the hauler site and YeeHaul PDP are ISR-static on the same Vercel edge network, same project. "View on YeeHaul" links go from one edge-cached page to another. No domain change (*.yeehaul.appyeehaul.app = same TLS, same CDN). No hydration on either side (server components). Sub-200ms transitions. The dumpster rows are <a> tags — the whole row is clickable. Hover changes border color. It feels like clicking a tab, not leaving a site. The experience is everything.
What stays killed Trust bar (hero has rating), separate FAQ section (page content answers every question), CTA band mid-page (waypoint replaces it with one line), contact phone hero card (phone is in header + hero + waypoint + footer — always reachable without a dedicated section). No information is lost. Only redundancy is removed.
Screen 2 of 7 products + productRentalTiers

Services & Pricing Overview

Simplified overview of what the hauler offers. Starting prices only — no tier breakdowns, waste stream splits, or overage details. Full product detail, comparison, and booking live on YeeHaul. This page is a brochure, not a catalog.

Hauler site = brochure. YeeHaul = store. This page answers "what sizes do they offer and roughly how much?" It does NOT answer "what's the 14-day C&D rate for a 30-yard with tonnage overage?" That's the YeeHaul PDP's job. The distinction matters for SEO: the hauler site has unique content about THIS hauler (description, service area, accepted materials). YeeHaul has the structured product data that powers comparison shopping and booking. No duplicate structured data.
lone-star-disposal.yeehaul.app/services
Sizes & Starting Prices
We offer 10 to 40 yard roll-off dumpsters. All rentals include delivery, pickup, and disposal.
10 Yard
Small cleanouts & remodels
20 Yard
Kitchens, roofing, mid-size jobs
30 Yard
Large renovations & construction
40 Yard
Demolition & full estate cleanouts
Need exact pricing with tonnage, rental periods, and waste type details?
See full pricing & book on YeeHaul →
What Can You Put In Our Dumpsters?

✓ Accepted

  • Household junk & furniture
  • Construction & demolition debris
  • Roofing shingles
  • Yard waste & brush
  • Concrete & asphalt (10-yard only)
  • Appliances (no Freon)

✗ Not Accepted

  • Hazardous waste or chemicals
  • Tires
  • Batteries
  • Paint & solvents
  • Medical waste
  • Freon-containing appliances
Data source Accepted/prohibited items come from the wasteStreams table (prohibitedItems array). The accepted list is derived from the waste stream names associated with the hauler's active products. Zero hauler configuration needed.
Screen 3 of 7 Killed

Pricing Page — Removed

The dedicated pricing page has been merged into Services & Pricing. Detailed pricing (tiers, waste streams, tonnage, overage) lives exclusively on YeeHaul's product detail pages.

Why this page was killed A full pricing table on the hauler site duplicates the YeeHaul PDP's structured product data. This creates three problems: (1) Duplicate content — Google sees the same pricing on two surfaces under *.yeehaul.app, diluting both. (2) Maintenance burden — pricing changes need to render correctly on two surfaces, not one. (3) Wrong surface for the job — the hauler site is trust and conversion. Pricing comparison and tier selection is shopping, which belongs on YeeHaul where it feeds the checkout flow. The Services & Pricing page now shows "From $X" starting prices with "Details on YeeHaul" links. Price transparency is preserved (the price is visible). The full pricing engine stays on YeeHaul.
Page count: 6 → 5 Home, Services & Pricing (merged), Service Area, About & FAQ, Contact. The site nav drops from 6 items + phone CTA to 5 + phone CTA. Dashboard page toggles update accordingly.
Surface responsibility matrix

Hauler hosted site owns: Brand story, service area, accepted materials, business info, phone CTA, "From $X" starting prices, trust signals (rating, reviews). Unique content per hauler.

YeeHaul directory/PDP owns: Full pricing tables, waste stream breakdowns, tier selection, tonnage details, overage rates, availability calendar, comparison shopping, checkout, structured data (Product/Offer JSON-LD). Transactional content.

No overlap: The hauler site never emits Product/Offer schema. YeeHaul never emits the hauler's business description. The two surfaces link to each other but don't duplicate each other's SEO-critical content.
Screen 4 of 7 haulerServiceCities + geoEntities

Service Area Page

Shows the hauler's full service area. City list auto-generated from haulerServiceCities. Each city name links to the hauler's listing on the YeeHaul directory for that city (cross-pollination).

SEO value Every city in the service area becomes a keyword on the hauler's site. "Dumpster rental in Round Rock" from Google lands on this page, which has the phone CTA and "Book Online" links. This page does double duty: answers the "do you serve my area?" question AND captures long-tail geo search traffic.
lone-star-disposal.yeehaul.app/service-area
Austin Metro Service Area
We deliver to all cities within 30 miles of Austin. Extended delivery available up to 50 miles for an additional fee.
🚚
30 mi
Standard Radius
📈
50 mi
Extended (+ fee)
Same Day
When Available
💰
$5/mi
Extended Surcharge

Cities We Serve

  • Austin
  • Round Rock
  • Cedar Park
  • Georgetown
  • Pflugerville
  • Leander
  • Hutto
  • Kyle
  • Buda
  • San Marcos
  • Lakeway
  • Bee Cave
  • Dripping Springs
  • Manor
  • Taylor
  • Bastrop
  • Elgin
  • Liberty Hill

Don't see your city? Call us at (512) 555-0147 — we may still be able to serve you.

V1 scope: No map No Mapbox/Google Maps integration exists in the codebase. City list + delivery stats cards are the V1 surface. Map is V2 — requires adding a mapping SDK dependency. The city list from haulerServiceCities JOIN geoEntities (name, entityType='city') is the data source. Radius stats from haulers.serviceRadiusMiles and haulers.extendedRadiusMiles. Surcharge from haulerSettings.perMileRate. Lead time from products.leadTimeDays.
Screen 5 of 7 AI-Generated Content

About Page

Business story and trust signals. The description is AI-generated at subscription time from Google Places data + product catalog. Hauler can edit in dashboard. Google rating and review count are pulled from haulers table.

Auto-generation prompt concept "Write a 2-3 sentence business description for {hauler.name}, a dumpster rental company in {city}, {state}. They have a {rating}-star Google rating with {reviewCount} reviews. They offer {containerSizes} dumpsters for {wasteStreamNames}. Tone: professional, local, trustworthy."
lone-star-disposal.yeehaul.app/about
Locally Owned. Austin Proud.

Lone Star Disposal has been serving the greater Austin metro area since 2014. What started as a single-truck operation has grown into one of Central Texas's most trusted dumpster rental services.

We believe in straightforward pricing, reliable delivery, and treating every customer's property like our own. Our team handles everything from small garage cleanouts to large construction site waste removal.

With a 4.8-star rating across 127 Google reviews, our reputation speaks for itself. We're not the biggest — but we're the best at what we do.

10+
Years in Business
4.8 ★
Google Rating
127
Google Reviews
18
Cities Served
V1 scope: No photo No file upload infrastructure exists (no Vercel Blob, UploadThing, or S3). Photo gallery and hero image upload deferred to V1.5. The about page works text-first with stats derived from DB: rating and reviewCount from haulers, cities count from haulerServiceCities. "Years in business" is template copy in the AI-generated description — not a DB field.
Frequently Asked Questions
How long can I keep the dumpster?
Standard rental periods are 7 or 14 days. If you need more time, no problem — additional days are $15/day. Just call us or book the extended rental online.
What size dumpster do I need?
For a single-room cleanout or small bathroom remodel, a 10-yard is usually plenty. Kitchen or multi-room renovations typically need a 20-yard. Large construction or whole-house projects usually call for a 30 or 40-yard. Not sure? Call us and we'll help you choose.
What can't I put in the dumpster?
Hazardous materials, chemicals, paint, tires, batteries, and Freon-containing appliances are prohibited. Check our Services page for a full list of accepted and prohibited materials.
Do you offer same-day delivery?
Yes! Same-day delivery is available within our standard service area (25 miles) when we have inventory. Call us before noon for the best availability.
FAQ data source (verified) V1 FAQs are template questions with answers derived from existing data only: (1) "How long?" → rental periods from productRentalTiers.daysIncluded, overage from dayOverageRate. (2) "What size?" → container sizes from containers.size via products. (3) "What can't I put in?" → wasteStreams.prohibitedItems array. (4) "Same-day?" → products.leadTimeDays (if any product has leadTimeDays=0). Permit question removed — permit recon data covers only 142/391 TX cities, not reliable enough for auto-answers. Hauler can override any answer via dashboard (V2 customization).
Screen 6 of 7 AI Phone Agent Hero

Contact Page

The AI phone number is the undisputed hero of this page. Everything drives to the call. Business hours, address, and a "Book Online" escape hatch are secondary.

Key decision No contact form in V1. The AI phone agent IS the contact form. It captures name, email, project details, and desired dates during the conversation — more effectively than any form because it's conversational and can ask follow-up questions. A form would split the funnel and undercut the agent's value. V2 can add a form for after-hours or text-preference users.
lone-star-disposal.yeehaul.app/contact
Ready to Rent a Dumpster?
Call us now and we'll get you set up in minutes. Our team is available Monday through Saturday to answer your questions and schedule delivery.
📞
(512) 555-0147
Tap to call · Available now
⚡ Instant quotes over the phone
Prefer to book online?
Choose your dumpster size and schedule delivery in under 2 minutes.
Book Online →
📍

Our Location

8501 N Lamar Blvd, Suite 200
Austin, TX 78753

🕓

Business Hours

Monday - Friday: 7:00 AM - 6:00 PM
Saturday: 8:00 AM - 4:00 PM
Sunday: Closed

📧

Email

info@lonestardisposal.com

Reviews

★★★★★ 4.8 / 5

Based on 127 Google reviews

Screen 7 of 7 Mobile-First CTA

Mobile Experience

Most hauler website traffic is mobile (customers searching from job sites, driveways, etc.). The mobile layout prioritizes the phone CTA with a persistent sticky bar. One-thumb reachable.

Context A contractor on a job site Googles "dumpster rental Austin," finds this hauler's GBP listing, taps "Website." They land on the mobile version. They need to call or book in under 10 seconds. The sticky dual-CTA bar ensures the phone and book actions are ALWAYS one tap away regardless of scroll position.
Home — Scrolled State
9:41 ●●●● 🔋
★ 4.8 · 127 reviews

Austin's Most Trusted Dumpster Rental

Same-day delivery. Transparent pricing. No hidden fees.

☎ Call (512) 555-0147

Our Dumpsters

10 Yard

7 days · 2 tons incl.
$325

20 Yard

7 days · 3 tons incl.
$425

30 Yard

7 days · 4 tons incl.
$525

40 Yard

7 days · 5 tons incl.
$675
Contact Page
9:41 ●●●● 🔋
Contact Us
Ready to get started?
📞
(512) 555-0147
Tap to call · Available now
📍
Location
8501 N Lamar Blvd, Austin, TX
🕓
Hours
Mon-Fri 7am-6pm · Sat 8am-4pm
Rating
★★★★★ 4.8 (127 reviews)
Dashboard admin.yeehaul.app

"Your Website" — Dashboard Module

The hauler's view of their hosted website settings. Part of the admin dashboard (#189 onboarding redesign). Minimal controls — the site auto-populates. This module is for optional customization, not configuration.

Zero-config principle The website goes live the moment the hauler subscribes to the $39/mo plan. This dashboard module shows them a preview and lets them optionally customize it. Default state: everything on, everything auto-populated. The hauler should feel delighted, not overwhelmed.

Your Website

● Live

Lone Star Disposal

lone-star-disposal.yeehaul.app

Last updated: Auto-synced from your profile View live site →
Site Address

lone-star-disposal.yeehaul.app

Your customers can find you at this address. Share it on business cards, truck wraps, and your Google Business Profile.

Copy link
Branding

Brand Color

Used for buttons, links, and accents across your site

Logo V1.5

Currently shows styled initials. Upload coming soon.

LS
Using initials

Hero Image V1.5

Currently shows branded gradient with your business name. Upload coming soon.

Using gradient
Content

Business Description

Appears on your About page. Auto-generated — edit to personalize.

Lone Star Disposal has been serving the greater Austin metro area since 2014. What started as a single-truck operation has grown into one of Central Texas's most trusted dumpster rental services. We believe in straightforward pricing, reliable delivery, and treating every customer's property like our own.
No page toggles Single-page site. All sections (hero, dumpster sizes, materials, service area, about, FAQ, contact) render from data that already exists. Nothing to toggle — if the hauler has products, sizes show. If they have service cities, the area shows. If they have a description, about shows. The dashboard is preview + branding + description. That's it.
Custom Domain V1.5

Use your own domain

Point your existing domain to your YeeHaul-powered site. Your YeeHaul subdomain will continue to work as well.

✓ Connected
DNS Setup
Type Name Value
CNAME www cname.vercel-dns.com
A @ 76.76.21.21
Add these records at your domain registrar (GoDaddy, Namecheap, Cloudflare, etc.). DNS changes can take up to 48 hours to propagate.
Custom domain implementation (V1.5) Vercel Domains API: POST /v10/projects/{projectId}/domains to add, GET to verify DNS. SSL provisioned automatically by Vercel (Let's Encrypt). Schema addition: customDomain text nullable on haulers table. proxy.ts extension: if hostname matches any hauler's customDomain, rewrite to /sites/[slug] (same as subdomain path). Hauler adds CNAME for www, A record for apex. Verification endpoint polls Vercel API and updates status badge. Plan limits: Hobby=20, Pro=50 domains per project — sufficient until 50+ haulers with custom domains.
💡
Maximize your visibility
Update your Google Business Profile website link to lone-star-disposal.yeehaul.app (or your custom domain) to drive Google search traffic directly to your new site. Customers searching for you by name will see your full services and pricing.
Learn how →
Design Decisions Grounded in Codebase Audit

Product & Technical Decisions

Every decision verified against the actual codebase: proxy.ts routing, haulers schema, Stripe infrastructure, and existing data model. Aspirational claims from the initial wireframe have been corrected.

Product Decisions

Decision: Not a website builder Pre-built, data-driven template. Hauler customization is limited to: brand color (V1), description text (V1), page toggles (V1). Logo and hero image uploads are V1.5 — zero file upload infrastructure exists today (no Vercel Blob, UploadThing, or S3). V1 uses styled initials for logo and CSS gradient for hero. This is the Shopify model (opinionated template), not Wix (blank canvas).
Decision: Phone CTA is primary, not "Book Online" AI phone agent is the differentiator. Phone number from provisioned_numbers table (already provisioned per hauler via Twilio, ElevenLabs agent ID: agent_8801kmpryry1eyjsd64ppxstvsg4). Appears in: header, hero, mobile sticky bar, contact hero, footer. "Book Online" deep-links to YeeHaul PDP. No checkout duplication on hosted site.
Decision: No e-commerce on the hosted site "Book Online" links to yeehaul.app/dumpster-rental/{city}/{hauler-slug}/{product-slug}. Existing checkout infrastructure at /api/stripe/checkout already handles direct charges with 10% platform commission (PLATFORM_COMMISSION_RATE = 0.1 in lib/stripe.ts). Don't duplicate this.
Risk: Subdomain routing requires Vercel wildcard domain validation proxy.ts already does subdomain detection via getSubdomain(host) (line 12-22). Currently only checks ADMIN_SUBDOMAINS = new Set(["admin"]). Extending this for hauler subdomains is ~50 lines of middleware. BUT: Vercel Hobby plan wildcard domain support (*.yeehaul.app) is unconfirmed. Needs a 30-minute spike: add wildcard to Vercel project domains, test with a CNAME. If Hobby doesn't support it, options: upgrade to Vercel Pro ($20/mo) or fall back to path-based routing (yeehaul.app/s/{slug}). This is the #1 blocker. Spike first.
Risk: DB lookup in middleware (every request) Every request to a hauler subdomain hits the database to resolve subdomain → hauler. The haulers table will have a unique index on subdomain so the query is fast, but it runs on every request (including static assets). Mitigation: edge-compatible cache with 60-second TTL. At current scale (thousands of haulers, not millions), this is fine. Monitor when hauler count exceeds 1,000.
Decision: "Powered by YeeHaul" footer badge only Hauler's brand owns the header. YeeHaul is subtle in footer. "Strategic partner" positioning — we empower, we don't overshadow.
Decision: AI description generation is fire-and-forget Triggered async from /api/stripe/webhooks/subscriptions when customer.subscription.updated sets tier to "pro". Must NOT block the webhook response (Stripe expects <5s). Fire-and-forget with retry. Template fallback on failure: "{name} provides dumpster rental services in {city}, {state}. Serving the area with {sizes} roll-off dumpsters."

Schema: Additions to haulers Table

Current haulers table (packages/db/src/schema/haulers.ts) Already has: name, slug (unique), phone, website, formattedAddress, addressComponents (JSONB), latitude/longitude, googlePlaceId, rating (decimal 2,1), reviewCount (int), hoursOfOperation (JSONB), types (text[]), tags (text[]), socialProfiles (JSONB), subscriptionTier (text, default "unclaimed"), inDirectory (boolean), serviceRadiusMiles, extendedRadiusMiles, homeGeoEntityId, stripeConnectedAccountId, stripeAccountStatus, stripePayoutsEnabled, stripeChargesEnabled, personId, claimedAt, strikeCount, onlineBookingDisabled.
Field Type Auto-populated? V1? Notes
description text, nullable Yes (AI async) V1 Template fallback on AI failure
brandColorPrimary text, nullable Yes (#1e40af) V1 Hex string, dashboard color picker
subdomain text, unique, nullable Yes (from slug) V1 V1: subdomain = slug. Slug format: name-city-state
websiteEnabled boolean, default false Yes (true on sub) V1 Set true by subscription webhook
seoTitle text, nullable Yes (template) V1 "{name} - Dumpster Rental in {city}"
seoDescription text, nullable Yes (from desc) V1 First 155 chars of description + services
logoUrl text, nullable No V1.5 Requires Vercel Blob integration. Fallback: initials.
heroImageUrl text, nullable No V1.5 Requires Vercel Blob integration. Fallback: gradient.

Subscription Infrastructure: Current State

Component Status Location
Stripe SDK (v20.4.1) Built lib/stripe.ts
Connected account creation (V2 API) Built lib/actions/stripe-connect.ts
Subscription webhook handler Built api/stripe/webhooks/subscriptions
subscriptionTier persistence Built Webhook sets "pro" / "paused" / "canceling" / "unclaimed"
createSubscriptionCheckout server action Built lib/actions/stripe-subscription.ts
createBillingPortalSession server action Built lib/actions/stripe-subscription.ts
POST /api/stripe/subscription route Missing UI calls it but route does not exist. ~20 lines.
POST /api/stripe/billing-portal route Missing UI calls it but route does not exist. ~20 lines.
Subscription page copy Wrong price Shows $49/mo, should be $39/mo. STRIPE_SUBSCRIPTION_PRICE_ID env var.
Website activation in webhook Not built Add to customer.subscription.updated handler
File upload (Vercel Blob) Not built Zero upload infra exists. Deferred to V1.5.

Activation Pipeline: What Fires on Subscribe

Stripe webhook: customer.subscription.updated (tier → "pro")
   DB sync: haulers.subscriptionTier = "pro" // already built
   NEW: haulers.websiteEnabled = true
   NEW: haulers.subdomain = hauler.slug
   NEW: haulers.seoTitle = template("{name} - Dumpster Rental in {city}")
   NEW: haulers.brandColorPrimary = "#1e40af"
   ASYNC: generateDescription(haulerId) // fire-and-forget, template fallback

Site is live at: {slug}.yeehaul.app // 0 seconds of hauler config

Routing Architecture (from proxy.ts audit)

Current proxy.ts (line 10-22):
  ADMIN_SUBDOMAINS = new Set(["admin"])
  getSubdomain(host): admin.yeehaul.app → "admin", yeehaul.app → null

Required change:
   If subdomain is NOT "admin" AND NOT null:
     Cached DB lookup: haulers WHERE subdomain = {sub} AND websiteEnabled = true
     If found: NextResponse.rewrite(new URL("/sites/{slug}" + pathname, req.url))
     If not found: NextResponse.json({ error: "Not found" }, { status: 404 })

Route group:
  apps/web/app/(sites)/sites/[slug]/layout.tsx // loads hauler branding
  apps/web/app/(sites)/sites/[slug]/page.tsx // home
  apps/web/app/(sites)/sites/[slug]/services/page.tsx
  apps/web/app/(sites)/sites/[slug]/pricing/page.tsx
  apps/web/app/(sites)/sites/[slug]/service-area/page.tsx
  apps/web/app/(sites)/sites/[slug]/about/page.tsx
  apps/web/app/(sites)/sites/[slug]/contact/page.tsx

Data Flow: What Populates Each Page

Page Primary Tables (verified) Hauler Input
Home haulers (name, description, rating, reviewCount), products JOIN containers JOIN productRentalTiers (top 3 by size), provisioned_numbers (phoneNumber) None
Services products JOIN containers (name, size, dimensions JSONB) JOIN wasteStreams (name, prohibitedItems), haulerInventory (displayName override) None
Pricing products JOIN productRentalTiers (daysIncluded, basePrice, tonnageIncluded, tonnageOverageRate, dayOverageRate) JOIN containers, haulerSettings (perMileRate, flatFee) None
Service Area haulerServiceCities JOIN geoEntities (name, entityType='city'), haulers (serviceRadiusMiles, extendedRadiusMiles), haulerSettings (perMileRate), products (leadTimeDays) None
About haulers (description, rating, reviewCount), COUNT(haulerServiceCities) Optional desc edit
FAQ productRentalTiers (daysIncluded, dayOverageRate), containers (size), wasteStreams (prohibitedItems), products (leadTimeDays) None (template)
Contact haulers (formattedAddress, hoursOfOperation JSONB, rating, reviewCount), provisioned_numbers (phoneNumber) None

Scope: V1 / V1.5 / V2 / Never

Feature V1 V1.5 V2 Blocker
Subdomain ({slug}.yeehaul.app) Vercel wildcard spike
6 template pages, mobile responsive None
Auto-population from existing data None — queries exist
AI-generated description None — async from webhook
Brand color picker None — single text field
Dashboard "Your Website" module Depends on #189 dashboard
Missing Stripe API routes (2 routes) None — 15 min fix
Logo upload V1.5 Vercel Blob integration needed
Hero image upload V1.5 Vercel Blob integration needed
Custom domains (www.company.com) V2 Vercel Domains API + hauler CNAME + SSL
Photo gallery V2 Vercel Blob + hauler_media table
Contact form (email leads) V2 AI phone agent is V1 contact surface
Service area map V2 No Mapbox/Google Maps SDK in codebase
Per-page analytics V2 Depends on analytics #184
Multiple templates V2 One template for V1, well-designed
Blog / content pages Never (no demand)
Embedded checkout Never (deep-link to PDP)

Dependency Chain

1. Vercel wildcard spike — 30 min, blocks everything
2. Schema additions (8 columns on haulers) — no dependency
3. Missing Stripe API routes (2 thin wrappers) — no dependency
4. proxy.ts subdomain routing — depends on #1 + #2
5. Website activation in webhook — depends on #2
6. Route group + 6 template pages — depends on #2 + #4
7. Dashboard "Your Website" module — depends on #2 + onboarding #189

Critical path: #1 → #2 → #4 → #6. Schema, routing, pages.

Activation Ladder Integration

Stage subscriptionTier value Directory Hosted Website AI Phone
0 — Unclaimed "unclaimed" Basic listing None None
1 — Claimed "unclaimed" Editable None None
2 — Products "unclaimed" + Quote forms None None
3 — Subscriber "pro" + Book Online Live, auto-populated Provisioned #
Paused "paused" Listing stays Grace period? Grace period?
Cancelled "unclaimed" Reverts to free Disabled Number released
Open question: Pause/cancel grace period When a hauler pauses or cancels subscription, what happens to their hosted site? Options: (1) Immediate disable — site returns 404. (2) 30-day grace — site stays live, shows "This business is updating their services" after grace period. (3) Downgrade to static page with phone number only. The webhook already handles "paused" and "canceling" states. Decision needed before implementation.
Conversion paths unchanged Offline: GBP/card/truck wrap → hosted site → AI phone (provisioned_numbers.phoneNumber via /api/voice-agent/inbound) → lead capture. Online: hosted site → "Book Online" → YeeHaul PDP → /api/stripe/checkout (10% commission). Both paths exist in infrastructure today.