Inspiration
Most local service businesses (like mobile detailers) don’t have a real front desk. It’s usually one owner juggling:
- Calls and texts from customers
- Web form submissions
- Actually doing the work in the field
Missed calls = missed revenue, and even when a form exists, it doesn’t talk back or update the owner’s tools. We wanted an AI “front desk” that:
- Feels like a real person, not a generic chatbot
- Can actually update a lead’s status and revenue
- Knows when to escalate instead of over-promising
- Gives the owner a clean summary instead of raw logs
What it does
Judge Mode home
Landing page built for judges and owners:
- “Start customer flow” → opens the AI chat demo
- “Open owner dashboard” → jumps to the business view
Customer chat → lead → booking
- Customer fills a short form (name, phone, “What do you need done?”).
- We send that context into Claude and generate a personalized first message.
The AI then drives the conversation:
- Confirms ZIP / service area
- Explains pricing ranges
- Offers concrete time slots (e.g., “Saturday 10am or 1pm”)
When the customer says “1pm works”, we:
- Infer
status = BOOKED, service type, estimated revenue - Persist it on the
Leadso the dashboard updates automatically
- Infer
Service-area & pricing guardrails
If the ZIP looks borderline (“outside our main service area”) or the customer is upset about price, the AI:
- Stops short of confirming a job
- Sets
status = ESCALATEvia our action contract or fallback logic
The owner can see exactly why it escalated from the transcript.
Owner dashboard
Summary strip:
- Leads today
- Booked revenue
- Escalations needing attention
Filterable/searchable leads table:
- Status pills (NEW / QUALIFIED / BOOKED / ESCALATE)
- Estimated revenue per lead
- CSV export of the filtered view
Clicking a row opens a drawer with:
- Full message history
- Service details, status, chosen slot, revenue
AI Daily Summary for owners
- Owner clicks “Ask AI for today’s summary”.
Backend sends Claude a structured snapshot:
- Counts by status, total revenue, recent leads, sample messages
Claude replies with a short briefing:
- What happened today
- Patterns (e.g. “lots of demand from 77005 for interior-only jobs”)
- Concrete action items (who to call back, what offers to test)
AI Follow-up Coach for escalations
- For ESCALATE leads, the drawer shows an “AI Follow-up Coach” panel.
Owner clicks “Draft follow-up message”:
- Claude reads the actual conversation and drafts a ready-to-send SMS / email.
- The draft is editable, with Copy SMS and Regenerate buttons.
For non-escalated leads, the panel is visible but disabled, explaining it’s for pricing / location / angry-customer cases — a gentle onboarding for the feature.
How we built it
Stack
- Next.js 15 (App Router) + React + TypeScript
- Tailwind CSS for the UI
- Vercel for hosting
- Anthropic Claude for all AI behavior
AI orchestration
- A single
conductor.tsmodule builds the system prompt, lead context, and user messages. - We use a typed ActionContract object to capture:
statusupdates- chosen time slot
- estimated revenue
- escalation flags and updated lead fields
- A single
Fallback inference
- Sometimes the model forgets to fill the ActionContract.
- We run
inferUpdatedLeadFieldsFromReply()which parses the reply text to infer: - booking confirmations
- revenue estimates
- whether language like “outside our service area” should force
status = ESCALATE.
Next.js 15 compatibility
/demoand/ownerare server components that render<Suspense><DemoPageClient/></Suspense>and<Suspense><OwnerPageClient/></Suspense>, keeping all hooks anduseSearchParamsin client components.
Challenges we ran into
Keeping AI and dashboard in sync
- Early versions: Claude would say “You’re all set for Saturday at 2pm for $150” but forget to set
status: BOOKEDor revenue. - Fix: added the structured ActionContract plus a fallback that infers missing fields from reply text so the UI always reflects reality.
Next.js 15 + useSearchParams
- Our first UI used hooks directly in the app router pages, which broke static generation and Vercel builds.
- Fix: refactored
/demoand/ownerinto thin server components that wrap<DemoPageClient/>and<OwnerPageClient/>in<Suspense>.
Designing good escalation behavior
- It’s easy for an AI to over-promise (“You’re all set!”) even when the ZIP is far away or the customer is angry about price.
- Fix: added a dedicated “Service Area & Escalations” section in the system prompt and a guardrail in our fallback logic so phrases like “outside our main service area” force
status = ESCALATEinstead of booking.
Avoiding repetitive questions
- The model occasionally re-asked for phone numbers we already had.
- Fix: added a Phone Number Handling section in the prompt and made the lead context explicit (
lead.phone). Claude is told to reference it instead of asking again.
Accomplishments that we’re proud of
- Turned a static form into a fully AI-driven intake + booking flow.
- Built a dashboard that stays in sync with the conversation without manual data entry.
- Designed escalation flows where the AI knows when to hand off instead of forcing a sale.
Added two owner-facing AI tools:
- Daily summary of the business
- Follow-up Coach for tricky leads
Got everything working end-to-end on production (with lint + type-safe builds) within the hackathon window.
What we learned
- AI is great at conversations but needs strong structure (contracts + fallbacks) to be reliable for operations.
- Small prompt details (like “don’t re-ask for phone if
lead.phoneexists”) dramatically improve perceived intelligence. - Judging UX matters: a dedicated Judge Mode and keyboard shortcuts make it much easier to demo under time pressure.
What’s next for Agent Jones
Mobile owner app + notifications
- iOS / Android companion app so owners get instant push notifications for:
- New leads
- Escalations
- “No-response” reminders when a lead goes cold
- One-tap actions: call, text, or mark as done.
Google Calendar integration
- Sync booked jobs directly into Google Calendar.
- Prevent double-booking by checking availability before confirming a time slot.
- Send automatic reminders to customers (and optional follow-ups after service).
Multi-business + vertical templates
- Let any local business (plumbers, cleaners, med-spa, etc.) configure their own services, pricing, and service areas without touching code.
Built With
- anthropic
- claude
- html
- javascript
- next.js
- node.js
- react
- rest-api
- tailwind-css
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.