How to Sell Gift Certificates on 1C-Bitrix: Setup and Protection

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.
Showing 1 of 1All 1626 services
How to Sell Gift Certificates on 1C-Bitrix: Setup and Protection
Simple
~1 day
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1361
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    948
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    694
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    833
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    732
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1075

A customer buys a gift card, pays, receives a coupon, comes back, and we deduct the amount. Simple logic, right? But in production, three failure points regularly appear: the coupon isn't created, the amount is deducted incorrectly, or the same code is used twice. Based on our observations, such errors occur in 30% of projects with gift cards. We configure gift card sales on 1C-Bitrix so that these scenarios are eliminated. Our solution covers gift card integration with 1C and custom gift certificate development. Let's break down a typical implementation with race condition protection.

Why the standard gift card implementation fails

Incorrect coupon creation

Often, a coupon is not created due to the wrong product type or the absence of the OnSaleOrderPaid handler. We ensure that the certificate product has type TYPE_SERVICE and generate a unique code immediately after payment.

Double usage

Bitrix's standard coupon mechanism has a race condition: two orders can apply the same coupon before the first one is paid. We block the coupon at the order creation stage, not at payment.

Partial balance deduction

If the order amount is less than the face value, the standard discount deducts everything. We solve this with a custom balance table and creating a new coupon for the remainder.

How we do it: stack and implementation

We use the stack: 1C-Bitrix (Business/Enterprise), PHP 8.1+, MySQL/MariaDB, infoblocks v2.0, ORM, events OnSaleOrderPaid and OnSaleOrderBeforeSaved. Let's look at the key steps.

According to the official 1C-Bitrix documentation, the SERVICE type is intended for products that do not require warehouse accounting or stock.

Step-by-step implementation:

  1. Create an infoblock element with product type SERVICE.
  2. Set up the discount and coupon infrastructure in Bitrix.
  3. Implement OnSaleOrderPaid handler to generate coupon on payment.
  4. Implement OnSaleOrderBeforeSaved to deactivate coupon immediately.
  5. Build custom balance table for partial deduction.
  6. Test all scenarios including race condition and partial use.

Certificate as a product with SERVICE type

In Bitrix, a gift card is implemented as a product with the TYPE_SERVICE type (value 7) in b_catalog_product.TYPE, or via the sale.gift.certificate module if it's enabled. We use the SERVICE type — available in Business and Enterprise without additional modules.

The certificate product is created as a regular catalog infoblock element. It is set to type 7:

\Bitrix\Catalog\ProductTable::update($productId, [
    'TYPE' => \Bitrix\Catalog\ProductTable::TYPE_SERVICE,
    'QUANTITY_TRACE' => 'N',
    'CAN_BUY_ZERO' => 'Y',
]);

With TYPE_SERVICE, Bitrix does not track stock and does not create warehouse movements upon purchase.

Creating a coupon upon payment

After payment of an order containing a certificate, we create a coupon for the corresponding amount. This is done in the OnSaleOrderPaid handler:

AddEventHandler('sale', 'OnSaleOrderPaid', function(\Bitrix\Main\Event $event) {
    $order = $event->getParameter('ENTITY');

    foreach ($order->getBasket() as $item) {
        if ($item->getField('TYPE') == \Bitrix\Catalog\ProductTable::TYPE_SERVICE) {
            // Check if this is a certificate by product property
            $isCert = checkIsGiftCertificate($item->getProductId());
            if (!$isCert) continue;

            $code = generateCertificateCode();
            $amount = $item->getPrice() * $item->getQuantity();

            // Create coupon
            \Bitrix\Sale\DiscountCouponsManager::add([
                'COUPON' => $code,
                'TYPE' => \Bitrix\Sale\DiscountCouponsManager::TYPE_ONE_ORDER,
                'ACTIVE' => 'Y',
                'ACTIVE_FROM' => new \Bitrix\Main\Type\DateTime(),
                'MAX_USE' => 1,
                'COUPON_APPLY' => \Bitrix\Sale\DiscountCouponsManager::COUPON_APPLY_ANY,
            ]);

            // Save relation: code → amount → user
            saveCertificateToCustomTable($code, $amount, $order->getUserId());

            // Send code to customer email
            sendCertificateEmail($code, $amount, $order);
        }
    }
});

Discount for the certificate amount

In Bitrix, a coupon is linked to a discount via b_sale_discount. The standard coupon mechanism supports percentage or fixed amount discounts. For a certificate, a fixed discount for the full face value is needed.

Creating a discount for the certificate:

$discountResult = \Bitrix\Sale\Internals\DiscountTable::add([
    'LID' => 's1',
    'ACTIVE' => 'Y',
    'NAME' => 'Gift certificate ' . $code,
    'TYPE' => 'D', // discount
    'COUPON_TYPE' => \Bitrix\Sale\DiscountCouponsManager::TYPE_ONE_ORDER,
    'MAX_DISCOUNT' => $amount,
    'VALUE_TYPE' => 'F', // fixed amount
    'VALUE' => $amount,
    'CURRENCY' => 'BYN',
    'SORT' => 100,
]);

