Inspiration

When two local businesses do equally good work, customers tend to call the one with more Google reviews. Most happy customers never leave one, because nobody asked or the link was hard to find. The reviews that do arrive usually go unread, so the owner never learns what people keep complaining about. I wanted one tool that does both: get more reviews, and learn from them.

What it does

Starlly is a self-hosted app for one business. The owner connects an AI provider and an email provider, then designs the message card customers receive: logo, banner, text, a review button, and tags like the customer's first name. When a job is marked complete, Starlly sends the card automatically after a delay, inside the sending hours, and follows up with reminders.

The customer opens a page, picks one to five stars, and sees the same Google review button whatever they pick. Low ratings also get a private feedback form and a call request next to it.

Everything customers say is tagged by theme. The dashboard shows what people praise, what they complain about, and what to fix first, with a link to the reviews behind every number.

How the AI is used

The language model writes template wording, theme summaries and review-reply drafts. It does not produce the numbers. Themes and sentiment come from sentence embeddings and a small classifier running locally, so counts stay the same between runs. A quote check confirms that every review quoted in an insight exists in the data and drops the insight if it doesn't. Rebooking suggestions are a rule-based baseline from service type and time since the last visit.

How I built it

TypeScript throughout: an Express server, a React and Vite front end, SQLite with Drizzle, Transformers.js for the tagger, and Vitest and Playwright for tests. Email goes through provider adapters that share one interface, so adding a provider means adding one file. API keys stay on the server and never reach the browser. The hero animation and the glass star were rendered with a small ray-marching script I wrote in Python.

Challenges

  • Google bans review gating, which means asking only happy customers. The customer page and the template check are built so every customer gets the same link.
  • Google's API returns the rating, the review count and a few reviews, so the owner imports the rest. Starlly does not scrape Google.
  • Starlly can see clicks on the Google link but not whether a review was posted, so the funnel ends at "Clicked Google link".
  • To keep counts stable, I moved the counting away from the language model.

What works and what doesn't

  • Rebooking is a rule-based baseline, because there is no real labeled history to learn from.
  • One business per install.
  • Messaging law is not covered. Check the rules in your country before sending at volume.

What's next

Verified adapters for more email providers, a rebooking model trained on real history, and multi-business hosting.

Built With

Share this project:

Updates