Custom Review & Rating Module for 1C-Bitrix
We often encounter clients trying to collect reviews using standard components like bitrix:catalog.element.vote and bitrix:forum. The result is poor: an unmoderated forum, ratings without purchase verification, and no structured data for Schema.org. A proper review module is a different story: verified reviews, multi-criteria rating, moderation, seller responses, and aggregated star microdata. Our team, with over 10 years of experience in 1C-Bitrix development and 40+ successful projects, offers a custom module that covers all these gaps.
Why Standard Solutions Don't Cut It
Bitrix has a bitrix:catalog.element.vote component for voting and bitrix:forum linked to elements — these are the building blocks typically used for reviews. They lack built-in verification of paid orders, no moderation, no multi-criteria ratings. Microdata isn't generated, robbing you of the SEO benefit of star snippets. Our module addresses all these shortcomings.
How Purchase Verification Works
The most valuable part of a review is the "verified purchaser" badge. We check against b_sale_order:
public function isVerifiedPurchase(int $userId, int $productId): bool {
$order = \Bitrix\Sale\Internals\BasketTable::getList([
'select' => ['ORDER_ID'],
'filter' => [
'=PRODUCT_ID' => $productId,
'=ORDER.USER_ID' => $userId,
'=ORDER.PAYED' => 'Y',
'=ORDER.CANCELED' => 'N',
],
'limit' => 1,
])->fetch();
return (bool)$order;
}When creating a review, order_id can be explicitly passed — then verification is unambiguous. Without order_id, we check any paid order containing that product.
Moderation and Spam Protection
All reviews are created with status pending and enter a moderation queue. Two modes are possible:
- Manual moderation — a moderator approves/rejects each review.
- Auto-approval — reviews from verified purchasers are published automatically; others go to the queue.
Spam filtering uses simple heuristics: links in the body, excessive capital letters, duplicate text, stop words. Suspicious reviews get status spam.
class SpamDetector {
public function check(string $text): SpamResult {
if (preg_match('/https?:\/\//i', $text)) {
return SpamResult::spam('Links are forbidden');
}
if (similar_text($text, $this->getLastReview($text)) > 80) {
return SpamResult::spam('Duplicate');
}
foreach ($this->stopWords as $word) {
if (mb_stripos($text, $word) !== false) {
return SpamResult::suspicious();
}
}
return SpamResult::clean();
}
} Multi-Criteria Rating
Products can have multiple rating criteria (e.g., "Quality", "Matches Description", "Delivery Speed"). The overall rating is the average of all criteria:
SELECT entity_id, AVG(rr.value) AS avg_rating, COUNT(DISTINCT r.id) AS review_count
FROM b_vendor_review r
JOIN b_vendor_review_rating rr ON rr.review_id = r.id
WHERE r.entity_type = 'product' AND r.status = 'approved'
GROUP BY entity_id;Aggregated data is cached with tag review_entity_{entity_id} and invalidated when a new review is approved.
Schema.org Microdata
For SEO impact, aggregated ratings must appear in microdata. As per Wikipedia: Schema.org, use AggregateRating for products:
<div itemscope itemtype="https://schema.org/Product">
<span itemprop="name">Product Name</span>
<div itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
<span itemprop="ratingValue">4.7</span>
<span itemprop="reviewCount">143</span>
</div>
</div>The vendor:reviews.aggregate component generates this block from cached data. Sites with microdata see up to 5x more clicks on star snippets — proven in practice. You get stars in search results.
Usefulness Voting
Users can mark a review as "helpful" or "unhelpful". Protection against manipulation:
- One vote per IP per day.
- Authorized users: one vote per review forever.
- Usefulness rating influences the display order of reviews.
Development Process
- Analysis and data model design (ORM tables).
- Module development: infoblocks, criteria, verification.
- Moderation, spam filter, voting.
- Integration with microdata and site components.
- Testing and deployment.
Comparison: Standard vs Our Module
| Feature | Standard Forum | Our Module |
|---|---|---|
| Purchase verification | No | By paid order |
| Moderation | No | Manual / auto-approval |
| Multi-criteria rating | No | Yes (any criteria) |
| Schema.org microdata | No | AggregateRating, Product |
| Spam filter | No | Heuristics, stop words |
| Seller responses | Via forum | Built-in |
Timeline
| Stage | Duration |
|---|---|
| ORM tables, review model | 1 day |
| Purchase verification, sale integration | 1 day |
| Moderation, spam filter | 2 days |
| Multi-criteria rating, aggregation | 1 day |
| Schema.org microdata | 0.5 day |
| Usefulness voting | 0.5 day |
| Seller responses, notifications | 1 day |
| Site components | 2 days |
| Admin interface + moderation queue | 1 day |
| Testing | 1 day |
Total: 11 business days. Importing reviews from Yandex.Market or other platforms adds 1–2 days.
What's Included
- Review module with ORM tables, components, and admin interface.
- Purchase verification, moderation, spam filter setup.
- Multi-criteria rating and Schema.org microdata.
- Usefulness voting and seller responses.
- Documentation and staff training.
- Post-launch support.
Typical Mistakes When Developing a Review Module
- Using the standard forum without modifications — no moderation, spam.
- Ignoring microdata — lost SEO benefit.
- No caching of aggregated rating — database load.
- Incorrect verification check — allows fake reviews.
Contact us to discuss your project and get an accurate estimate. We have been working with Bitrix for over 10 years and guarantee a quality result.