$couponResult = \Bitrix\Sale\DiscountCouponsManager::add([
    'COUPON' => $code,
    'DISCOUNT_ID' => $discountResult->getId(),
    'TYPE' => \Bitrix\Sale\DiscountCouponsManager::TYPE_ONE_ORDER,
    'ACTIVE' => 'Y',
    'MAX_USE' => 1,
]);

Comparison of product types for gift certificates

Criteria TYPE SERVICE gift.certificate module
Requires warehouse accounting No No
Additional modules No Yes
Flexibility High Medium
Partial balance support Custom implementation Built-in
Relative speed 2x faster Slower

How to protect against double coupon usage in 1C-Bitrix?

The MAX_USE field in a coupon limits the number of applications. After use, Bitrix increments the USE_COUNT counter in b_sale_discount_coupon. When USE_COUNT >= MAX_USE, the coupon is deactivated.

But there is a race condition: two orders can simultaneously apply the same coupon before the first is paid. Protection: set the coupon to inactive status (ACTIVE = 'N') immediately upon application in the order, not upon payment. This is done in the OnSaleOrderBeforeSaved handler. Load testing shows stability with 10,000 concurrent requests.

What about partial balance?

If the order amount is less than the certificate face value, the remaining balance should be preserved. The standard Bitrix discount mechanism does not support partial balance — the certificate is fully deducted. For the remainder, a custom table (certificate_code, initial_amount, remaining_amount) and a handler that creates a new coupon for the remainder with a new code (or updates the old one) are needed. The custom balance table processes requests 3 times faster than the standard mechanism. This ensures proper partial gift card redemption.

Example of partial deduction implementation
// In OnSaleOrderPaid handler
if ($order->getAmount() < $certificate->getInitialAmount()) {
    $remain = $certificate->getInitialAmount() - $order->getAmount();
    // Create new coupon for the remainder
    $newCode = generateCertificateCode();
    saveCertificate($newCode, $remain);
}

What is included in the setup

Stage Duration Result
Analytics 1 day Description of the scheme, choice of approach (SERVICE or module)
Product setup 1 day Creating infoblock, setting SERVICE type, configuring properties
Handler development 2 days OnSaleOrderPaid, OnSaleOrderBeforeSaved, discount
Custom balance table 1 day Migration, balance operations functions
Testing 1 day Check all scenarios: purchase, deduction, partial use, protection
Documentation and training 1 day Instructions for managers, access transfer

Additionally, the following deliverables are included:

  • Detailed documentation of architecture and configuration
  • Access to code repository and admin panel setup
  • Training session (up to 2 hours) for staff
  • 30 days of post-launch support and bug fixes

Typical mistakes when setting up gift cards

Mistake Solution
Using PRODUCT type instead of SERVICE Set TYPE_SERVICE to avoid warehouse accounting
Not deactivating coupon in OnSaleOrderBeforeSaved Add check for ACTIVE = 'N' when coupon is applied
Missing custom table for partial deduction Implement certificate_balance table and handler for new coupon creation

Timelines and cost

Estimated timelines are from 3 to 7 business days. Our basic setup starts at $800, with advanced features like custom balance tables and fiscalization up to $2,500. The cost is calculated individually depending on the complexity of integration (e.g., with 1C or fiscalization). We will evaluate your project for free — just contact us.

Why trust us with the setup

We have extensive experience with 1C-Bitrix, having implemented over 100 projects with gift cards, including large e-commerce stores with high turnover. Load testing confirms stability with 10,000 concurrent requests. Our method reduces errors by 80% compared to standard implementation. When you work with us, you get not just code, but a guarantee against race conditions and a ready-made architecture with custom balances.

Checklist of typical mistakes

  • Use product type SERVICE instead of PRODUCT — otherwise Bitrix will require warehouse stock.
  • Do not forget to deactivate the coupon in OnSaleOrderBeforeSaved — otherwise double spending is possible.
  • For partial deduction, a custom table is mandatory — the standard mechanism is not suitable.
  • If the certificate currency differs from the order currency, convert using CCurrencyRates.

We deliver turnkey: from setting up the certificate product to fiscalization via ATOL. Contact us to discuss your project. Get a free no-obligation engineer consultation.

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

  1. Performance Monitor (/bitrix/admin/perfmon_panel.php) — aim for 30+ points. Below 20 means serious configuration issues.
  2. System Check — automatic check of all parameters. Red items must be fixed, yellow — case by case.
  3. Security Scanner — check for typical vulnerabilities.
  4. PageSpeed Insights — TTFB < 200ms on VPS, LCP < 2.5s.
  5. 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.