Food delivery website development using 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.png
    B2B ADVANCE company website development
    1177
  • 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
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    747
  • 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

Food Delivery Website Development on 1C-Bitrix

Food delivery website — full e-commerce project with catering specifics. Not just catalog and cart: there are delivery zones with different timing and minimums, dish modifiers (sauce, size, toppings), kitchen system integration for auto-order transmission, and courier tracking. 1C-Bitrix covers foundation via sale module and commerce catalog, while delivery specifics enhanced with custom handlers and integrations.

Menu Catalog: Info Block with Trade Offers

Catalog built on Bitrix commerce catalog. Each dish — info block element with linked trade catalog. Categories (pizza, sushi, burgers, drinks, desserts) — info block sections.

Element properties:

  • Composition — text field
  • Weight — numeric (grams)
  • Calories / Macros — numeric properties
  • Cook Time — numeric (minutes), used for delivery time calculation
  • Labels — multiple list (spicy, vegetarian, new, bestseller)
  • Photo — mandatory file property

Modifiers via Trade Offers (SKU). 25cm and 35cm pizza — two SKUs with different price and weight. Toppings (double cheese, bacon, mushrooms) — trade offer properties type "list" with markup. On front, JS component recalculates total on topping selection.

Alternative for mass modifiers (sauces for each dish) — separate "Add-ons" info block with many-to-many link via binding property. On front, dish addition popup shows add-on selection.

Promo Codes and Loyalty Program

Promo codes — native sale module mechanism. Discount types:

  • Fixed sum for order over N rubles
  • Percent on whole order or category
  • Free delivery
  • Gift on order (product with zero cost)

Loyalty program — accumulative. Internal user account (module sale, "Customer Accounts" section): bonus accrual as order percentage, deduction next order. Accrual rules configured via module business logic without custom development.

Push Notifications on Order Status

On status change (accepted → cooking → en route → delivered) client gets notification. Channels:

  • SMS — via messageservice with connected provider (SMS.ru, SMSC)
  • Emailsale module mail event templates
  • Push in Browser — Web Push API (Service Worker + VAPID-keys)

Push implemented as custom event handler OnSaleStatusOrder. Status change triggers handler checking subscription and sending via Web Push. Subscription requested at first order.

Cart with Delivery Zones

Delivery cart differs from regular e-shop. Key features:

Delivery Zones by Geolocation. City divided into zones, each with parameters:

Parameter Zone 1 (center) Zone 2 (residential) Zone 3 (suburbs)
Radius to 3 km 3–7 km 7–15 km
Min Order 500 ₽ 800 ₽ 1,200 ₽
Delivery Cost free 150 ₽ 300 ₽
Delivery Time 30–45 min 45–60 min 60–90 min

Zones stored in highload-block with coordinate polygons (GeoJSON). On checkout, customer enters address, JavaScript sends request to Yandex.Geocoder (or DaData), gets coordinates, determines zone via point-in-polygon. Result cached by address.

Implementation in sale: zones connected as delivery services (handler CDeliveryHandler). Custom handler gets coordinates from order property, determines zone, returns cost and times. If address outside zones — delivery unavailable, checkout blocked.

Min Order checked in two places: front (JS blocks button) and backend (handler OnSaleBeforeOrderAdd returns error). Dual check prevents bypass via direct POST.

Time Slots. Customer chooses "ASAP" or specific slot (12:00–12:30, 12:30–13:00). Available slots generated dynamically: current time + cook time of longest dish + delivery time by zone. Past slots and overloaded (order limit per slot) — unavailable.

Kitchen System Integration

iiko or R-Keeper transmission — mandatory integration for automation. Without it, manager manually transfers order from site to POS, losing time and making errors.

iiko Interaction Scheme:

  1. Order completed on site → event OnSaleOrderAdd
  2. Handler forms JSON request to iiko Transport API (/api/1/deliveries/create)
  3. Request: positions with iiko SKU (map via info block property "ID in iiko"), address, phone, comment, delivery time
  4. iiko returns order ID, saved to Bitrix order property
  5. Cron agent every 2 minutes polls iiko status (/api/1/deliveries/by_id)
  6. Status change (cooking → ready → en route) — updates sale order status, notifications trigger

Nomenclature Mapping — critical. Each dish on site matches iiko position. Link via property "External ID". New dish addition requires admin to fill this field — without it order won't transmit. Validation on element save via handler OnBeforeIBlockElementUpdate.

Modifiers transmitted as nested JSON objects. Modifier structure between iiko and site must match — mapping configured during integration, fixed in docs.

Error Handling: if iiko unavailable — order saved in Bitrix with "Awaiting Kitchen Transmission" status. Cron repeats every 5 minutes. Manager sees such orders in separate filter in admin and can transmit manually.

R-Keeper similar but via XML (R-Keeper XML API) or intermediate service (UCS Delivery). Same principle: mapping, transmission, status polling.

Courier Tracking

Basic — order statuses without map. Extended — courier display on map.

Extended version: courier uses mobile app (own or third-party — Yandex.Routing, Bringo), transmits coordinates. Site gets coordinates via courier service API and displays on Yandex.Map in customer personal cabinet. Update — on request (button) or auto via polling every 30 seconds.

Development Stages

Stage Content Timeline
Analysis Delivery zones, nomenclature mapping iiko/R-Keeper, cart logic 2 weeks
Prototyping Cart UX, checkout, mobile version 1 week
Design Catalog, cart, personal cabinet mockups 2 weeks
Frontend Catalog with modifiers, cart, zone detection, slots 3 weeks
Backend Commerce catalog, delivery handler, iiko/R-Keeper integration 3 weeks
Testing End-to-end order test (site → kitchen → courier → client), load 1.5 weeks
Launch Deploy, integration monitoring, operator training 3 days

Total: 12–14 weeks. Main timeline risk — kitchen system integration: depends on third-party documentation and API stability.