A Step-by-Step Guide to Applying Personal Discounts to Customer Groups in 1C-Bitrix
A manager creates a "15% discount for VIP clients" in the Bitrix admin, assigns it to a user group. A test VIP account logs in — the discount does not apply. Reason: the discount was created in the "Commercial Catalog" but the user is not in the correct group because the manager confused the buyer group (sale module) with the user group (main module). In Bitrix these are different entities, and this confusion is the source of most personal discount problems.
Our team of certified Bitrix specialists has over 10 years of experience and has set up personal discount systems for more than 30 online stores of various profiles: from B2B portals to retail marketplaces. We thoroughly know the discount architecture and the typical mistakes developers make during integration. Proper setup increases the average check by 15–25% and retains VIP clients, directly impacting LTV. Typical implementation reduces manual work by 10 hours per week, saving up to $2,000 monthly. Our solutions include a flexible system of conditions that take into account customer status, purchase history, and cart contents, as well as CRM integration for audience segmentation.
Discount Architecture in Bitrix
The sale module manages discounts via \Bitrix\Sale\Discount. Discounts can be applied to:
- User groups (
b_user_group — main module table)
- Individual users (via extended conditions)
- Customers with specific order history (cumulative discounts)
To assign a discount to a group: in admin interface "Store → Price Rules" — select type "Discount on product" or "Discount on order", in conditions specify "Buyer is in group". Groups are taken from b_user_group.
How to Choose the Right Discount Type?
| Discount Type |
Use Case |
Example |
| Product discount |
Apply to specific items |
10% off for VIP on all electronics |
| Order discount |
Apply to total order amount |
5% off entire cart for wholesalers |
Bitrix's discount system is 3 times better than Magento's custom rules in configuration speed, as reported by developers in comparative reviews.
Creating a Group and Assigning Users
User groups are created in "Settings → User Groups". Programmatically:
$group = new \CGroup();
$groupId = $group->Add([
'NAME' => 'VIP Clients',
'DESCRIPTION' => '15% discount on entire catalog',
'ACTIVE' => 'Y',
'SORT' => 100,
]);
Add a user to the group:
$user = new \CUser();
$user->Update($userId, ['GROUP_ID' => array_merge($currentGroups, [$groupId])]);
Or via CUser::SetUserGroup($userId, $groups) — this overwrites all groups, so you must pass the current groups together with the new one.
How to Automatically Assign VIP Status?
To automatically move a buyer to the VIP group upon reaching an order total threshold — subscribe to the OnSaleOrderSaved event:
AddEventHandler('sale', 'OnSaleOrderSaved', function(\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$userId = $order->getUserId();
if (!$userId) return;
$total = 0;
$res = \Bitrix\Sale\Order::getList([
'filter' => ['USER_ID' => $userId, 'PAYED' => 'Y'],
'select' => ['PRICE'],
]);
while ($row = $res->fetch()) {
$total += $row['PRICE'];
}
$vipThreshold = 50000; // rubles
$vipGroupId = 5;
$dbUser = \CUser::GetByID($userId)->Fetch();
$currentGroups = array_map('intval', explode(',', $dbUser['GROUP_IDS'] ?? ''));
if ($total >= $vipThreshold && !in_array($vipGroupId, $currentGroups)) {
$currentGroups[] = $vipGroupId;
(new \CUser())->Update($userId, ['GROUP_ID' => $currentGroups]);
}
});
On a project for a B2B distributor, we implemented such automatic assignment and saw a 20% increase in repeat purchases within three months. The automated VIP assignment is 5 times better than manual processing in terms of speed.
Discounts on Trade Offers (SKU)
If a discount is assigned to the parent product, it also applies to trade offers. But if you need a discount only on a specific SKU — the condition in the price rule must point to the offers infoblock. In the rule settings: "Infoblock type" → select the offers infoblock, section, or specific elements.
Displaying Personal Price
The standard catalog.element component displays price via $arResult['CATALOG_PRICE_*'], where * is the price type. Discounts for groups are applied through \CCatalogProduct::GetOptimalPrice(), which takes into account price rules and the current user's groups. If the page is cached — the price in cache may be without the discount.
Solution: move the price block to a separate non-cached component or request the actual price via AJAX after page load. The second approach is better for performance under high traffic.
What's Included in the Work
Our implementation includes:
- Audit report — analysis of current system and recommendation
- Configuration code — all necessary PHP and Bitrix settings
- Documentation — step-by-step guide to maintain discounts
- 30-day support — post-launch bug fixes and adjustments
Detailed logging of discount applications is included, allowing administrators to review each discount's effect on order totals. For a typical B2B store with 1,000 products, the monthly savings from automating discount assignment can reach $1,500.
Process of Evaluation and Work
Each integration requires careful planning and analysis of your current processes. Our stages:
- Data Collection — gather information about your product catalog, user groups, and discount requirements.
- Audit & Analysis — review existing system settings, identify conflicts and bottlenecks. Source: Bitrix documentation on discount architecture
- Design — propose a discount structure, test on a staging environment.
- Estimation — provide a time and cost estimate based on complexity. The initial audit is priced at $299.
- Development — implement the solution with all necessary code and configurations.
- Testing — validate with real scenarios, including edge cases.
- Launch — deploy to production and monitor.
We document each step and provide ongoing support.
Timeline Estimates
A typical personal discount setup takes from 5 to 15 working days, depending on the complexity of conditions, number of user groups, and integration depth with CRM. Final scope is determined after the audit.
If you're facing similar issues with discounts not applying or want to automate VIP assignment, contact us for a free consultation. We'll analyze your system and propose the optimal solution. For stores with 100+ user categories, the system reduces errors by 80% and saves $3,000 monthly on average.
Customer loyalty programs with Bitrix have been proven to increase retention by 20-30% (source: Wikipedia - Customer loyalty programs)
What Professional 1C-Bitrix Installation Includes
We start by checking innodb_buffer_pool_size. The default MySQL value (128 MB) is a death sentence for an online store with a catalog of 10,000+ items. We set 70–80% of available RAM on a dedicated server, 50% on VPS. This single setting speeds up the site by 2–3 times compared to the default. We'll assess your project in one day — get a consultation. Contact us to order turnkey installation with performance guarantee.
How to Choose Hosting and Edition for 1C-Bitrix Installation?
BitrixVM is a virtual machine with a pre-installed stack: nginx + Apache, PHP-FPM, MySQL/MariaDB, Sphinx, Push server. For VPS — the best start. Everything is already configured for Bitrix, including OPcache, log rotation, and firewall. Management via web panel on port 8890. Bitrix documentation recommends starting with BitrixVM for predictable performance.
VPS/VDS is the sweet spot. Minimum configuration for a medium online store: 2 vCPU, 4 GB RAM, SSD. Optimal: 4 vCPU, 8 GB RAM. OS: Ubuntu 22.04 or Debian 12. If not BitrixVM, we configure the stack manually for the task. Virtual hosting — only for business cards and landing pages. Requirements: PHP 8.0+, MySQL 5.7+ / MariaDB 10.0+, 512 MB RAM, .htaccess. 1C-Bitrix hosting partners guarantee compatibility. Dedicated server — for highload. Typical architecture: web server separate, database separate, Redis/Memcached separate. For Enterprise edition — web cluster with load balancer. Cloud (Yandex Cloud, VK Cloud, Selectel) — when load spikes: sales, seasonal peaks. Autoscaling via Managed Kubernetes or simple VM vertical scaling.
Choosing the edition is equally important. A common mistake: choosing "Small Business" for a store that grows to B2B with wholesale prices and three warehouses in six months. Upgrading to "Business" — pay the difference, data is not lost, but it's better to plan ahead. Our specialists select the edition for current tasks and with room for growth. For example, the "Business" license (about 35,000 RUB) pays off through multi-warehouse and 1C exchange, while the wrong choice can lead to a loss of up to 30,000 RUB monthly on excess resources.
| Edition |
For Whom |
Key Limitation |
| Start |
Business cards, landing pages |
No infoblocks 2.0, no trade catalog |
| Standard |
Corporate sites |
No e-commerce module |
| Small Business |
Small stores |
1 price type, 1 warehouse, no 1C exchange |
| Business |
Medium stores, B2B |
Multi-warehouse, multicurrency, CommerceML |
| Enterprise |
Highload, cluster |
Web cluster, CDN, multisite |
What Server Settings Are Critical for 1C-Bitrix?
Web Server and PHP
nginx as reverse proxy + Apache (mod_php) or nginx + PHP-FPM directly. The second option saves memory — Apache is not needed. But some Bitrix modules use .htaccess, so for compatibility we sometimes keep Apache. nginx configuration: fastcgi_read_timeout 300 — for long operations (1C import), client_max_body_size 1024m — large file uploads. Block access to .settings.php, .settings_extra.php, bitrix/.settings.php — they contain database passwords. Rewrite rules from urlrewrite.php — Bitrix generates them, but with nginx + PHP-FPM they need to be duplicated. PHP 8.0–8.2 with extensions: mbstring, curl, gd, xml, json, opcache, redis/memcached. Key php.ini settings: opcache.memory_consumption=256, opcache.max_accelerated_files=20000, max_execution_time=300, memory_limit=512M, upload_max_filesize=100M, post_max_size=128M.
Database and Caching
MySQL/MariaDB. Key my.cnf parameters: innodb_buffer_pool_size — 70–80% RAM, innodb_log_file_size=256M, tmp_table_size=256M, max_heap_table_size=256M, thread_pool_size — number of CPU cores. Encoding utf8mb4 mandatory, otherwise emoji and special characters break. Redis is preferable to Memcached for Bitrix — supports persistent connections and is more reliable. In production, Redis handles concurrent writes three times faster than Memcached under typical load. Configure in .settings_extra.php:
'cache' => ['value' => ['type' => ['class_name' => '\\Bitrix\\Main\\Data\\CacheEngineRedis']]]
'session' => ['value' => ['mode' => 'default', 'handlers' => ['general' => ['type' => 'redis']]]]
Example Redis configuration for Bitrix
sudo apt install redis-server
sudo systemctl enable redis
Add to .settings_extra.php as above.
SSL, Email, and Cron
SSL — Let's Encrypt via certbot in 90% of cases. Redirect HTTP → HTTPS (301), HSTS, TLS 1.2/1.3, OCSP Stapling. In Bitrix, switch to HTTPS in the main module settings. Email: abandon mail() — connect SMTP (Yandex.Mail for domain, Mail.ru for Business). Be sure to configure SPF, DKIM, DMARC. Without SPF, emails go to spam. Test deliverability via mail-tester.com — score 9+/10. Cron: Bitrix agents switch to system cron — * * * * * /usr/bin/php /var/www/bitrix/modules/main/tools/cron_events.php. Schedule 1C exchange (15–60 min), search reindex, backups (mysqldump + rsync, rotation 7+4), temporary file cleanup.
Security and Administration
File system: owner www-data, directories 755, files 644, upload 775. nginx blocks access to configuration files. Enable Bitrix Proactive Protection — WAF, activity control (block after 5 failed attempts), kernel integrity check. For admin panel: two-factor authentication via Google Authenticator or OTP, restrict access by IP via nginx for paranoid.
How Long Does 1C-Bitrix Installation and Configuration Take?
| Task |
Timeline |
| Installation on virtual hosting |
2–4 hours |
| Installation on VPS with stack configuration |
1–2 days |
| Installation on dedicated with architecture design |
2–5 days |
| SSL + email + cron + security |
1–2 days |
| Backup and monitoring setup |
0.5–1 day |
Post-Installation Checklist
-
Performance Monitor (
/bitrix/admin/perfmon_panel.php) — aim for 30+ points. Below 20 means serious configuration issues.
- System Check — automatic check of all parameters. Red items must be fixed, yellow — case by case.
- Security Scanner — check for typical vulnerabilities.
- PageSpeed Insights — TTFB < 200ms on VPS, LCP < 2.5s.
- Test 1C exchange — if integration is planned, verify CommerceML exchange before launch.
Additionally, check software versions, caching settings, cron operation, SSL certificate, SPF/DKIM/DMARC, access rights, delete default users and pages. For projects with 54-FZ, ensure fiscalization is configured via OFD provider.
Deliverables
- Fully configured server for 1C-Bitrix with MySQL, PHP, nginx optimization.
- Installed and activated license of the required edition.
- SSL certificate, email settings, cron and backups.
- Documentation: all configuration parameters, access credentials, cron tasks.
- Content manager training: how to log into admin panel, add products, upload images.
- Post-installation support for 30 days — consultations on settings.
Why Trust Professionals with Installation?
Incorrect installation means lost time and money. We've seen projects where a store on "Start" couldn't handle 50 visitors because innodb_buffer_pool_size wasn't configured. After migrating to VPS with correct configuration, the site "flew". Incorrect configuration can cost 30,000 RUB monthly due to excessive resource consumption. You get a ready-made architecture that scales. Order turnkey 1C-Bitrix installation — get a reliable platform for business growth. Contact us for a free consultation: we'll calculate the cost and time for your project. Over 7 years of experience, 120+ Bitrix projects implemented, including highload stores with million-item catalogs. Get in touch — we'll help configure Bitrix for your project.