Setting Up Pickup and Parcel Lockers in 1C-Bitrix
Pickup and parcel lockers are delivery methods where the customer collects the order themselves. They reduce the store's operational costs and give the customer flexibility. In 1C-Bitrix this is implemented through the standard delivery module, but the specific scenario (single warehouse, multiple pickup points, or a third-party pickup network) requires different approaches.
Single-address pickup
The simplest case: one warehouse/store, one pickup address.
Shop → Settings → Delivery Services → Add → Manual (fixed price):
- Price: 0 (or a nominal amount, e.g. 0)
- Description: pickup address, business hours
- Locations: required cities or the whole country
No APIs, no integrations — simply a service with zero price.
Multiple pickup points
When there are multiple points, the customer needs a choice. Implementation: a list of addresses in the delivery method selection form.
Points are stored in an info block (e.g., PICKUP_POINTS) with properties: name, address, coordinates, business hours, additional conditions. The delivery component template outputs the list via CIBlockElement::GetList.
// In the delivery component template
$pickupPoints = \CIBlockElement::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => PICKUP_POINTS_IB_ID, 'ACTIVE' => 'Y'],
false,
false,
['ID', 'NAME', 'PROPERTY_ADDRESS', 'PROPERTY_WORKING_HOURS', 'PROPERTY_LAT', 'PROPERTY_LON']
);
while ($point = $pickupPoints->Fetch()) {
// Output list of points with a map
}
The selected point ID is saved to the order property PICKUP_POINT_ID. In the admin panel the manager can see which point the order is directed to.
Partner pickup network on a map
For stores using CDEK, Boxberry, parcel locker networks, etc. — the widgets of these services are embedded in the delivery component template. When a specific delivery service is selected at checkout, a map with pickup points appears.
// Switch between maps when selecting a delivery service
document.querySelectorAll('[name="DELIVERY_ID"]').forEach(radio => {
radio.addEventListener('change', function() {
// Hide all maps
document.querySelectorAll('.pvz-map').forEach(m => m.style.display = 'none');
// Show map for the selected service
const mapEl = document.getElementById('pvz-map-' + this.value);
if (mapEl) mapEl.style.display = 'block';
});
});
Order ready for pickup notification
With pickup, the customer must be notified when the order is ready for collection. This is done via the order status change event:
// In the OnSaleStatusOrder event handler
if ($newStatus === 'READY_FOR_PICKUP') {
$deliveryId = $order->getPropertyValueByCode('PICKUP_POINT_ID');
$this->sendReadyNotification($order, $deliveryId);
}
The notification template contains the point address, business hours, and storage period (usually 7–14 days). It is sent by email and SMS via standard 1C-Bitrix events.
Order storage: deadline and reminder
With pickup, the order waits for the customer at the point. If it is not collected within 7 days — the manager must receive a reminder. A 1C-Bitrix agent runs daily to check orders with the status "Ready for pickup" and a date older than N days, and sends a reminder to the manager and customer.
public static function checkExpiredPickups(): string
{
$expiryDays = \Bitrix\Main\Config\Option::get('my_shop', 'pickup_expiry_days', 7);
$expiryDate = (new \DateTime())->modify("-{$expiryDays} days")->format('Y-m-d H:i:s');
$orders = \Bitrix\Sale\Internals\OrderTable::getList([
'filter' => [
'STATUS_ID' => 'READY_FOR_PICKUP',
'<DATE_UPDATE' => $expiryDate,
],
])->fetchAll();
foreach ($orders as $order) {
// Send reminder to customer and manager
self::sendExpiredNotification($order['ID']);
}
return __CLASS__ . '::checkExpiredPickups();';
}
Pickup point map on the "Delivery" page
In addition to checkout, a map with pickup points is placed on the "Delivery and Payment" page. The customer can choose a convenient point before starting the checkout process. The component is built on the pickup points info block with output on Yandex Maps or Leaflet + OpenStreetMap.
Implementation timelines
Single pickup address — 2–3 hours. Multiple points with map, selection, and notification — 2 days. Integration with a third-party pickup widget (CDEK, Boxberry) — 2–3 days.







