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.

  1. 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

  2. 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)

  3. 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

  4. 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

  5. 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]/

  6. 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

  7. 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

  8. 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?+
You don’t need one. The branded subdomain IS your web presence — `{your-name}.groundcut.com` is a real URL on a real domain with proper SSL, fast load, and a booking flow that works on a phone. Most solo operators we talk to never set up a separate site; they put the Groundcut URL on their Google Business Profile, in their Instagram bio, on their yard signs, and that’s their whole web footprint. When you’re ready for your own domain, the custom-domain option upgrades you to `{your-domain}.com` without changing anything else.
Can I take payment offline — cash or check on completion?+
Yes. In `/admin/settings` → Payments, set payment_collection to "external" and add your instructions ("cash or check on completion"). The booking flow still runs end-to-end — the customer quotes, picks a slot, and confirms — but no card details are taken. An unpaid invoice is created with the job; the crew mobile app prompts you to mark the invoice paid the moment you collect. You lose the paid-at-booking lock-in (no-shows become a thing), but for some markets — rural, older customer base, repeat tradesman relationships — that’s the right trade.
How fast can I be live?+
Most operators are live within an hour of signup. The path is: register → onboarding wizard (5 min: business name, address, brand color, logo) → first service configured (10 min: name, base rate, min price, target hourly rate) → service-area zones (5 min, defaults are sane) → Stripe Connect onboarding (5 min on Stripe’s side, can be skipped if using payment_collection=external) → booking URL shared. The 14-day free trial gives you margin to refine pricing and run a few test bookings before any charges.
What happens when a customer books while I’m on a job?+
Nothing on your end. The customer self-serves through the booking page, pays in full through Stripe Connect, and the booking lands on your job queue for the date they picked. You see it next time you open the crew mobile app or refresh `/admin/jobs`. The capacity check prevents overbooking — if you’re already at your workday-time budget for that date, the slot doesn’t appear and the customer picks a different day. No "I’m booked, sorry" call required.
Can the customer change or cancel after booking?+
Yes, from `/track/[jobId]`. Cancel hits `/api/track/[jobId]/cancel` and is email-verified — the customer enters the email used at booking to confirm. Reschedule hits `/api/track/[jobId]/reschedule` and is status-gated (only works while the job is in `booked` or `scheduled` state — not after the crew has started). Cancel doesn’t auto-refund today; the office triages refund decisions case-by-case from `/admin/jobs/[id]` to avoid auto-refunding a customer who cancels after the crew has already driven out.
What about a custom domain instead of a subdomain?+
Supported on Pro. In `/admin/settings` add your domain (e.g., `mowing.example.com`), then add the CNAME we show you at your DNS provider, then click Verify. The proxy rewrites traffic from your domain to your subdomain transparently — the booking page renders on your URL with proper SSL. The subdomain still works (so links you already shared keep working); both routes resolve to the same tenant.
Does this work on a phone?+
The booking page is mobile-first by design. The drawing tool works with finger taps on Mapbox satellite tiles. The Stripe payment is Apple Pay / Google Pay / card via Stripe Elements (the same Stripe checkout you see everywhere else online). The customer-facing `/track/[jobId]` portal is also mobile-first. About 60–70% of bookings on operators’ pages come from phones — the design treats mobile as the default and desktop as the variant.
How do I tell customers about this?+
The branded URL goes everywhere your business has a presence today: Google Business Profile "Book online" button, Instagram bio, Facebook About page, business card QR code, yard sign, truck door decal, email signature. Most operators see the first booking come in within 48 hours of putting the URL on Google Business. There’s no funnel to design — the URL itself is the funnel.

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