| Live site | https://vereby.com |
| Admin | https://admin.vereby.com |
| Status | Live, paying customers, real traffic |
| Stack | FastAPI, Supabase, Next.js, Railway |
| Channels | Web, WhatsApp, voice |
| Use cases | Ecommerce, salons, plumbers |
Most "AI support" tools answer questions in a generic voice, against a generic knowledge base. The result is a chatbot that sounds like a chatbot. Vereby is built on a different premise: the AI should know the brand it is working for, the way a good employee does.
That means scraping the brand's site at setup, extracting the FAQs and the product/service detail, generating a per-brand voice from the source material, and answering in that voice across the brand's chosen channels. Web widget, WhatsApp, voice. Same brain, same knowledge, same tone.
Vereby is a multi-brand AI customer support platform. Three live use cases, one brain.
Ecommerce. Shopify-backed. Real-time order, product, and inventory lookups. The widget pulls order tracking, ETA, and shipping info live. Returns and policy handling. WhatsApp, web, and voice on the same brain.
Salons. Calendar-backed. Books cuts, colours, and treatments. Sends reminders, reschedules without back-and-forth. Live availability across stylists. WhatsApp confirmations.
Trades. Calendar-backed emergency dispatch. Takes the call, triages emergencies, books the job, routes the urgent ones to whoever is on. WhatsApp first, voice fallback, web form last.
Three services, one Supabase project, one AI brain. Each brand configures its own knowledge, voice, channels, and integrations.
Customer Backend (FastAPI, :8000) <-> Supabase
|
| serves built admin SPA from public/admin/
v
Admin Backend (FastAPI, :8001) <-> Supabase
^
| API calls
|
Admin Frontend (React/Vite, :5174 dev)
Three services. The customer backend is the public entry point and also hosts the built admin SPA. The admin backend is a separate FastAPI service for the dashboard. One Supabase project holds brands, channels, knowledge, conversations, voice profiles.
Per-brand knowledge with auto-scraping. A new brand onboards by pointing Vereby at their website. The scraper pipeline runs httpx for static pages, BeautifulSoup for text extraction, Playwright headless shell for SPAs, sitemap.xml auto-discovery when internal links are absent, and LLM batch extraction (4 pages per batch, 2 LLM calls per batch for FAQs and chunks). 5-strategy JSON parsing falls back gracefully when the model produces broken JSON. Dedup at three levels: 300-char page preview, exact FAQ question match, 100-char chunk-prefix match. CloakBrowser is a drop-in for sites that block stock Playwright.
Per-brand voice auto-generation. When a brand is scraped for the first time, Vereby also generates a voice. It samples the first 3,000 characters of scraped content and asks the LLM to infer tone, greeting, fallback, and goodbye. New brands get a proper voice on day one. No more generic "We are always improving" replies.
MCP server. Vereby exposes itself as a Model Context Protocol server. The AI isn't a black box answering from a static KB. It can call tools: read order, check inventory, look up a booking. So when a customer asks "where is my order #1042?", the model calls order_lookup and gets back "Shipped via Royal Mail. ETA tomorrow by 3pm. Tracking RM123456789." Real data, not vibes.
Multi-channel routing. WhatsApp, web, and voice all hit the same brain. The Test tab in the admin uses ReadableStream to process SSE events in real-time, so the admin preview matches the live widget's streaming speed. Adding a new channel is a config change, not a rewrite.
The case study uses 10 screenshots from the public site at https://vereby.com:
home-viewport.png and home-full.png — landing page with hero, integrations row, three use case cardspricing-viewport.png and pricing-full.png — pricing tiers (Free, Basic, Starter, Growth)shopify-viewport.png and shopify-full.png — ecommerce use case with example Shopify conversation (order tracking, inventory lookup)for-salon-viewport.png and for-salon-full.png — salons & barbers use case with example booking conversationfor-plumber-viewport.png and for-plumber-full.png — plumbers & trades use case with example emergency dispatch conversationFree / Basic / Starter / Growth. 30-day trial. Free exists because the cheapest way to prove the product works is to let a small brand run it for a month.
The scraper has 7 documented pitfalls. MiniMax thinking blocks return JSON in content[].thinking not content[].text, so both have to be parsed. Gunicorn preload breaks Playwright unless the import is lazy. Cloudflare's 100-second timeout means the frontend has to call Railway directly for scrape jobs instead of going through the Cloudflare-fronted public API. SPAs can't be discovered from HTML alone, so sitemap.xml is the fallback. MiniMax occasionally emits broken JSON, so the parser has 5 strategies. None of this is exotic — it's just real engineering when the constraints are real.
Live. Paying customers. Real traffic. The architecture has been stable through multiple Shopify webhook storms, a few voice channel incidents, and one memorable week where a brand's site was rebuilt with Webflow and the scraper discovered the new sitemap within the same hour.
Vereby is one example of the pattern: an AI system that knows the brand it is working for, that scrapes its own knowledge from the source, that answers in the brand's voice across the brand's channels. The same pattern fits any business with a knowledge base, a public face, and customers who ask questions before they buy. If that's a shape you recognise, the conversation to have is: which one of your workflows looks most like this, and which one would you like us to build first.
# Vereby — Case Study Brief
## At a glance
| | |
|---|---|
| Live site | https://vereby.com |
| Admin | https://admin.vereby.com |
| Status | Live, paying customers, real traffic |
| Stack | FastAPI, Supabase, Next.js, Railway |
| Channels | Web, WhatsApp, voice |
| Use cases | Ecommerce, salons, plumbers |
## The opportunity
Most "AI support" tools answer questions in a generic voice, against a generic knowledge base. The result is a chatbot that sounds like a chatbot. Vereby is built on a different premise: the AI should know the brand it is working for, the way a good employee does.
That means scraping the brand's site at setup, extracting the FAQs and the product/service detail, generating a per-brand voice from the source material, and answering in that voice across the brand's chosen channels. Web widget, WhatsApp, voice. Same brain, same knowledge, same tone.
## The product
Vereby is a multi-brand AI customer support platform. Three live use cases, one brain.
**Ecommerce.** Shopify-backed. Real-time order, product, and inventory lookups. The widget pulls order tracking, ETA, and shipping info live. Returns and policy handling. WhatsApp, web, and voice on the same brain.
**Salons.** Calendar-backed. Books cuts, colours, and treatments. Sends reminders, reschedules without back-and-forth. Live availability across stylists. WhatsApp confirmations.
**Trades.** Calendar-backed emergency dispatch. Takes the call, triages emergencies, books the job, routes the urgent ones to whoever is on. WhatsApp first, voice fallback, web form last.
Three services, one Supabase project, one AI brain. Each brand configures its own knowledge, voice, channels, and integrations.
## The architecture
```
Customer Backend (FastAPI, :8000) <-> Supabase
|
| serves built admin SPA from public/admin/
v
Admin Backend (FastAPI, :8001) <-> Supabase
^
| API calls
|
Admin Frontend (React/Vite, :5174 dev)
```
Three services. The customer backend is the public entry point and also hosts the built admin SPA. The admin backend is a separate FastAPI service for the dashboard. One Supabase project holds brands, channels, knowledge, conversations, voice profiles.
## What makes it interesting technically
**Per-brand knowledge with auto-scraping.** A new brand onboards by pointing Vereby at their website. The scraper pipeline runs httpx for static pages, BeautifulSoup for text extraction, Playwright headless shell for SPAs, sitemap.xml auto-discovery when internal links are absent, and LLM batch extraction (4 pages per batch, 2 LLM calls per batch for FAQs and chunks). 5-strategy JSON parsing falls back gracefully when the model produces broken JSON. Dedup at three levels: 300-char page preview, exact FAQ question match, 100-char chunk-prefix match. CloakBrowser is a drop-in for sites that block stock Playwright.
**Per-brand voice auto-generation.** When a brand is scraped for the first time, Vereby also generates a voice. It samples the first 3,000 characters of scraped content and asks the LLM to infer tone, greeting, fallback, and goodbye. New brands get a proper voice on day one. No more generic "We are always improving" replies.
**MCP server.** Vereby exposes itself as a Model Context Protocol server. The AI isn't a black box answering from a static KB. It can call tools: read order, check inventory, look up a booking. So when a customer asks "where is my order #1042?", the model calls `order_lookup` and gets back "Shipped via Royal Mail. ETA tomorrow by 3pm. Tracking RM123456789." Real data, not vibes.
**Multi-channel routing.** WhatsApp, web, and voice all hit the same brain. The Test tab in the admin uses ReadableStream to process SSE events in real-time, so the admin preview matches the live widget's streaming speed. Adding a new channel is a config change, not a rewrite.
## Screenshots
The case study uses 10 screenshots from the public site at https://vereby.com:
- `home-viewport.png` and `home-full.png` — landing page with hero, integrations row, three use case cards
- `pricing-viewport.png` and `pricing-full.png` — pricing tiers (Free, Basic, Starter, Growth)
- `shopify-viewport.png` and `shopify-full.png` — ecommerce use case with example Shopify conversation (order tracking, inventory lookup)
- `for-salon-viewport.png` and `for-salon-full.png` — salons & barbers use case with example booking conversation
- `for-plumber-viewport.png` and `for-plumber-full.png` — plumbers & trades use case with example emergency dispatch conversation
## What stands out visually
- Dark theme with a single warm amber accent (no purple, no gradient orbs)
- "your business" rendered in italic display within the hero serif treatment
- Single-column "Pick your use case" section with three conversation-card tiles (asymmetric: ecommerce / salons / plumbers, each with its own stack chat and example dialogue)
- Integration strip: Shopify, WhatsApp, Klaviyo, Zapier, MCP. The MCP logo is set in italic serif, not the standard "MCP" wordmark. Quietly signals "this is part of the product, not just an integration".
## Pricing posture
Free / Basic / Starter / Growth. 30-day trial. Free exists because the cheapest way to prove the product works is to let a small brand run it for a month.
## What was hard
The scraper has 7 documented pitfalls. MiniMax thinking blocks return JSON in `content[].thinking` not `content[].text`, so both have to be parsed. Gunicorn preload breaks Playwright unless the import is lazy. Cloudflare's 100-second timeout means the frontend has to call Railway directly for scrape jobs instead of going through the Cloudflare-fronted public API. SPAs can't be discovered from HTML alone, so sitemap.xml is the fallback. MiniMax occasionally emits broken JSON, so the parser has 5 strategies. None of this is exotic — it's just real engineering when the constraints are real.
## Status
Live. Paying customers. Real traffic. The architecture has been stable through multiple Shopify webhook storms, a few voice channel incidents, and one memorable week where a brand's site was rebuilt with Webflow and the scraper discovered the new sitemap within the same hour.
## What you'd hire us to build
Vereby is one example of the pattern: an AI system that knows the brand it is working for, that scrapes its own knowledge from the source, that answers in the brand's voice across the brand's channels. The same pattern fits any business with a knowledge base, a public face, and customers who ask questions before they buy. If that's a shape you recognise, the conversation to have is: which one of your workflows looks most like this, and which one would you like us to build first.