Skip to main content

Case study · trynowreply.com · Live

nowreply

An AI front desk for appointment-based businesses. Connect your documents, website and calendar; the assistant answers every inquiry in seconds from your own prices and policies, on your website and in your inbox, and books the appointment. Underneath it is starmo's multi-tenant retrieval platform, built for grounded, cited answers.

Product trynowreply.com Built and run by starmo Status Live, multi-tenant
$0.0007–0.003per query 755backend tests Cost is what the conversations page shows for the demo account's traffic: duration, tokens and dollars per query. The tests run in CI against a real pgvector Postgres.

The product demos itself. The chat on the landing page is the production assistant, not a mockup. What a visitor watches it do there, answer from documents, cite them, decline to invent, is what it does on a customer's site and in their inbox.

The problem

Every inquiry is a question about prices, policies or a free slot

A med-spa, a salon, a clinic: the inquiries that arrive on the website and in the inbox are mostly the same few questions. What does this cost, what does the treatment involve, what is the cancellation policy, is there anything on Thursday. Each one is small. Together they are a front desk's day, and at a small business the front desk is often the owner, between clients.

The answers exist. They are in the price list, the policy page and the calendar. What is missing is someone available to give them in the minute the customer is asking, and then to take the booking. A generic chatbot fails here in a specific way: it improvises. For a customer-facing agent that quotes prices and books appointments, an invented policy is worse than no answer.

So the product had to do three things: answer only from the business's own material, say so when that material does not cover the question, and turn the answered question into a booked appointment inside the same conversation.

The approach

Four decisions

Grounded, or it says so

Every answer comes from retrieved documents, with inline citations. When the documents do not cover a question, the assistant says exactly that and offers what they do cover, rather than inventing a policy.

Knowledge that maintains itself

Files, the business's website and Google Drive folders are ingested once and kept current by scheduled re-crawls and sync. Live systems join through OpenAPI, so an endpoint becomes a tool the agent can call mid-answer. Nobody maintains an FAQ.

One agent, every channel

The same agent answers on the website widget and in the email inbox, and books through Google Calendar inside the conversation. Persona and behaviour are per-business configuration, not code.

Every conversation is a trace

Duration, tokens and cost are logged per query, with filters by confidence, channel, outcome and feedback, and a trace inspector for stepping through what the agent did. Tenant isolation is asserted by dedicated test suites, not assumed.

What shipped

The public page, then the workspace

The screens below are the live product: the landing page first, then the workspace of a demo med-spa account.

The nowreply landing page with the live assistant embedded and answering in a chat panel
01 · Landing

The demo is the product. The landing page embeds the production assistant. A visitor asks it something and watches it answer from the demo business's documents, which makes the case better than a description of the feature would.

The knowledge tab showing uploaded files, website sources, and live-data API connections
02 · Knowledge

Three kinds of source. Uploaded files are chunked and embedded; websites are crawled and re-crawled on a schedule; live-data APIs are imported from an OpenAPI spec and become tools the agent can call during a conversation, shared by every agent in the workspace. Google Drive folders sync on their own.

The nowreply workspace answering a pricing question with a retrieval trace and the source document rendered beside the cited answer
03 · Workspace

Answers that show their work. A pricing question in the workspace chat: the grounded answer streams back with inline citations, the retrieval trace is one click away (sources searched, one found, 2.0 seconds), and the source document renders beside the reply. A business can verify any answer its front desk gives.

The assistant answering the documented part of a question with a citation and explicitly declining to invent the undocumented part
04 · Grounding

“I don't know”, on purpose. Asked whether Botox can be combined with a HydraFacial, the assistant answers the documented part with a citation and says plainly that the documents do not state the rest. For an agent that quotes prices and books appointments, refusing to improvise is the product.

The agent configuration studio with appearance and behavior settings next to a live widget preview
05 · Agent studio

Configured, not coded. Display name, greeting, behavioural instructions, generated starter questions, theme and accent colour, with a live preview of the widget as it will render on the business's own site, updating as they type.

The channels tab with website chat and email inbox options and a Google Calendar connection for booking
06 · Channels

