Setting Up Conditional Free Delivery in 1C-Bitrix
Free delivery upon meeting conditions is one of the most effective tools for increasing the average order value. Customers add more items to reach the threshold. In 1C-Bitrix this is implemented in several ways depending on the complexity of the conditions.
Method 1: Separate service with an order amount restriction
The cleanest approach. Create a "Free Delivery" service with zero price. Set a minimum order amount in the restrictions.
Shop → Settings → Delivery Services → Add → Manual (fixed price) → Price: 0
Then: [service] → Restrictions → Add restriction → Order amount → min: 3000
This method works through b_sale_delivery_restriction — when calculating available services, 1C-Bitrix checks restrictions and hides the service if the condition is not met.
Method 2: 100% discount via marketing rules
Shop → Marketing → Cart Rules → Add:
- Condition:
Order amount >= 3000 - Action:
Delivery discount 100%
Applies to the delivery service chosen by the customer. Downside: the 100% discount will apply to any service, even to express delivery that you do not want to make free.
Solution: restrict the list of services to which the discount applies in the rule — "standard delivery only."
Complex conditions: multiple criteria
Free delivery only for registered users from 5,000 rubles, or for everyone from 7,000 rubles — this cannot be covered by standard restrictions. Implementation via a custom handler:
public function isCompatible(\Bitrix\Sale\Shipment $shipment): bool
{
$order = $shipment->getOrder();
$price = $order->getPrice();
$userId = $order->getUserId();
// Registered user + from 5000
if ($userId > 0 && $price >= 5000) return true;
// Anyone + from 7000
if ($price >= 7000) return true;
return false;
}
"X away from free delivery" widget
This is a UX element in the cart: "Add another 1,200 ₽ and get free delivery." It is not part of the standard 1C-Bitrix template — it requires customizing the cart component.
// In the cart component template
$threshold = \Bitrix\Main\Config\Option::get('my_shop', 'free_delivery_threshold', 3000);
$currentSum = $arResult['PRICE'];
$remaining = max(0, $threshold - $currentSum);
if ($remaining > 0) {
echo 'Until free delivery: ' . \CCurrencyLang::CurrencyFormat($remaining, 'RUB');
}
The threshold is stored in the module settings or site settings (b_option), not in the template — so that a manager can change it without a developer.
Free delivery progress bar
A visual progress bar converts better than a text string. Implementation — a fill bar in percentage:
const threshold = 3000;
const current = parseFloat(document.getElementById('basket-sum').dataset.sum);
const pct = Math.min(100, Math.round((current / threshold) * 100));
document.getElementById('free-delivery-bar').style.width = pct + '%';
document.getElementById('free-delivery-remaining').textContent =
pct < 100 ? 'Add ' + (threshold - current) + ' ₽' : 'Free delivery!';
The progress bar updates when items are added to the cart via the standard 1C-Bitrix basket:update event.
Free delivery via promo code
Another option — free delivery as a promo code bonus. Implemented via a marketing rule with the condition "Coupon X applied" and the action "Delivery discount 100%." A coupon is created in the section Marketing → Coupons and linked to the cart rule.
Regional restrictions
Free delivery only in Moscow and St. Petersburg — a common scenario. Implementation: the "Free Delivery" service is restricted to two locations via the "Locations" tab. In other regions, this service is not shown and standard delivery applies.
Implementation timelines
Basic setup (separate service or discount via marketing) — 2–4 hours. With the "X away from free delivery" widget and progress bar — 1 working day. With promo codes and regional restrictions — 1–1.5 days.







