One link. Customers quote, book, and pay themselves. You show up and cut
Groundcut’s booking page is built around instant satellite quoting, charge-on-book via Stripe Connect, and a customer self-service portal that absorbs the “where are you?” calls. The URL is the funnel — share it on Google Business Profile, Instagram, yard signs, business cards.
Below: eight shipped pieces of the booking pipeline, each tied to a column, route, or settings field.
Eight pieces of the booking pipeline
Each one is a shipped column, route, or settings field. Audit them yourself.
- 01
A branded booking page on your own subdomain
Every tenant gets `{your-name}.groundcut.com/book` the moment they sign up. The page renders with your brand color, your logo, and your services — no Groundcut header or sidebar, no "powered by" trail. Customers see your business; the booking flow happens inside it. The subdomain IS your web presence — most operators don’t have a separate website at all.
tenants.subdomain (unique) + tenants.brand_color + tenants.logo_url; rendered by apps/web/app/book/page.tsx
- 02
Customers draw their lawn on satellite imagery
The customer enters their address, the geocoder snaps to a real location, and Mapbox satellite tiles render their property. They tap to outline their lawn (3+ points required). The area runs through your pricing rules — `price_per_quarter_acre × (mowable_area_sqft / 10,890)` — clamped by your `min_price` floor and `max_price` ceiling. The quote returns in under 200ms with a line-item breakdown.
POST /api/quote; packages/shared/src/pricing.ts; polygon stored as jobs.lawn_polygon (GeoJSON)
- 03
Full charge at booking via Stripe Connect
The customer enters their card in Stripe Elements; the booking endpoint creates a PaymentIntent with `capture_method=automatic` for the full quoted price; the money lands in your connected Stripe account at the next payout cycle. There’s no auth-then-capture, no follow-up invoice, no "we’ll bill you later." You see the booking in `/admin/jobs` with the payment already settled.
POST /api/booking; Stripe Connect PaymentIntent with capture_method=automatic
- 04
Capacity check before the slot picker even renders
The booking flow calls `POST /api/capacity` after the customer has a quote, with the date they want. The endpoint sums `estimated_time_mins` across already-scheduled jobs for that date and compares against your workday budget (sourced from tenant settings). The response returns morning/afternoon availability separately so the slot picker only shows real options. A day that’s already full simply isn’t offered.
POST /api/capacity; sums jobs.estimated_time_mins per date
- 05
Customer self-service portal at /track/[jobId]
After booking, the customer lands on `/track/[jobId]` — a polished status page showing booked / on-the-way / in-progress / complete, with the polygon, the address, the assigned crew (if any), and the line-item quote breakdown. From the same page they can reschedule (`POST /api/track/[jobId]/reschedule`, status-gated to booked/scheduled) or cancel (`POST /api/track/[jobId]/cancel`, email-verified). The "where are you?" calls stop in the first week.
/track/[jobId] renders JobStatusTracker.tsx; reschedule + cancel endpoints under /api/track/[jobId]/
- 06
Share the booking URL anywhere
The branded URL is one link. Put it on your Google Business Profile "Book online" button. Drop it in your Instagram bio. Print it on a yard sign. Forward it in a text. Every channel routes to the same flow — no funnel branching, no different forms, no UTM-tracked detours that drop people off. The URL is the product.
Booking URL: {tenants.subdomain}.groundcut.com/book
- 07
Custom domain when you want your own brand
Pro tier supports a custom domain (`{your-domain}.com` instead of `{your-name}.groundcut.com`). Add the domain in `/admin/settings`, point a CNAME, click verify; the proxy rewrites custom-domain traffic to your subdomain transparently. The booking page now lives on your domain. SSL is automatic via Vercel.
tenants.custom_domain + tenants.custom_domain_verified; proxy logic in apps/web/proxy.ts
- 08
Offline payment when you want it
Not every operator wants to charge-on-book. Set `payment_collection: 'external'` in `/admin/settings` → Payments and add your instructions ("cash or check on completion"). The booking flow skips the Stripe PaymentIntent — the customer books without entering card details, an unpaid invoice is created, and the crew mobile app prompts you to mark the invoice paid when you collect. Same booking page, same drawing flow, no card-on-file lock-in.
tenants.settings.payment_collection enum: stripe | external
The share-anywhere model
Generalist field-service tools treat the booking page as the destination of a funnel — landing page → ad campaign → form → CRM → quote → booking. Each step drops people off. Groundcut treats the booking page as the funnel itself: one URL, one flow, every channel.
Google Business Profile.Put the booking URL on the “Book online” button. Customers searching “lawn care near me” book in two taps — no website visit, no quote-request form, no callback.
Social. Instagram bio link, Facebook page CTA, TikTok bio. Every social channel that supports a single link supports your booking page.
Physical. Yard signs at completed jobs, QR codes on business cards, decals on the truck. Neighbors of a customer who just got their lawn cut scan the code, draw their lawn, and book — while you’re still on their neighbor’s lawn.
Replies to inbound texts.A “what do you charge?” text gets answered with the booking URL. The customer self-quotes; you don’t have to guess at a price on the phone.
Where each piece is configured
/admin/settings— business name, brand color, logo, home base (becomes `home_lat` / `home_lng`), `max_distance_miles`, `payment_collection` (stripe vs external), and Stripe Connect onboarding./admin/services— every service the booking page offers, with `price_per_quarter_acre`, `min_price`, `max_price`, `target_hourly_rate`, and the surcharge fields./admin/zones— service-area bands that gate which addresses can book./admin/settings→ Custom domain (Pro) — add your domain, point a CNAME, click verify./admin/jobs,/admin/recurring— where bookings land. The flow from URL to job row is end-to-end automated.
Online-booking FAQs
What if I don’t have a website?+
Can I take payment offline — cash or check on completion?+
How fast can I be live?+
What happens when a customer books while I’m on a job?+
Can the customer change or cancel after booking?+
What about a custom domain instead of a subdomain?+
Does this work on a phone?+
How do I tell customers about this?+
Get your booking URL live today
14-day free trial. Sign up, run the onboarding wizard, configure your first service, and you’ll have a working booking URL in under an hour.
14-day free trial · No card required · Cancel any time