Website, inbox, calendar. Add website chat, or connect an email inbox so inquiries by mail get the same grounded answers. Connect Google Calendar once and every agent can check real availability and book the appointment in conversation: the moment an answered question becomes revenue.

The conversations page listing query traces with duration, token count, and per-query dollar cost, with confidence and outcome filters
07 · Traces

An engineering system, reviewed like one. Every exchange is logged with its duration, token count and dollar cost, filterable by confidence, channel, outcome, status and user feedback. The conversations on screen cost between $0.0007 and $0.0028 each.

The platform

A multi-tenant retrieval spine

The retrieval spine has the same shape as the one in DocsAI, built from scratch with no framework, and hardened here for many tenants on one deployment. Every organization's knowledge, agents and conversations are its own; the stages are shared.

CHANNELS Website widget one script tag Email inbox same answers, by mail Voice session, optional RETRIEVAL SPINE · PER TENANT · NO FRAMEWORK Router docs, or a tool? Rewriter for retrieval Expander query variants Hybrid search pgvector + full-text Reranker relevance Retrieval evaluator enough context to answer? If not, the reply says so instead of guessing Answer over SSE inline citations · trace logged Tools from OpenAPI live data, mid-answer Google Calendar availability, booking KNOWLEDGE · PER ORGANIZATION Files chunk, embed Website crawl, re-crawl Google Drive folder sync Postgres, pgvector isolation, tested TRACE Every conversation duration · tokens · cost outcome · feedback READ LOGGED PER QUERY
Figure

Blue is the answer path after retrieval: the hybrid search, the streamed reply, and the tools it may call on the way. The dashed line is the trace every conversation leaves. The two zones in the middle are what a tenant owns; the spine is what they share.

Tenant isolation, proven

Organizations, roles and invitations, with dedicated end-to-end suites asserting that one organization can never read another's data. Isolation is tested, not assumed.

Pluggable verticals

Domain tool packs register typed tool specifications into a shared registry and are activated per deployment by environment variable, so the core stays industry-agnostic. Persona lives in per-organization system prompts and glossaries: tenant data, not code.

Tools from OpenAPI

An importer turns an OpenAPI spec into callable agent tools with citation handling, so a live system becomes knowledge without custom integration code. Tools are workspace-wide and shared by every agent.

Knowledge that maintains itself

Scheduled website re-crawls and Google Drive sync keep each corpus current; documents version through an explicit ingestion pipeline.

Voice-ready

Live voice sessions with transcription logging are built in as an optional mode: the same grounded core, spoken.

Shipping it

The layer most prototypes never reach

Tests. 755 backend tests across 66 files run in CI against a real pgvector Postgres, plus Playwright end-to-end suites for authentication, role-based access, invitations and cross-tenant boundaries.

Migrations. The schema has evolved through 46 migrations without a reset, which is the unglamorous proof of a system in operation rather than one rebuilt for each demo.

Billing and onboarding. Paddle subscriptions, a guided five-step setup (create the agent, teach it, try it in chat, install the script tag, watch the first visitor conversation arrive), usage metering and audit logging: everything between “it works” and “it's a business”.

Deploy. FastAPI and the built React frontend ship as one Docker image to Railway. Uploads go straight to MinIO or S3 through presigned URLs, so files never proxy through the API.

Stack

What it is made of

LayerChoice
PlatformMulti-tenant retrieval platform: FastAPI, Postgres with pgvector, organizations, roles and invitations
RetrievalRouter, rewriter, expander, hybrid pgvector and full-text search, reranker, retrieval evaluator; streamed over Server-Sent Events with inline citations
KnowledgeUploaded files, website crawl with scheduled re-sync, Google Drive sync, tools imported from OpenAPI specs
ChannelsWebsite widget installed with one script tag and per-agent signed keys, email inbox, Google Calendar booking, optional live voice
FrontendReact 19, Vite, Tailwind
BillingPaddle subscriptions, usage metering, audit logging
Tests755 backend across 66 files, in CI against real pgvector; Playwright end-to-end including tenant boundaries
ScaleAbout 72,000 lines, 46 migrations
DeployRailway, one Docker image; MinIO or S3 presigned uploads

Have a workflow like this?

Tell us about it: if it is not a fit, we say so in the first five minutes.