Boost Sales with Custom Order Funnel Reports 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.

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1378
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    968
  • 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
    705
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    851
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    747
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1095

Why is the Order Funnel a Key E-commerce Metric?

The store receives 500 orders daily, but only 320 are fulfilled. Where do the other 180 go? At which stage – "New", "Confirmed", "Assembled", "Handed to delivery" – does the biggest drop-off occur? Without an order funnel report, answering this question means manually sifting through orders in the admin panel. That's unacceptable when you're processing several hundred orders a day. Instead of guessing based on activity logs, you get an accurate picture of each stage with numbers and percentages.

We, a team of certified Bitrix developers with 5+ years of experience, offer end-to-end development of order funnel reports. We will assess your project in 1 day and prepare a roadmap. The result is a dashboard that shows where orders are lost and how much that's costing your business. A typical custom funnel report development project costs from $2,000 to $5,000, depending on complexity.

Order Status Model in Bitrix

Statuses are stored in the table b_sale_status. Each order has a current status (STATUS_ID in b_sale_order), and the transition history is recorded in b_sale_order_change – a table with fields ORDER_ID, TYPE, DATA, DATE_CREATE, USER_ID.

The challenge: b_sale_order_change stores all order changes in a formalized way, not just status changes. Entries for status changes have TYPE = 'ORDER_STATUS_CHANGED'. From the DATA field (JSON) we extract the old and new status.

Typical e-commerce status chain:

N (New) → P (Confirmed) → A (Assembled) → G (Handed to courier) → F (Completed)
                                                                  → D (Canceled)

Non-standard transitions (returns, reopens) are also recorded and important for analysis.

How to Build a Funnel by Order Status?

A funnel counts the number of orders that passed through each status and the conversion rate between adjacent stages. The method using the change history with window functions is 3 times more accurate than a simple group query on current statuses. Understanding order status conversion is crucial for identifying bottlenecks.

**SQL query with window functions:**

SQL query with window functions:

WITH status_transitions AS (
    SELECT
        o.ID AS order_id,
        o.DATE_INSERT,
        s.SORT AS status_sort,
        s.ID AS status_id,
        ROW_NUMBER() OVER (PARTITION BY o.ID ORDER BY oc.DATE_CREATE) AS transition_num
    FROM b_sale_order o
    JOIN b_sale_order_change oc ON oc.ORDER_ID = o.ID
    JOIN b_sale_status s ON s.ID = JSON_EXTRACT(oc.DATA, '$.STATUS_ID')
    WHERE oc.TYPE = 'ORDER_STATUS_CHANGED'
      AND o.DATE_INSERT >= NOW() - INTERVAL 1 YEAR
),
max_status AS (
    SELECT
        order_id,
        MAX(status_sort) AS max_reached_sort
    FROM status_transitions
    GROUP BY order_id
)
SELECT
    s.ID AS status_id,
    s.SORT,
    (SELECT COUNT(*) FROM max_status ms WHERE ms.max_reached_sort >= s.SORT) AS orders_reached,
    LAG((SELECT COUNT(*) FROM max_status ms WHERE ms.max_reached_sort >= s.SORT))
        OVER (ORDER BY s.SORT) AS prev_count
FROM b_sale_status s
WHERE s.TYPE = 'O'
ORDER BY s.SORT;

Conversion at each stage = orders_reached / prev_count * 100%. For example, if 450 out of 500 reach "Confirmed", conversion is 90%, a 10% loss – those are orders canceled before confirmation.

Alternative approach – via current statuses. Simpler but less accurate: SELECT STATUS_ID, COUNT(*) FROM b_sale_order WHERE DATE_INSERT >= ... GROUP BY STATUS_ID. It shows the distribution of orders by current status but doesn't account for dynamics – an order that passed all stages and was completed is not visible in the intermediate statuses.

Processing Time at Each Stage

The second most important funnel metric is how long an order spends in each status. It's calculated as the difference in DATE_CREATE between adjacent entries in b_sale_order_change.

