Payments are experiencing issues due to temporary restrictions in Russia. If your payment does not go through, please submit a support request.Our support team is available 24/7 — we are always here to help with hosting and server issues.We are now accepting requests for dedicated server rental and colocation services in our data center.Reminder: we recommend enabling backups for additional data protection.A new VPS/VDS lineup with NVMe storage and improved performance is now available.Maintenance work on some servers has been completed. All services are operating normally.
Article5 min readViews0

Discount Changed the Total — and Delivery Broke: What Ozon Updates for 1C-Bitrix Teach Us

Recent fixes to Ozon modules show how bonuses, rounding, and user switching can disrupt order transmission from 1C-Bitrix to delivery. We examine which scenarios stores need to verify.

A package on a scale next to a label printer and an order processing system
In this article

    On September 23, the 1C-Bitrix Marketplace update history recorded a fix for the Ozon delivery module: the plan_bound_missing error could occur after applying bonuses, discounts, or final rounding. A key detail in the change description is that price is no longer used as an identifier for physical packaging; instead, the cost of each unit is recalculated from the final prices of the already saved order without losing kopecks.

    The next day, another Ozon integration module clarified the reason why an order cannot be delivered and changed how confirmed phone numbers are handled: the number is tied to a specific buyer and must be requested again after a user switch. This is not a single general error, nor is it an update to the 1C-Bitrix platform itself. However, these two adjacent changes clearly demonstrate how sensitive delivery has become to order data and the state of the user session.

    Why a Discount Can Break Delivery

    In a simple store, an item's cost appears as a single number. In a working online store, it has multiple states: base price, payer-type price, catalog discount, coupon, bonuses, rounding, cost allocation across sets, and the final order total. The delivery service receives data after some of these transformations have already occurred.

    The problem arises when an integration uses a monetary value not only as a sum but also as a technical flag. Before the discount, two entities match; after the discount, they no longer do. If the price served as an indirect identifier for packaging, a change of a few rubles or even kopecks can break the link between products, locations, and delivery calculations.

    It is more reliable to treat the saved order as the source of truth. First, the store must fully apply discounts, bonuses, and rounding, then allocate the cost across locations, and only then send the data to an external service. A recalculation on the integration side must not create a new version of the order that differs from what the buyer and manager see.

    What the store owner should check

    A single order without a discount is insufficient for testing. The minimum set of scenarios must include a standard catalog discount, a promo code, bonus deduction, a combination of discount with paid delivery, and an order with multiple packages. A separate case is needed where distribution results in a fractional amount requiring rounding to kopecks.

    It is useful to compare four values: the cart total before checkout, the saved order total, the sum of items sent for delivery, and the number of units in the delivery service response. These must align according to a predefined rule. If one system rounds each line item while another rounds only the grand total, the discrepancy must be handled explicitly rather than hidden by arbitrarily adjusting the last item.

    You must also verify repeat actions. An order may be recalculated after a change in address, delivery method, cart contents, or buyer profile. The integration must either regenerate valid units or display a clear reason for rejection. An old delivery request must not silently remain linked to the new version of the order.

    Phone number and user session are part of the same chain

    Changing the phone number and revalidating it after another user logs in may seem minor, but it closes a class of unpleasant errors. On a shared computer, at a checkout counter managed by staff, or after an account switch, the previous buyer's number must not automatically become the contact for the new order.

    For the store, this means testing not only form fields but also transitions between states: logging out of one account, logging into another, selecting a saved address, returning to the cart, and completing the order. Data confirmed in one session cannot be considered valid for another user without verifying ownership.

    How to update without new failures

    Before installing a new version of the module, you need a backup of the database and files, but that is not enough. First, apply the update to a site copy and run test orders with real discount rules. In testing, it is critical to reach the stage of creating a shipment request with the carrier, not stopping at the 'Order Completed' page.

    After the update, review the integration log to ensure it can link the order, the calculation attempt, the generated shipment slots, and the external service response. It is helpful to show the customer a clear message while saving the technical reason for the administrator. Never display an unprocessed API response in the public area: it may contain extraneous data or markup fragments.

    The combination of discounts, bonuses, and delivery must be tested as a single process. If each module is tested separately, the store might successfully calculate a discount and separately obtain a rate, yet still lose the order during the transfer of final totals. Such integration points require more attention than the list of features in the solution card.

    Discussion0

    Share your experience and ask questions. Comments without links appear after editorial review.

    No comments yet. Start the discussion.