Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ What it demonstrates:

1. A missed call is detected
2. CallbackCloser sends the first recovery text
3. The caller completes the short intake flow
3. The caller completes the full intake flow: service, urgency, name plus location, callback time
4. The lead is qualified and summarized
5. Owner delivery previews are generated
6. The dashboard-ready lead card is shown
Expand All @@ -383,18 +383,20 @@ Simulator safety:
- No real SMS is sent and no Twilio calls are made
- Public visitor input stays inside the browser demo and does not create customer-facing records
- Caller numbers are masked in the UI before the owner-alert preview is shown
- The public `/simulator` experience runs entirely in the browser and does not require `SIMULATOR_BUSINESS_ID` or a configured demo business

Legacy internal simulator backend:

- The repo still includes isolated simulator-record models and env flags for internal/admin demo tooling
- Those flags are not required for the current public `/simulator` experience
- The optional env-backed simulator helpers remain separate from the public route and can still be used for internal preview workflows if needed

Creating a dedicated simulator workspace:

- Open `/admin`
- Use **Create Demo Business**
- The action creates or refreshes a dedicated business named `CallbackCloser Demo`
- The success banner shows the business ID to use for `SIMULATOR_BUSINESS_ID`
- The success banner shows the business ID to use for legacy internal simulator workflows if you still need an isolated backend-assisted demo run
- The demo workspace uses a synthetic owner account so it does not replace a real customer workspace tied to a Clerk user

## Production Setup (Vercel)
Expand Down
36 changes: 32 additions & 4 deletions app/simulator/page.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,49 @@
import type { Metadata } from 'next';
import Link from 'next/link';

import { PublicSimulatorExperience } from '@/components/demo/public-simulator-experience';
import { PublicSiteFooter } from '@/components/public-site-footer';
import { PublicSiteNav } from '@/components/public-site-nav';
import { PublicSimulatorExperience } from '@/components/simulator/public-simulator-experience';
import { Badge } from '@/components/ui/badge';
import { buttonVariants } from '@/components/ui/button';
import { PUBLIC_START_FREE_PILOT_PATH } from '@/lib/public-auth-routing';

export const metadata: Metadata = {
title: 'Missed-Call Simulator | CallbackCloser',
description: 'Interactive preview mode for the public CallbackCloser missed-call simulator with a safe, on-page lead recovery demo.',
description: 'Run the self-contained CallbackCloser missed-call simulator and show the full qualification flow from missed call to owner alert preview.',
};

export default function SimulatorPage() {
return (
<div className="min-h-screen bg-background">
<PublicSiteNav />

<main className="container py-12">
<PublicSimulatorExperience />
<main>
<section className="border-b bg-gradient-to-b from-background via-background to-muted/30">
<div className="container space-y-4 py-14">
<Badge variant="outline">Public interactive demo</Badge>
<div className="flex flex-col gap-4 lg:flex-row lg:items-end lg:justify-between">
<div className="max-w-3xl space-y-3">
<h1 className="text-4xl font-semibold tracking-tight sm:text-5xl">Public simulator</h1>
<p className="text-lg text-muted-foreground">
Walk through the exact missed-call qualification flow in one browser tab. No login, no backend setup, and no real customer messaging required.
</p>
</div>
<div className="flex flex-wrap gap-3">
<Link className={buttonVariants()} href={PUBLIC_START_FREE_PILOT_PATH}>
Start Free Pilot
</Link>
<Link className={buttonVariants({ variant: 'outline' })} href="/demo">
View product demo
</Link>
</div>
</div>
</div>
</section>

<section className="container py-12">
<PublicSimulatorExperience />
</section>
</main>

<PublicSiteFooter />
Expand Down
Loading
Loading