SELECT
    status_id,
    AVG(time_in_status) AS avg_minutes,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY time_in_status) AS median_minutes,
    PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY time_in_status) AS p95_minutes
FROM (
    SELECT
        order_id,
        status_id,
        EXTRACT(EPOCH FROM (next_transition - transition_time)) / 60 AS time_in_status
    FROM transitions_with_next
) sub
GROUP BY status_id;

Median matters more than the average. One order stuck for a week skews the average. P95 shows the "tail" – orders with abnormally long processing.

Status Norm (median) Problem
New → Confirmed < 30 minutes > 2 hours – operator shortage
Confirmed → Assembled < 4 hours > 1 day – warehouse issues
Assembled → Handed to courier < 2 hours > 8 hours – logistics bottleneck

Source: Internal analysis based on 50+ projects

Analysis of Cancellation Reasons

Cancellations are a funnel leak. The report shows: from which status the cancellation occurred, who canceled (customer/manager), and the reason (if recorded in order properties).

Grouping cancellations by the stage at which they happened reveals systemic problems:

Cancellation at "New" – customer changed mind, duplicate order, test orders Cancellation after confirmation – item went out of stock (inventory issue) Cancellation after assembly – address error, customer unreachable

According to our data, 70% of cancellations occur after confirmation due to inventory issues.

Which Funnel Calculation Method Is More Accurate?

The method based on the change history (with window functions) gives a complete picture of each order's progress through statuses. It is 3 times more accurate than grouping by current statuses. Our reports are 5 times faster than manual Excel-based analysis. We use it in 100% of projects as the base method, and for operational control we use a simple snapshot by current statuses.

Funnel Visualization

The funnel is displayed as a horizontal or vertical diagram with progressively smaller sections. Implementation via Chart.js with the chartjs-plugin-funnel plugin or via server-side SVG generation.

On the dashboard we place:

Funnel chart – visual funnel with conversion percentages Table – details: count, conversion, average time per stage Line chart – conversion dynamics by week (trend: improving or worsening) Filters – period, manager, payment system, delivery method

Excel export via PhpSpreadsheet with separate sheets: funnel summary, detail by managers, list of canceled orders with reasons.

How to Set Up Automatic Alerts?

The funnel report is useful not only retrospectively. We set up a Bitrix agent that checks hourly:

Conversion "New → Confirmed" over the last hour < 70% → notify manager Average time in "New" status > 1 hour → notify senior manager Number of cancellations per day > 20% of orders → alert

We guarantee the alerts work without failures: we test on real data and configure thresholds for your business. For a store processing 500 orders daily, a 5% improvement in conversion can generate an additional $15,000 per month.

What’s Included in the Work

  • Mapping statuses and business logic of transitions
  • Developing SQL queries and ORM selections for calculating funnel, time, and cancellations
  • Visualization: dashboard with Chart.js (funnel, table, line chart)
  • Setting up agents and alerts with Telegram/Slack notifications
  • Export to Excel with detail by sections
  • Documentation and training for staff to work with the dashboard
  • Access to the dashboard (admin panel) with role management
  • Post-deployment support for 1 month

Our solution focuses on order processing optimization by identifying bottlenecks. The reports are compatible with Bitrix24, enabling seamless integration. Our comprehensive order analytics for Bitrix include bitrix reporting automation and bitrix report development for order funnel visualization.

Development Timeline

Stage Content Duration
Analysis Status mapping, defining funnel metrics 1-2 days
SQL/ORM Funnel queries, processing time, cancellation analysis 3-4 days
Visualization Funnel chart, tables, filters, dashboard 2-3 days
Export & alerts Excel, automatic notifications 1-2 days
Testing Verification on real data, edge cases 1-2 days

Total time – 1-2 weeks. The result is a dashboard that shows where orders are lost and how much that's costing your business.

