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.
Locally owned since 2014. Roll-off dumpster rentals with transparent pricing and same-day delivery across the greater Austin metro.
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.
30-mile standard delivery radius · Extended delivery up to 50 miles · Same-day available
Don't see your city? Call us at (512) 555-0147 — we may still be able to serve your area.
(512) 555-0147
Tap to call · Instant quotes
8501 N Lamar Blvd
Suite 200
Austin, TX 78753
Mon – Fri: 7:00 AM – 6:00 PM
Saturday: 8:00 AM – 4:00 PM
Sunday: Closed
*.yeehaul.app → yeehaul.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.
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.
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).
Don't see your city? Call us at (512) 555-0147 — we may still be able to serve you.
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.
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.
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.
haulers, cities count from haulerServiceCities. "Years in business" is template copy in the AI-generated description — not a DB field.
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).
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.
8501 N Lamar Blvd, Suite 200
Austin, TX 78753
Monday - Friday: 7:00 AM - 6:00 PM
Saturday: 8:00 AM - 4:00 PM
Sunday: Closed
info@lonestardisposal.com
★★★★★ 4.8 / 5
Based on 127 Google reviews
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.
Same-day delivery. Transparent pricing. No hidden fees.
☎ Call (512) 555-0147The 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.
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.
Used for buttons, links, and accents across your site
Currently shows styled initials. Upload coming soon.
Currently shows branded gradient with your business name. Upload coming soon.
Appears on your About page. Auto-generated — edit to personalize.
Point your existing domain to your YeeHaul-powered site. Your YeeHaul subdomain will continue to work as well.
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.
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.
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.
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.
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.
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.
/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."
haulers Table| 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. |
| 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. |
| 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 |
| 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) |
| 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 |