@extends('marketing._layout') @section('title', __('How it works — :brand', ['brand' => config('branding.site_title', 'Pitchbar')])) @section('description', __('How the Pitchbar sales AI widget turns your website into a 24/7 sales rep — from setup to first conversation in under 5 minutes.')) @php $brand = config('branding.site_title', 'Pitchbar'); $steps = [ [ 'number' => '01', 'title' => __('Drop your URL'), 'duration' => __('< 1 minute'), 'description' => __('Sign up, paste your website URL, and we auto-discover your sitemap and key pages (about, pricing, FAQ, docs). Tick the ones you want indexed and we crawl them in the background — respecting robots.txt, blocking authenticated paths, never touching internal hosts.'), 'sub_points' => [ __('Cloudflare Browser Rendering for JS-heavy sites'), __('Plain HTTP fallback for simple sites'), __('Notion + Google Docs sources via OAuth'), ], ], [ 'number' => '02', 'title' => __('We index your knowledge'), 'duration' => __('~30 seconds for most sites'), 'description' => __('Crawled pages are extracted (Readability), chunked along semantic boundaries (~500 tokens with overlap), embedded with Cloudflare bge-base-en-v1.5 or OpenAI text-embedding-3-small, and upserted into Vectorize or Qdrant — every chunk tagged with workspace + agent so retrieval is strictly tenant-scoped.'), 'sub_points' => [ __('Recursive splitter — paragraphs first, sentences as fallback'), __('Two-stage retrieval: ANN recall + cross-encoder rerank'), __('Strict workspace isolation enforced by global query scope'), ], ], [ 'number' => '03', 'title' => __('Customize the agent'), 'duration' => __('5 minutes of fine-tuning'), 'description' => __("Set persona, tone, language, theme colors, starter prompts, and behavior rules. Add curated answers for pricing or refunds where you can't tolerate paraphrasing. A live preview shows visitors exactly what they'll see."), 'sub_points' => [ __('8 widget languages (en, es, fr, de, pt, ja, ar, zh)'), __('Behavior rules: scroll-depth, idle, exit-intent, intent-keyword'), __('A/B test rule variants and watch conversion deltas'), ], ], [ 'number' => '04', 'title' => __('Publish a snapshot'), 'duration' => __('instant'), 'description' => __('Hit Publish — we snapshot the agent into an immutable version row. The widget runtime always reads from the published version, so editing draft settings never affects live visitors. Roll back to any prior version with one click.'), 'sub_points' => [ __('Versioned per-publish history'), __('Strict allowed-origin enforcement on /v1/widget/init'), __('One-click rollback to any prior snapshot'), ], ], [ 'number' => '05', 'title' => __('Embed one script tag'), 'duration' => __('30 seconds'), 'description' => __('Paste a single <script> tag before </body>. The widget bundle is ≤ 50KB gzipped, async, and renders inside a Shadow DOM so it can\'t conflict with your site\'s CSS. Works on any framework — WordPress, Shopify, Next.js, plain HTML.'), 'sub_points' => [ __('Shadow DOM isolation — no CSS leaks'), __('Persistent visitor sessions across reloads'), __('Optional voice mic (browser SpeechRecognition)'), ], ], [ 'number' => '06', 'title' => __('Visitor asks, AI answers'), 'duration' => __('< 1 second to first token'), 'description' => __('A visitor types a question. Hot path: curated short-circuit check → embed query → vector search → rerank → assemble prompt with sources tagged for prompt-injection defense → stream LLM response back over SSE. No DB writes, no synchronous webhooks — persistence is async after the stream completes.'), 'sub_points' => [ __('Hot-path 1s p95 TTFT contract enforced'), __('Citations [1] [2] linking back to your sources'), __('Confidence threshold per agent — agent says "I don\'t know" before guessing'), ], ], [ 'number' => '07', 'title' => __('Capture leads, jump in live'), 'duration' => __('when intent is high'), 'description' => __('Behavior rules detect when a visitor shows real intent (asks about pricing, asks for a demo, hits the third turn) and offer the inline lead form. Captured leads land in your inbox immediately, fire a Slack alert, and POST to your webhook for HubSpot / Pipedrive / Mailchimp.'), 'sub_points' => [ __('Real-time inbox via Reverb WebSocket'), __('One-click human takeover — visitor sees "Human is here"'), __('Outgoing webhooks with HMAC-signed payloads'), ], ], ]; $latency = [ ['phase' => __('Receive + auth'), 'budget' => __('30 ms')], ['phase' => __('Curated short-circuit'), 'budget' => __('5 ms')], ['phase' => __('Embed query'), 'budget' => __('120 ms')], ['phase' => __('Vector search'), 'budget' => __('80 ms')], ['phase' => __('Rerank'), 'budget' => __('120 ms')], ['phase' => __('Prompt assembly'), 'budget' => __('10 ms')], ['phase' => __('LLM time-to-first-token'), 'budget' => __('500 ms')], ]; @endphp @section('content')
{{ __('How it works') }}

{{ __('From URL to live sales agent in') }} {{ __('under 5 minutes') }}

{{ __(':brand reads your website, builds an AI agent grounded in your own content, and embeds it on any page with one line of HTML. Here\'s exactly what happens.', ['brand' => $brand]) }}

@foreach ($steps as $step)
{{ $step['number'] }}

{{ $step['title'] }}

{{ $step['duration'] }}

{!! $step['description'] !!}

@if (! empty($step['sub_points']))
    @foreach ($step['sub_points'] as $point)
  • {{ $point }}
  • @endforeach
@endif
@endforeach
{{ __('Hot path contract') }}

{{ __('1 second to first token. Every time.') }}

{{ __('The visitor-message → first-token path has a hard p95 budget. No DB writes, no synchronous webhooks, no retries. Persistence and analytics are dispatched async after the stream completes.') }}

{{ __('OpenTelemetry spans wrap every phase so when the budget breaks the span heatmap points right at the offender.') }}

{{ __('p95 latency budget') }}

    @foreach ($latency as $phase)
  • {{ $phase['phase'] }} {{ $phase['budget'] }}
  • @endforeach
  • {{ __('Total to first token') }} {{ __('~ 865 ms') }}

{{ __('Try it on your own site.') }}

{{ __('Free to start. No card required. Live in 5 minutes.') }}

@endsection