We encountered a situation: a client bought a shipping cost module, but its logic didn't account for loyalty card discounts. Standard means — no way. Direct file editing? A module update would wipe all changes. The customization task — add this specificity without breaking updatability of a ready-made solution. Such tasks make up 30–40% of all requests for module modification.
A ready-made solution from the marketplace covers 70–80% of needs. The remaining 20–30% are business specifics: different shipping cost logic, non-standard fields in the order form, custom appearance matching the brand style, integration with an internal accounting system. Our experience customizing over 100 Bitrix modules in 6+ years confirms: with the right approach, updates do not break custom work. Bitrix customization that preserves updateability is our specialty — we succeed in 95% of cases.
Why is updateability key?
Directly editing files in /bitrix/modules/vendor.modulename/ is the fastest way to get results and the most destructive. On the next module update through the marketplace, all changes are overwritten. Six months later, the module developer releases a critical security update, the client updates — and the customization disappears. Customization via events is 10 times more reliable than file editing and reduces recovery time after an update by 90%. Using the event system is also 5 times faster than modifying core files.
According to official Bitrix documentation, the event system is the primary way to extend functionality. The correct approach is customization through the extension mechanisms that Bitrix provides specifically for this.
Customizing component templates
Most ready-made solutions output data through standard Bitrix24 components. The visual layer is a component template stored separately from the logic.
Copying a template for customization:
Original: /bitrix/components/vendor/component.name/templates/.default/
Custom: /local/templates/SITE_TEMPLATE/components/vendor/component.name/CUSTOM_TEMPLATE/
Or in the site template:
/local/templates/my_template/components/vendor/component.name/.default/
When the module is updated, /local/ is not touched — the custom template remains. When rendering, Bitrix first looks for the template in /local/, then in /bitrix/.
This works for template.php, style.css, script.js of component templates. The component logic (component.php, class.php) remains original. In 80% of cases, copying the template or subscribing to an event is enough.
Customizing logic without editing files
To change business logic without editing module files, Bitrix's event system is used. The event architecture allows subscribing to an action and modifying data before or after it.
Example: a ready-made delivery module calculates cost via the OnDeliveryGetCost event. A custom handler in /local/php_interface/init.php:
AddEventHandler('sale', 'OnDeliveryGetCost', function(&$arDelivery, &$arOrder, &$arOrderPrice) {
// Modify delivery cost according to our logic
if ($arOrder['REGION'] === 'CUSTOM_REGION') {
$arDelivery['PRICE'] = 0;
}
return EventResult::SUCCESS;
});
Popular events for customization:
-
OnBeforeOrderAdd / OnAfterOrderAdd — before and after order creation
-
OnBeforeIBlockElementAdd / OnAfterIBlockElementUpdate — work with infoblock elements
-
OnBeforeUserLoginByHash — custom authorization
-
OnAfterUserAuthorize — actions after authorization
For a list of available module events, see its documentation or run grep -r "AddEventHandler\|RegisterModuleDependences" /bitrix/modules/vendor.modulename/.
Choosing the right method
If you need to change the appearance — copy the template. If you need to add new logic before or after existing logic — use events. If the module is built on D7 and classes can be overridden — inherit the class. Time saved on customization compared to development from scratch — up to 70%, and cost is 2–3 times lower than creating your own module. Customization costs range from $500 to $2000, depending on complexity. For example, a typical delivery logic change costs around $1,200, saving $2,800 versus building a custom module. Our experience shows that proper customization via events costs about $1,200 for typical logic changes, which is 2-3 times cheaper than custom development ($3,000–$4,000).
Class inheritance
Many modern modules use OOP and allow overriding classes. If a module declares a class VendorPaymentHandler extends \Bitrix\Sale\PaySystem\ServiceHandler, you create your own class in /local/:
// /local/lib/CustomPaymentHandler.php
namespace Custom;
class CustomPaymentHandler extends \Vendor\Module\PaymentHandler
{
public function pay(array $payment): bool
{
// Add our logic before/after standard
$this->logPaymentAttempt($payment);
return parent::pay($payment);
}
}
And register it instead of the original via module settings or a corresponding event handler.
D7 extensions and custom fields
In D7 architecture (modules using Bitrix\Main), the following are used to extend behavior:
-
ORM extensions — adding custom fields to existing tables via
UserTypeTable or via addCustomSelectFields in queries.
-
File masks (
.settings.php) — overriding module settings at the site level.
-
DI container (
Bitrix\Main\DI\ServiceLocator) — replacing module services with your own implementations.
Bitrix custom fields (UserTypeTable) allow adding arbitrary properties to infoblocks and HL-blocks without modifying module code. This is a safe way to extend.
Limitations of customization without core editing
Some things in ready-made solutions cannot be customized the "right" way:
- SQL queries inside class methods that cannot be overridden.
- Hardcoded redirect URLs.
- Static methods without events.
In such cases, the options are to either negotiate with the vendor for official hooks, or accept that this part will be overwritten on update and document the restoration procedure.
What's included in the work
Deliverables:
- Analysis of the module's source code and identification of extension points.
- Development of custom event handlers or overridden classes.
- Testing for compatibility with current and future module versions.
- Documentation of changes (which files/events are affected).
- Handover of access and instructions for module update.
- Warranty support for 30 days after delivery.
- Training your team on how to apply updates safely.
With 6+ years of experience and over 100 successful Bitrix customizations, we ensure your modifications remain updateable. Order customization with updateability guarantee — contact us to assess your module. A ready-made integration with 1C via CommerceML may require behavioral modifications of the module, and we customize that too.
Customization timelines
| Scope of changes |
Timeline |
| Visual template edits (colors, fonts, block layout) |
1–3 days |
| Adding custom fields and their processing via events |
2–5 days |
| Business logic changes (delivery, discounts, statuses) |
3–10 days |
| Integration of a ready-made module with an external system via custom events |
1–3 weeks |
| Deep rework of a ready-made solution's functionality |
3–6 weeks |
If you're not sure whether your module can be modified without losing updateability, contact us — we'll assess and propose a solution. Get a consultation — it's free.
Marketplace Development on 1C-Bitrix: Overcoming Standard Architecture Limitations
The b_sale_order table and related b_sale_basket are not designed for multivendor out of the box. Bitrix has no built-in 'marketplace' module — each time it's custom development on top of the sale module. The standard sale module cannot split orders by different suppliers: if the cart contains items from three sellers, Bitrix creates a single order with one number, status, and total. It's impossible to send each sub-order to a separate dashboard, calculate commissions for each seller, or allow partial shipment. We have to redefine the entire logic: from cart to status model. Additionally, the standard search (Sphinx) and caching are not optimized for a multivendor catalog — with 100,000 items from 500 suppliers, filters by supplier lead to performance degradation (queries with WHERE on IBLOCK_ELEMENT_PROPERTY become 5–10 times slower). We write a separate module that extends the standard cart: adds item-to-supplier binding via order property, splits a single order into sub-orders by seller, and routes each separately.
Why Standard Solutions Are Not Suitable for Multivendor Platforms?
Marketplace Models
Classic marketplace — the operator does not hold inventory. All product logic lies with sellers, the platform handles traffic and payment gateway. Technically, this is a separate supplier infoblock linked via UF_VENDOR_ID in the highload catalog infoblock.
Hybrid model — the operator sells alongside external suppliers. The main pain: ranking in the catalog. If suppliers see that the platform's own listings always rank higher, they leave. We solve this with a separate sorting component where position is determined by rating, shipping speed, and price, without privileges for 'own' items.
Service marketplace — requests, tenders, escrow. Here, instead of b_sale_basket, a custom request entity works with a workflow via Bitrix business processes.
B2B marketplace — contracts, reconciliation statements, credit lines, EDI. Authorization by TIN, multi-price groups via b_catalog_group, shipping limits.
What Technical Problems Does Marketplace Development on 1C-Bitrix Solve?
Monetization Models
| Model |
Implementation |
Common Use Case |
| Sales commission |
Handler OnSaleOrderComplete, calculation by category and seller status |
Universal |
| Subscription |
Custom module with cron task and billing via sale.paysystem |
B2B platforms |
| Listing fees |
Counter in OnAfterIBlockElementAdd |
Classifieds boards |
| Promotion |
Promo slots via separate highload infoblock |
Additional revenue |
| Fulfillment |
Integration with WMS via REST |
Platforms with logistics |
What Does the Seller Dashboard Include?
The dashboard is the heart of a marketplace. An inconvenient dashboard = empty platform. No standard solution exists; we build from scratch using Bitrix components.
- Catalog management — CRUD for products via custom component, bulk CSV/XML upload via
CIBlockXMLFile. Nobody manually enters 10,000 SKUs, so import is the first thing we do.
- Order processing — sub-orders land in the dashboard via ajax-polling or websocket. Confirmation, invoice printing via
CSalePdf, status update with back-sync to the main order.
- Financial analytics — dashboard on highload infoblock of aggregated data. Revenue, commissions, payouts — details by product and period. The seller sees what sells and what just occupies the showcase.
- Delivery settings — seller's own tariffs, binding to
sale.delivery.handler.
- Communication — built-in chat without revealing contacts. Implemented via
im module or custom message table.
- Promotions — discounts, promo codes via
b_sale_discount with filter by vendor_id.
Moderation and Quality Control
One batch of counterfeit goods kills the platform's reputation. Therefore, moderation is mandatory.
- Product moderation — status
ACTIVE='N' until verification. Auto-moderation filters obvious violations (banned words, missing photos), manual moderation handles disputes. Handler OnBeforeIBlockElementUpdate prevents bypass.
- Seller verification — TIN check via Federal Tax Service API, document scans upload. Statuses: new → verified → premium. Each level unlocks limits on product count and commissions.
- Rating system — not just stars. The algorithm considers shipping speed (
AVG(ship_date - order_date)), return rate, and answer quality.
- Anti-fraud — detect rating manipulation by patterns (same IP, identical texts, abnormal frequency). Duplicate accounts caught by TIN and bank details.
- Typical mistake: storing supplier data in a regular infoblock — with 1000+ sellers, queries become slow. Use highload infoblocks.
How Is the Seller Payout System Structured?
The financial module is why sellers join the platform.
- Commission calculation — handler on order status change. Commission depends on category, seller status, current conditions. Stored in a separate table
vendor_transactions.
- Periodic payouts — cron task generates a register: weekly, bi-monthly, or monthly. Minimum payout amount, holding until confirmation.
- Acts and reports — PDF generation via
PhpOffice\PhpSpreadsheet, automatic numbering, one-click download.
- Holding — funds held until product received. Reduces disputes and returns.
- Payouts via banking API — YooKassa, CloudPayments, direct banking APIs. Seller receives money without calls or reminders.
- Important: splitting orders at the
OnSaleOrderSaved handler leads to status mismatch. Split at the cart stage.
- Manual fiscalization of each sub-order violates 54-FZ. Use a single receipt with 'agent' attribute. On one project, fiscalization automation saved significant monthly costs. On another, search optimization via Elasticsearch reduced catalog loading time by 80% (from 3 seconds to 0.6 seconds).
How We Build Marketplace Architecture
- Define business model — choose marketplace type and monetization scheme.
- Database design — highload infoblocks for catalogs over 50,000 SKU, separate tables for sub-orders (
orders_split) and transactions.
- Core development — create module
marketplace.vendor, implement product-to-supplier binding, order splitting mechanism, agents for commission calculation.
- Payment gateway and 54-FZ integration — configure fiscalization via ATOL Online or CloudPayments.
- Load testing — use
k6 or ab to verify 5000 orders per day.
Typical Mistakes in Bitrix Marketplace Development
- Storing suppliers in a regular infoblock — causes slowdowns with >1000 records. Use highload infoblocks.
- Splitting orders after saving — breaks the status model. Split at the cart stage.
- Manual fiscalization of each sub-order — violates 54-FZ. Fiscalize with a single receipt with agent attribute.
- Ignoring tagged caching for the catalog — with multivendor, cache is invalidated entirely. Configure tags by
vendor_id.
Technology Stack
- 1C-Bitrix 'Business' or 'Enterprise' —
sale + catalog modules as foundation. Multivendor wrapper — custom modules.
- Highload infoblocks — catalogs over 100,000 SKU. Regular infoblocks at such volumes fail on filtering:
CIBlockElement::GetList with a dozen properties generates JOINs on dozens of b_iblock_element_prop_sNN tables. Highload solves this with a flat structure.
- Elasticsearch — full-text search. Elasticsearch processes queries 10 times faster than the built-in search module (Sphinx). User types 'nike sneakers' — finds 'Nike sneakers'.
- Queues — catalog import, payout calculation, report generation. Bitrix agents (
CAgent) for light tasks, separate queue via RabbitMQ or supervisor + custom CLI for heavy tasks.
We guarantee that the developed module will handle a load of up to 5000 orders per day on a standard VPS. Certified 1C-Bitrix specialists (over 10 years of experience, 50+ completed projects) perform architecture audit before development starts. At a scale of 2000 sellers, average moderation time is 15 minutes, and 95% of orders are processed automatically.
Industry Marketplaces
Each niche has its own pitfalls:
- Building materials — oversized delivery calculation. Pallets, tonnage, floor lift. Standard delivery calculator cannot handle it; we write custom
sale.delivery.handler.
- Food products — expiration dates in infoblock properties, temperature regime, same-day delivery slots. A logistics error means write-off.
- Auto parts — VIN selection via Laximo API, cross-references, originals and analogs. A separate headache is different delivery times from different sellers for the same part.
- Clothing — size charts (EU/US/RU), high return rate. Return processing logic with commission redistribution is a whole layer.
- Industrial equipment — B2B with tenders, quotation requests. Product card with 50+ parameters in table form.
Timelines and Stages
Trying to launch everything at once is a sure way to launch nothing.
| Stage |
Duration |
Result |
| Business model |
2-3 weeks |
Monetization model, MVP scope. We cut 80% of desires not needed at start. |
| Design |
3-4 weeks |
UX, prototypes for storefront and dashboards, database architecture. |
| MVP |
2-3 months |
Catalog, seller registration, orders, basic moderation. First real sales. |
| Pilot |
2-3 weeks |
First sellers, test purchases, load testing via ab or k6. |
| Scaling |
ongoing |
New features based on feedback, query optimization, horizontal scaling. |
MVP in 3-4 months. Full-featured platform — 6-12 months of iterative development.
What Is Included
- Documentation: architecture diagram, API description, seller instructions.
- Access: code repository, test environment, admin panel.
- Training: two sessions for administrators and managers.
- Support: 1 month free support after launch, then according to SLA.
- Warranty on developed modules — 12 months.
Contact us for an assessment of your project — we will calculate timelines and cost individually. Request a consultation, and we will show on a real case how we solve the multivendor problem in 30 minutes. Get a detailed development plan for your marketplace today.