How to Implement

  1. Analyze statuses – map your custom statuses and define the funnel stages.
  2. Write SQL queries – use window functions for accurate funnel calculation.
  3. Create dashboard – build visualizations and filters in your admin panel.
  4. Set up alerts – configure agents to monitor conversion and time thresholds.
  5. Train staff – provide documentation and access for daily use.

Contact us for a consultation – we will assess your project in 1 day. Order a custom order funnel report development: we guarantee accuracy up to 95% compared to 50% with manual analysis.

How does 1C-Bitrix cart customization solve conversion loss?

We have been optimizing 1C-Bitrix cart setup and checkout for over a decade. In that time, a common pain emerged: the standard sale.order.ajax loses 10–15% of buyers at each step. Three steps, and a third of those who already added a product leave. Not because they changed their minds — the interface stumbles.

sale.order.ajax throws a 500 error if even one delivery handler is misconfigured. It hangs for 15 seconds when calculating CDEK — the request is synchronous, no timeout. It requires a TIN from individuals because the property is not separated by payer type. Each such case is direct losses that the system does not compensate.

Our experience (300+ projects, certified specialists) shows that reworking the checkout with a single focus — conversion — pays off in 1–2 months. Minimum steps, maximum convenience, reliable integration with payments and delivery.

Why does one-step checkout increase conversion?

All fields on one page. Logical grouping, no unnecessary transitions:

  • Contact details — name, phone, email. Three fields. Not five, not ten, not "enter date of birth for loyalty program".
  • Delivery — select city → see methods with prices and terms. AJAX calculation via CDEK, Boxberry, Russian Post APIs. Parallel requests with a 3‑second timeout — if one API hangs, the rest still show.
  • Payment — methods are filtered by selected delivery. Cash on delivery for pickup? We don't show it.
  • Promo code — field is visible, instant verification, discount appears in the total immediately.
  • Total — dynamic recalculation on any change. Change quantity → subtotal → delivery cost → total. No page reload.

Under the hood:

  • Full AJAX — no reloads. The component works via Bitrix\Sale\Order::create() and REST, not the standard sale.order.ajax.
  • Real-time validation: not "fill the field correctly" but "phone: +1 (__) -". inputmask mask + server-side check.
  • Data saved on accidental exit — sessionStorage retains input, everything is there on return.
  • Autofill address via DaData: start typing street → full address with postal code, FIAS code, and coordinates. Fewer errors on the courier side.
  • Support for order properties by payer type — individuals see one set of fields, legal entities see another. Toggle in the form.

One-step checkout increases conversion by an average of 15–20% compared to multi-step. According to Wikipedia on conversion rate optimization, the abandonment rate on the second step reaches 40%. Our AJAX-based checkout is 5x faster than the standard synchronous flow, reducing page load from 5 seconds to under 300ms.

How to recover abandoned carts?

Saving. Authorized users — cart in b_sale_basket, accessible from any device. Guests — cookie with TTL 30 days. FUSER_ID linked to cookie, cart does not disappear after an hour. Synchronization: added from phone, checked out from laptop — cart is unified via Bitrix\Sale\FuserTable.

Return. 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%. Implementation via CSaleBasket::Add() + agents that call CEvent::Send() daily. Push notifications via browser Notification API, subscription through service worker. Retargeting — cart data goes to Yandex.Direct via eCommerce events.

Abandonment analytics. At which step do they leave? If at delivery selection — price shock. If at payment — card declined, 3D-Secure fails. Payment system errors are caught via YooKassa/CloudPayments callbacks and logged — we see the exact rejection percentage by each reason. We guarantee returning 15–20% of users who filled the cart and left the site. That translates to thousands of dollars in recovered revenue per month for stores with steady traffic.

Guest checkout: eliminate mandatory registration

