Розробка функціоналу соціального доказу (social proof) 1С-Бітрікс
Картка товару без відгуків, рейтингу та реальних фото покупців конвертує гірше. Це не маркетингове припущення — це вимірювано: A/B-тести на e-commerce проєктах стабільно показують зростання конверсії на 15–30% при додаванні блоків social proof. Завдання розробника: інтегрувати ці елементи в Бітрікс-магазин так, щоб вони не гальмували сторінку і не плодили спам.
Що входить у social proof на Бітрікс
Набір блоків залежить від типу бізнесу, але типовий перелік:
- Рейтинг і відгуки — зірковий рейтинг, текстові відгуки з фото
- Лічильник переглядів/покупок — «Цей товар купили 127 разів»
- Сповіщення про нещодавні покупки — спливаючий popup «Іван із Москви купив 5 хвилин тому»
- Запитання та відповіді — Q&A розділ на картці товару
- Користувацькі фото — UGC-галерея від покупців
- Бейджі — «Вибір покупців», «Хіт продажів», «Новинка»
Рейтинг і відгуки: зберігання та відображення
У Бітрікс є вбудований модуль vote (голосування) та можливості через властивості інфоблока. Для повноцінної системи відгуків зазвичай будується кастомна таблиця:
CREATE TABLE b_product_reviews (
ID SERIAL PRIMARY KEY,
PRODUCT_ID INT NOT NULL,
USER_ID INT,
AUTHOR_NAME VARCHAR(255),
RATING SMALLINT CHECK (RATING BETWEEN 1 AND 5),
TITLE VARCHAR(500),
BODY TEXT,
PROS TEXT,
CONS TEXT,
STATUS VARCHAR(20) DEFAULT 'pending', -- pending|approved|rejected
DATE_CREATE TIMESTAMP DEFAULT NOW(),
HELPFUL_YES INT DEFAULT 0,
HELPFUL_NO INT DEFAULT 0
);
CREATE TABLE b_review_photos (
ID SERIAL PRIMARY KEY,
REVIEW_ID INT NOT NULL REFERENCES b_product_reviews(ID),
FILE_ID INT NOT NULL REFERENCES b_file(ID)
);
Агрегований рейтинг (середня оцінка, кількість відгуків) кешується в окремому полі інфоблока — не обчислюється при кожному запиті сторінки. Оновлюється через обробник при схваленні нового відгуку.
Модерація обов'язкова. Без неї при появі першого конкурентного або спамного відгуку репутація руйнується. У стандартній реалізації: відгук зі статусом pending не відображається, модератор схвалює через кастомний розділ у /bitrix/admin/ або через Бітрікс24.
Лічильники та сповіщення про покупки
Лічильник покупок — кількість замовлень із даним товаром із b_sale_basket. Прямий SQL-запит для кожної картки — це N+1 проблема при лістингу. Рішення: окрема таблиця-кеш, яка оновлюється при кожному оформленні замовлення:
CREATE TABLE b_product_social_counters (
PRODUCT_ID INT PRIMARY KEY,
PURCHASE_COUNT INT DEFAULT 0,
VIEW_COUNT INT DEFAULT 0,
WISHLIST_COUNT INT DEFAULT 0,
LAST_PURCHASED TIMESTAMP
);
Оновлення через обробник події OnSaleOrderSaved:
AddEventHandler('sale', 'OnSaleOrderSaved', function($event) {
$order = $event->getParameter('ENTITY');
foreach ($order->getBasket() as $item) {
$productId = $item->getField('PRODUCT_ID');
$db->query("UPDATE b_product_social_counters SET purchase_count = purchase_count + 1,
last_purchased = NOW() WHERE product_id = $productId");
}
});
Спливаючі сповіщення про покупки — AJAX-запит до контролера, який повертає останні N покупок товару (з назвою міста з b_sale_order_props, без персональних даних). На фронтенді — показ popup із затримкою та обмеженням частоти:
async function showRecentPurchaseNotification(productId) {
const data = await fetch(`/local/api/social-proof/recent/?product=${productId}`).then(r => r.json());
if (data.length === 0) return;
const purchase = data[Math.floor(Math.random() * data.length)];
showNotification(`${purchase.city}: куплено ${purchase.time_ago} тому`);
}
Для сповіщень важлива реальність даних: показувати вигадані покупки не можна. Якщо реальних даних мало (новий товар), блок не відображається.
UGC-галерея покупців
Фото від реальних покупців — найсильніший social proof для fashion, меблів, техніки. Технічно: до форми відгуку додається поле завантаження зображень (через CFile::SaveFile()), завантажені фото проходять модерацію, схвалені виводяться в галереї під основними фото товару.
Ресайз зображень, що завантажуються користувачами, обов'язковий — без нього склад /upload/ за рік заповнюється гігабайтами сміття:
// При збереженні фото відгуку
$resized = CFile::ResizeImageGet($fileId, ['width' => 800, 'height' => 800], BX_RESIZE_IMAGE_PROPORTIONAL);
Schema.org розмітка для відгуків
Відгуки з правильною розміткою виводяться у пошуковій видачі як зірковий рейтинг. Розмітка Product + AggregateRating + Review:
$schema = [
'@context' => 'https://schema.org',
'@type' => 'Product',
'name' => $arResult['NAME'],
'aggregateRating' => [
'@type' => 'AggregateRating',
'ratingValue' => $arResult['RATING'],
'reviewCount' => $arResult['REVIEW_COUNT'],
'bestRating' => 5,
],
'review' => array_map(fn($r) => [
'@type' => 'Review',
'reviewRating' => ['@type' => 'Rating', 'ratingValue' => $r['RATING']],
'author' => ['@type' => 'Person', 'name' => $r['AUTHOR_NAME']],
'reviewBody' => $r['BODY'],
], $reviews),
];
echo '<script type="application/ld+json">' . json_encode($schema, JSON_UNESCAPED_UNICODE) . '</script>';
Бейджі на картках товару
«Хіт продажів», «Вибір покупців», «Тільки тут» — статуси, що обчислюються за даними або проставляються вручну:
-
Хіт продажів— якщоpurchase_countу топ-5% каталогу (обчислюється агентом раз на добу) -
Високий рейтинг— якщо середній рейтинг ≥ 4.5 і кількість відгуків ≥ 10 -
Закінчується— якщо залишок товару ≤ 5 одиниць
Бейджі зберігаються у властивості інфоблока типу «Список» (множинне). Агент оновлює їх за розкладом, не навантажуючи кожен запит сторінки.
Захист від накрутки
Без захисту накручують і рейтинг, і лічильники покупок. Базові заходи:
- Відгук лише від зареєстрованих користувачів, які купили цей товар (перевірка за
b_sale_basket) - Обмеження: один відгук на товар від одного користувача
- Rate limiting на API лічильника переглядів: один інкремент на сесію
- CAPTCHA або приховане поле honeypot на формі відгуку
Терміни
| Блок | Що входить | Термін |
|---|---|---|
| Рейтинг + відгуки | БД, форма, модерація, Schema.org | 2–3 тижні |
| Лічильники + сповіщення | Таблиця-кеш, агенти, popup | 1–2 тижні |
| UGC-галерея | Завантаження, ресайз, модерація, вивід | 1–2 тижні |
| Бейджі | Агент обчислення, вивід у лістингу | 3–5 днів |
Social proof — це не прикраса, а частина конверсійної воронки. Інвестиції в правильну реалізацію окупаються зростанням конверсії картки товару, яке легко вимірюється через A/B-тест.







