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.