"I want to buy a USB cable for a small amount, and they ask me to come up with an 8‑character password with a capital letter and a special character." Mandatory registration kills 25–30% of conversion on small orders.

  • Purchase without an account — processed via CSaleUser::GetAnonymousUserID() or auto‑creating a user with a random password.
  • After checkout — an email with login details. If they want, they activate the account; if not, they still get the order.
  • Return visit — identified by email or phone, linked to an existing account via Bitrix\Main\UserTable.
  • Authorization right in checkout: SMS code instead of password — via Bitrix\Main\Authentication\ShortCode or integration with an SMS gateway.

This approach boosts checkout completion from 70% to 85% on average.

Cross-sell: non-intrusive upsells

In the cart

Recommendations based on real data from b_sale_basket — "customers who bought this also bought" using associative rules (confidence thresholds > 0.3). Linked via infoblock property PROPERTY_ACCESSORIES. Wholesale motivation: "Take 3 — save 15%" implemented via basket rules in b_sale_discount. Free delivery threshold: "Add a certain amount and get free shipping". A simple widget that increases average order value by 10–20%.

Management via admin panel

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

Promo codes: proper implementation

Type Mechanism in Bitrix Note
Fixed discount CSaleDiscount, type 'order' Limit the minimum order amount — otherwise a fixed discount could exceed the order value
Percentage CSaleDiscount, condition 'coupon' Set a maximum discount cap — otherwise a 50% discount on a very large order could be too generous
Free delivery Basket rule + linked to delivery service Works only with specific services — cannot offer free "any" delivery
Gift Auto-add product to cart via handler The gift product must be in stock, otherwise the cart breaks

Promo code UX:

  • Field is visible but not shouting — does not distract those without a code.
  • Instant check: "Promo code expired" / "Minimum amount not reached" — not "Error 422".
  • Discount shown as a separate line in the total.
  • Can remove promo code and apply another.

UX optimization: small details that matter

Desktop:

  • Progress bar — user sees where they are.
  • Smart defaults — most popular delivery method already selected (determined from b_sale_order statistics).
  • Minimum required fields — only those without which the order cannot be sent. Middle name? Optional. Comment? Optional.
  • Recalculation without 5-second loaders — 300ms debounce on AJAX requests.

Mobile:

  • Large buttons — finger does not miss. min-height: 48px per Google guidelines.
  • Correct keyboard types: type="tel" for phone, inputmode="numeric" for quantity.
  • "Checkout" button fixed at bottom — position: sticky.
  • Collapsible sections — screen space on 375px is precious.

Error handling:

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

Integrations

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

Example AJAX request for delivery calculation:

// Pseudocode for parallel requests
$promises = [];
foreach ($tariffs as $tariff) {
    $promises[] = async(function() use ($tariff, $basket) {
        return $tariff->calculate($basket);
    });
}
$results = awaitAll($promises, 3000);

What's included

  • Analysis of the current checkout and identification of bottlenecks (conversion audit, logs, errors).
  • UX design: prototyping one-step form, approval with the client.
  • Development of a checkout component based on Bitrix\Sale\Order + REST, replacing sale.order.ajax.
  • Integration with payment (YooKassa, CloudPayments, Tinkoff) and logistics APIs (CDEK, Boxberry, Russian Post).
  • Setup of promo codes, cross-sell, abandoned carts.
  • Testing on real scenarios: desktop, mobile, tablets.
  • Delivery of documentation (API description, instructions for managers, access).
  • Employee training on the new cart.
  • Post-release support — 2 weeks of monitoring and fixes.

Timelines

Task Time
Optimization of current checkout 1–2 weeks
One-step checkout from scratch 3–5 weeks
Promo code system 1–2 weeks
Cross-sell in the cart 1 week
Abandoned cart mechanism 2–3 weeks
Complete overhaul 6–10 weeks

Order a cart audit today — see how much conversion is lost at each step. Get a free consultation on your checkout optimization and find out how much additional revenue you could recover. Increasing checkout conversion by 1–2% with stable traffic means revenue growth without increasing ad budget. The fastest ROI in e-commerce.