Cart & Checkout Services for 1C-Bitrix

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.
FAQ
Our competencies:
Development stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1167
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Website development for FIXPER company
    811
  • 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
    563
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    743
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    976

Cart and Checkout on 1C-Bitrix

Why sale.order.ajax Is Conversion's Worst Enemy

The standard sale.order.ajax is Bitrix's built-in checkout component. Multi-step: shipping → payment → confirmation. Each transition loses 10-15% of users. Three steps — and a third of shoppers who already added items to the cart are gone. Not because they changed their minds — because the interface tripped them up.

On top of that, sale.order.ajax throws a 500 error if at least one delivery handler isn't configured. Or hangs for 15 seconds calculating CDEK rates because the API request is synchronous with no timeout. Or demands a tax ID from an individual because the order property isn't split by payer type. Every case like this means direct losses.

We rebuild checkout with a single focus — conversion. Minimum steps, maximum convenience, reliable payment and delivery integrations.

Single-Step Checkout: Everything on One Screen

All fields on a single page. Logical grouping, no unnecessary transitions.

  • Contact details — name, phone, email. Three fields. Not five, not ten, not "enter your date of birth for the loyalty program"
  • Shipping — selected city → available methods with prices and delivery times. AJAX calculation via CDEK, Boxberry, Russian Post APIs. Parallel requests with a 3-second timeout — if one API hangs, the rest still show up
  • Payment — methods filtered by selected shipping option. Cash on delivery for pickup? Not shown
  • Promo code — field is visible, validation is instant, discount is reflected in the total immediately
  • Total — dynamic recalculation on any change. Changed quantity → subtotal → shipping cost → total. No page reloads

Under the Hood

  • Fully AJAX — zero page reloads. The component works through Bitrix\Sale\Order::create() and REST, not the standard sale.order.ajax
  • Real-time validation: not "fill in the field correctly" but "phone number: +7 (__) --". inputmask masking + server-side validation
  • Data preservation on accidental navigation — sessionStorage keeps entered data, everything's intact on return
  • Address autocomplete via DaData: start typing a street → full address with postal code, FIAS code, and coordinates. Fewer errors on the courier service side
  • Order property support by payer type — individuals see one set of fields, legal entities see another. Toggle switch in the form

Guest Checkout: Kill Mandatory Registration

"I want to buy a USB cable for 300 rubles, and they're asking me to come up with a password of 8 characters with an uppercase letter and a special character." Mandatory registration kills 25-30% of conversion on small orders.

  • Purchase without an account — process through CSaleUser::GetAnonymousUserID() or create a user automatically with a random password
  • After checkout — an email with login credentials. Want to activate the account — great; don't want to — they'll still get their order
  • Return visit — identify by email or phone, link to existing account
  • Authentication right in checkout: SMS code instead of password — via Bitrix\Main\Authentication\ShortCode or SMS gateway integration

Cross-Sell: Upsells That Don't Annoy

In the Cart

Recommendations based on real data from b_sale_basket — "customers also bought" using association rules, not random products.

  • Accessories: phone → case and screen protector. Linked via infoblock property PROPERTY_ACCESSORIES
  • Bulk incentive: "Buy 3 — save 15%." Implemented through cart rules in b_sale_discount
  • Free shipping threshold: "Add 500 more — free shipping." Simple widget that increases average order value by 10-20%

Admin Panel Management

A manager links recommended products manually or enables automatic algorithms. Display rules: category, price range, availability. A/B testing of different strategies — no developer needed.

Abandoned Carts: Recovering 15-20% of Lost Customers

Persistence

  • Authorized users — cart in b_sale_basket, accessible from any device
  • Guests — cookie with 30-day TTL. FUSER_ID is tied to the cookie, the cart won't disappear after an hour
  • Synchronization: added from phone, checked out from laptop — single cart

Recovery

  • Email series: 3 emails. After 1 hour — reminder. After 24 hours — "your item is running out." After 72 hours — personal promo code for 5-10%. Via sale.basketcomponent + CEvent::Send() with deferred sending through agents
  • Browser push notifications — Notification API, subscription via service worker
  • Retargeting — cart data is sent to Yandex.Direct via eCommerce events

Drop-Off Analytics

At which step do they leave? If at shipping selection — shipping price is shocking. If at payment — card is declined, 3D-Secure fails. Payment system errors are caught through YooKassa/CloudPayments callbacks and logged — we see the exact decline percentage by cause.

Promo Codes: Proper Implementation

Type Bitrix Mechanism Gotcha
Fixed discount CSaleDiscount, type "on order" Don't forget to set minimum order amount — otherwise a 500₽ discount on a 300₽ order
Percentage CSaleDiscount, condition "coupon" Cap the maximum discount — otherwise on a 500K order, 50% discount = 250K
Free shipping Cart rule + delivery service binding Only works with specific services — can't give free "any" shipping
Gift Auto-add product to cart via handler Gift product must be in stock, otherwise the cart breaks

Promo code UX:

  • Field is visible but doesn't scream — doesn't distract those who don't have a code
  • Instant validation: "Promo code expired" / "Minimum order 3000₽" — not "Error 422"
  • Discount shown as a separate line in the order summary
  • Can remove a promo code and apply a different one

UX Optimization: Small Details That Make the Difference

Desktop:

  • Progress bar — user sees where they are
  • Smart defaults — most popular shipping method is already selected (determined from b_sale_order statistics)
  • Minimum required fields — only what's needed to place the order. Middle name? Optional. Comment? Optional
  • Recalculation without 5-second loaders — 300ms debounce on AJAX requests

Mobile:

  • Large buttons — no finger misses. min-height: 48px per Google guidelines
  • Correct keyboard types: type="tel" for phone, inputmode="numeric" for quantity
  • "Place Order" button pinned to the bottom — position: sticky
  • Collapsible sections — screen space on 375px is precious

Error handling:

  • "Check your card number" instead of "Payment processing error"
  • Auto-scroll to first error — scrollIntoView({ behavior: 'smooth' })
  • "Item out of stock" — handled in checkout without losing filled data. Suggest an alternative or remove from cart with recalculation

Integrations

  • DaData — address, full name, tax ID. Suggestions as you type, FIAS validation
  • Yandex.Maps — pickup point selection on map, geolocation for city detection
  • CDEK, Boxberry, Russian Post — real-time API calculation of cost and delivery times
  • YooKassa, CloudPayments, Tinkoff — payment processing, recurring charges, holds
  • CRM — order automatically goes to Bitrix24, a deal is created linked to the contact
  • Warehouse — real-time stock check via CCatalogStoreProduct::GetList()

Timelines

Task Timeline
Current checkout optimization 1-2 weeks
Single-step checkout from scratch 3-5 weeks
Promo code system 1-2 weeks
Cross-sell in cart 1 week
Abandoned cart mechanism 2-3 weeks
Comprehensive overhaul 6-10 weeks

A 1-2% checkout conversion increase with stable traffic means revenue growth without increasing the ad budget. The fastest ROI in e-commerce.