Inspiration
Every small business we talked to had the same problem: their customers were talking about them everywhere. Google Reviews, Trustpilot, Reddit threads, Hacker News comments, CSV exports from old survey tools. A restaurant owner might glance at their Google star rating once a week; they never saw the pattern of complaints about wait times buried across 40 reviews, or the one thread on a community forum where a customer explained exactly why they churned. The feedback existed. The understanding didn't. That gap, mountains of unstructured customer voice with no time or tooling to synthesize it, is what we spent the last 90 days building against. We wanted a system that reads everything so a business owner doesn't have to, and lets them just ask, in plain language, "what are people actually complaining about?"
What it Does
Scalo is an AI-native feedback intelligence platform. It pulls in reviews and mentions from multiple sources (Google Reviews, Trustpilot, community discussions like Hacker News and Product Hunt, and raw CSV uploads), normalizes them into a shared schema, and runs them through a Gemini-powered pipeline that generates semantic embeddings for every item. Those embeddings live in Postgres via pgvector, turning the entire feedback corpus into something a language model can search conversationally instead of a spreadsheet a human has to skim. On top sits a RAG chat interface: ask "what are customers saying about our service speed?" and Scalo retrieves the actually relevant reviews and has Gemini synthesize a grounded answer with citations back to the source review, not a hallucinated summary.
The AI-native part goes one step further than the dashboard. We built a Model Context Protocol (MCP) server, so any AI agent, not just our own chat UI, can query an organization's feedback corpus directly as a tool call. A business's own AI assistant, or a third-party agent, can pull "get feedback overview" or "search feedback for theme X" straight from Scalo's data, authenticated per organization. This is the real differentiator: Scalo isn't just a UI for humans, it's becoming infrastructure other AI systems can plug into.
How We Built It
The stack is TypeScript end to end on Next.js, chosen so ingestion, AI processing, and the UI could all live in one deployable unit without a separate Python service. Postgres plus pgvector handles storage and vector search: one database, no extra vector-DB vendor. Drizzle ORM keeps the schema (raw feedback, derived analysis, and retrieval layers kept intentionally separate) type-safe end to end.
For AI, we standardized on Google's Gemini through the Vercel AI SDK: gemini-2.5-flash for chat and title generation, gemini-embedding-001 for embeddings. We picked a single provider deliberately: one API key, one billing relationship, one SDK, rather than mixing an embeddings vendor with a separate chat vendor. That simplified both our auth surface and our margins as a bootstrapped product. Flash's price and latency tradeoff made interactive RAG chat viable without subsidizing every message.
Background work (syncing a connector, waiting on a third-party scrape job, generating embeddings for a batch of new reviews) runs through Inngest, so ingestion never blocks a user-facing request and a slow external API (DataForSEO for reviews, Firecrawl for community content) can't take the app down with it. Auth and multi-tenant organizations run on Better Auth. Billing runs on Dodo Payments, gating dashboard and chat access behind subscription status.
Challenges & Accomplishments
The unglamorous challenges were the real ones. Real business data is messy in ways synthetic test data never warns you about: the same business can have duplicate Google Maps listings with wildly different review counts behind different place IDs. Location-resolution edge cases in the reviews API meant we had to actually debug why one connector returned 20 rich reviews and another returned exactly one. Getting the async orchestration right, a connector "connect" action that kicks off a long-running third-party task, waits for a webhook pingback, then resumes, took real iteration with Inngest's step functions before it was reliable.
What we're proud of: in 90 days we went from zero to a working multi-source ingestion pipeline (5 Google Reviews connectors, 2 Trustpilot, 2 community sources live), 209 real feedback items ingested and embedded, a functioning RAG chat, a full subscription billing loop, and, the piece we didn't originally plan for, a public MCP endpoint that turns the whole product into an AI-agent-addressable service, not just a webapp. And critically: our first real paying customer, converted at $10/month.
What We Learned
"What gets measured gets managed" turned out to be true in an uncomfortable way. The first time we looked hard at our own subscription data, we couldn't tell our real customer apart from test-mode sandbox accounts without querying the database directly. That's now a fixed process, not an afterthought. We also learned that subscription gating has to be enforced at every access point, not just the ones a human clicks through. We found our own API and MCP endpoints weren't checking billing status the same way our dashboard was, a gap we're closing now. The build-measure-learn loop, for us, has mostly been: ship a connector, watch what real review data does to our assumptions, fix the assumption, repeat, and watch whether that translates into someone actually paying $10 for it.
What's Next
Near term: close the billing-enforcement gap across every surface, add usage-based tiers beyond the current flat $10/month plan, and expand connectors (App Store, Play Store, Instagram). Longer term, we're betting on the MCP layer as the durable, repeatable part of the business. A feedback corpus that any AI agent can query is a primitive other products will want to build on top of, not just a dashboard businesses log into once a week. Sustainability comes from subscription revenue on the core product, starting from our first paying customer at $10/month and growing from there. Repeatability comes from the fact that the ingestion, embed, retrieve pattern we built generalizes to any unstructured customer-voice problem, not just reviews.
Built With
- better-auth
- dodo-payments
- drizzle
- firecrawl
- gemini
- gemini-embedding-001
- google-maps
- inngest
- mcp
- next.js
- node.js
- pgvector
- pnpm
- postgresql
- shadcn
- tailwind
- typescript
- zod
Log in or sign up for Devpost to join the conversation.