Automated Review Reply Bot for Marketplaces
A seller on Ozon loses up to 30% of rankings due to a low review response rate. Manually handling 500 reviews per month takes 40 hours of a manager's time. Our bot cuts that to 2 hours and boosts product card ratings. Marketplaces factor in the percentage of replied-to reviews in their ranking algorithms — directly impacting sales. We built a bot that automates three tasks: fetching new reviews, generating replies, and publishing them via API. This allows you to reply to 95% of reviews within 2 hours without human intervention.
Why Automation Is Critical for Marketplace Sellers
Marketplace ranking systems consider not just average rating but also seller activity. A high response rate (over 90%) gives a competitive edge in search results. Our clients report a 20-30% increase in product card positions after implementing the bot. Additionally, automation eliminates human errors: missed deadlines, cookie-cutter responses, and neglect of neutral reviews. According to our data, stores with automated replies receive 40% fewer negative reviews. With over 10 years of experience and 100+ successful projects, we ensure reliable automation.
How the Bot Handles Negative Reviews
The architecture is based on a task queue: a Cron job polls each marketplace's API. If the rating is 4-5, the review is sent to a GPT generator or a template system. If the rating is 1-3, it enters a manual reply queue with a Telegram notification to the manager. This guarantees every negative review receives a personalized response without delay. Below is the logic using an Ozon example:
class OzonReviewApiClient { private string $clientId; private string $apiKey; private string $baseUrl = 'https://api-seller.ozon.ru'; public function getUnprocessedReviews(): array { $response = Http::withHeaders([ 'Client-Id' => $this->clientId, 'Api-Key' => $this->apiKey, 'Content-Type' => 'application/json', ])->post("{$this->baseUrl}/v1/review/list", [ 'processed' => false, 'with_text' => true, 'page' => 1, 'page_size' => 100, ]); return $response->json('result.reviews', []); } public function replyToReview(string $reviewId, string $text): bool { $response = Http::withHeaders([ 'Client-Id' => $this->clientId, 'Api-Key' => $this->apiKey, 'Content-Type' => 'application/json', ])->post("{$this->baseUrl}/v1/review/comment/create", [ 'review_id' => $reviewId, 'text' => $text, ]); return $response->successful(); } } Response Generation: Templates vs GPT
We offer two generation approaches. The first is template-based: for 4-5 star reviews, a random template is selected with personalization (name, product). The second uses GPT (gpt-4o-mini) for maximum uniqueness. You can combine them: templates for simple products, GPT for premium segments. The GPT approach creates unique responses 5 times faster than manual writing.
class TemplateResponseGenerator { private array $positiveTemplates = [ "Спасибо за отзыв, {author}! Рады, что {product_short} вам понравился. Будем рады видеть вас снова!", "{author}, благодарим за оценку! Приятно слышать положительные слова о {product_short}.", "Спасибо, {author}! Ваш отзыв очень важен для нас. Желаем приятного использования {product_short}!", ]; private array $neutralTemplates = [ "Спасибо за отзыв, {author}. Если у вас возникнут вопросы по {product_short} — обращайтесь в нашу поддержку.", ]; public function generate(ReviewDTO $review): string { $templates = $review->rating >= 4 ? $this->positiveTemplates : $this->neutralTemplates; $template = $templates[array_rand($templates)]; return str_replace( ['{author}', '{product_short}'], [$review->author, $this->shortProductName($review->productName)], $template, ); } } GPT-based replies are more natural but require more compute. We use temperature 0.8 and a strict system prompt that forbids discount promises and links.
class GptResponseGenerator { public function generate(ReviewDTO $review): string { $response = $this->openai->chat()->create([ 'model' => 'gpt-4o-mini', 'messages' => [ [ 'role' => 'system', 'content' => implode("\n", [ 'Ты — специалист поддержки интернет-магазина. Пишешь ответ на отзыв покупателя.', 'Требования: 1–3 предложения. Без канцелярита. Называй покупателя по имени если оно есть.', 'Если плюсы — поблагодари. Нейтральный — поблагодари и предложи помощь.', 'Никаких обещаний скидок и конкретных дат.', ]), ], [ 'role' => 'user', 'content' => "Товар: {$review->productName}\nРейтинг: {$review->rating}/5\nАвтор: {$review->author}\nОтзыв: {$review->text}", ], ], 'max_tokens' => 150, 'temperature' => 0.8, ]); return $response->choices[0]->message->content; } } Comparison of Template and GPT Approaches
| Parameter | Template | GPT |
|---|---|---|
| Generation speed | < 0.1 s | ~1-2 s |
| Uniqueness | Medium (limited template set) | High |
| Personalization | Basic (name, product substitution) | Deep (context of the review) |
| Error risk | Low | Possible hallucinations |
Job System and Quality Control
Each review is processed in a queue via Laravel Horizon with three retry attempts. Before publishing, the reply undergoes validation: length (20-1000 characters), absence of links and competitor mentions. If the reply fails validation, an exception is thrown and the review is flagged for manual check.
class ProcessMarketplaceReviewJob implements ShouldQueue { public int $tries = 3; public function handle( TemplateResponseGenerator $templateGen, GptResponseGenerator $gptGen, ReviewPublisher $publisher, ReviewAlertService $alerts, ): void { $review = $this->review; if ($review->rating <= 3) { $alerts->urgentReviewAlert($review); return; } $text = config('reviews.use_gpt') ? $gptGen->generate($review) : $templateGen->generate($review); $success = $publisher->publish($review->platform, $review->externalId, $text); if (!$success) { throw new \RuntimeException("Failed to publish reply to {$review->platform}"); } Review::where('external_id', $review->externalId) ->update([ 'reply_text' => $text, 'reply_published_at' => now(), 'is_processed' => true, ]); } } Performance Metrics
| Metric | Target |
|---|---|
| Percentage of processed reviews | > 95% within 24 hours |
| Share of auto-replies (rating 4-5) | 70-80% of all reviews |
| Average reply time | < 2 hours |
| Publishing errors | < 1% |
What's Included in Our Work
- Development of API clients for Ozon, Wildberries, Yandex.Market (turnkey).
- Configuration of reply generation (templates or GPT).
- Queue system and notifications (Telegram).
- Reply validation and error handling.
- Dashboard with metrics (Laravel Horizon + Google Data Studio).
- Technical documentation and access handover.
Bot Setup Process
- Requirements analysis: identify marketplaces, review volume, preferred generation method.
- API client development: create modules for each marketplace.
- Generator integration: configure templates or GPT to align with business logic.
- Queue setup: Laravel Horizon for background processing.
- Testing: under load up to 1000 reviews per day.
- Deployment: to your server or cloud.
- Monitoring: metrics, alerts, ongoing support.
Timelines
- Ozon API client + template generator: 1 day
- Wildberries + Yandex.Market API: +1 day
- GPT generator + validator: 1 day
- Job system + manual reply queue: 0.5 day
- Telegram notifications + metrics: 0.5 day
Total: 3–4 working days. We guarantee transparent code and post-deployment support. Our team has extensive development experience and over 100 completed projects. Contact us for a consultation and project evaluation. Order development now and start reaping the benefits of automation.
Setup cost starts at $2,000, with monthly subscription from $500 depending on review volume and features.







