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.







