Most businesses know they should respond to Google Reviews. Almost none of them do it consistently. Revoply fixes that — AI-generated responses that actually sound like the business wrote them, not like a chatbot.
The Problem Worth Solving
Responding to reviews builds trust and improves local SEO ranking. Google explicitly factors review response rate into local search ranking. Yet most business owners skip it entirely — not because they do not care, but because writing a unique, on-brand response to every review is genuinely time-consuming.
The tools that existed before Revoply were either generic AI wrappers that produced robotic output, or expensive agency services. Neither solved the core problem: responses need to match the business's voice, reference the specific feedback the customer left, and feel human.
Architecture
Revoply is split into two services. The Next.js frontend handles authentication, the dashboard, and the review management UI. The NestJS backend manages the OpenAI integration, Google My Business API polling, and the response queue.
Next.js (frontend)
└── Auth (NextAuth + PostgreSQL sessions)
└── Dashboard UI
└── REST calls → NestJS API
NestJS (backend)
└── Google My Business API polling (cron)
└── OpenAI response generation
└── Response queue (BullMQ)
└── PostgreSQL (reviews, responses, brand profiles)Reviews are polled from Google My Business on a configurable schedule. When new reviews arrive, they are stored and optionally auto-queued for response generation based on the business's settings.
The Hard Part: Brand Voice
Generic AI responses are immediately recognisable. The prompt engineering problem was getting GPT-4 to write in a business's specific voice without fine-tuning a model. The solution was a structured brand profile: tone descriptors, example phrases the business actually uses, topics to avoid, and a sample of previous manual responses.
// Brand profile fed into every generation prompt
interface BrandProfile {
businessName: string;
industry: string;
tone: 'formal' | 'friendly' | 'casual' | 'professional';
keywords: string[]; // phrases to include naturally
avoidPhrases: string[]; // things that break brand voice
exampleResponses: string[]; // few-shot examples
}Combined with the review content itself — star rating, specific complaints or praise, reviewer name — the prompt produces responses that pass the "did a human write this?" test most of the time.
Rate Limiting the OpenAI API
A business with hundreds of reviews queued at setup would hit OpenAI rate limits immediately if processed naively. BullMQ handles the generation queue with a concurrency limit and exponential backoff on failures. Businesses on lower plans get a slower processing rate; higher plans get priority queue slots.
The Monetisation Layer
Stripe powers the subscription tiers. The integration needed to handle three cases cleanly: new subscriptions, plan upgrades mid-cycle (prorated), and cancellations that should allow access until the period ends. Stripe webhooks feed into a NestJS handler that updates the database and invalidates the session cache.
What I Would Do Differently
The Google My Business API has significant limitations that were not obvious until mid-build. Polling is the only viable option for most account types — webhooks exist but require verification steps that not all business accounts can complete. I would plan around the polling constraint from day one rather than designing for webhooks first.
I would also build the brand profile onboarding as a multi-step interview flow from the start, rather than a single settings form. The quality of responses correlates directly with how detailed the brand profile is, and a guided setup produces better profiles.
Status
Revoply is live at revoply.com. It handles real reviews for real businesses. The AI generation cost per response is low enough that margins are healthy at the current pricing tiers.