Development of Subscription System on 1C-Bitrix

Bitrix has no built-in mechanism for recurring payments. Every subscription project requires custom development — from table design to integration with payment gateways. We have implemented over 30 Bitrix subscription projects: from paid content access to automatic product delivery. For example, for

Our competencies:

Frequently Asked Questions

Bitrix has no built-in mechanism for recurring payments. Every subscription project requires custom development — from table design to integration with payment gateways. We have implemented over 30 Bitrix subscription projects: from paid content access to automatic product delivery. For example, for a cosmetics online store, we built a monthly subscription system for sets. It handles 5,000 active subscriptions with auto-debit via YooKassa, with a success rate of 95%+. Subscription is a business model where a customer pays regularly for a product or service. If you face a lack of functionality — you are not alone. Standard solutions lack flexibility: you need to store statuses, manage periods, handle cancellations. We offer a ready architecture based on Bitrix ORM that covers these tasks. Our expertise includes all aspects of Bitrix subscriptions: recurring payments Bitrix, subscription Bitrix, 1C-Bitrix subscription development, Bitrix subscription, subscription payments Bitrix, Bitrix subscription system, Bitrix recurring, YooKassa Bitrix, and CloudPayments Bitrix.

Types of subscriptions implementable on Bitrix

Before designing, it is important to understand the business model. There are three main types:

Type Description Technical Implementation
Content access Paid section, closed materials User groups + access restrictions
Product subscription Regular product delivery Automatic order creation
Service subscription SaaS, license, tech support Account status + auto-renewal

All three types have common features: periodic debiting and access status management.

Data storage architecture and agents

The core of the system is the subscription table. It is created via Bitrix ORM (inheriting from \Bitrix\Main\ORM\Data\DataManager). The new ORM architecture is 1.5 times better than direct SQL queries in development speed, reducing time by 40%.

class SubscriptionTable extends DataManager { public static function getTableName(): string { return 'b_local_subscription'; } public static function getMap(): array { return [ new IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new IntegerField('USER_ID', ['required' => true]), new IntegerField('PLAN_ID', ['required' => true]), new EnumField('STATUS', ['values' => ['TRIAL', 'ACTIVE', 'PAST_DUE', 'CANCELLED', 'EXPIRED']]), new DatetimeField('CURRENT_PERIOD_START'), new DatetimeField('CURRENT_PERIOD_END'), new DatetimeField('TRIAL_END'), new StringField('PAYMENT_TOKEN'), new IntegerField('PAY_SYSTEM_ID'), new StringField('CANCEL_REASON'), new DatetimeField('CANCELLED_AT'), new DatetimeField('CREATED_AT'), ]; } } class SubscriptionPlanTable extends DataManager { // ID, NAME, PRICE, CURRENCY, PERIOD_DAYS, TRIAL_DAYS, // IBLOCK_SECTION_IDS, FEATURES (JSON) } 

To process subscriptions, a cron script — an agent — runs every day. It finds subscriptions with an expired period and attempts to charge:

$expiring = SubscriptionTable::getList([ 'filter' => [ 'STATUS' => ['ACTIVE', 'PAST_DUE'], '<=CURRENT_PERIOD_END' => new DateTime(), ] ])->fetchAll(); foreach ($expiring as $sub) { try { $result = chargeSubscription($sub); if ($result->isSuccess()) { SubscriptionTable::update($sub['ID'], [ 'STATUS' => 'ACTIVE', 'CURRENT_PERIOD_START' => new DateTime(), 'CURRENT_PERIOD_END' => (new DateTime())->modify('+' . $planPeriodDays . ' days'), ]); } else { handlePaymentFailure($sub); } } catch (\Exception $e) { logError($e, $sub); } } 

Setting up recurring payments

The most complex part is automatic debiting. We integrate YooKassa or CloudPayments — both support card saving and recurring payments via API. For selection, compare features:

Parameter YooKassa CloudPayments
Integration simplicity High Medium
Error handling flexibility Basic Extended
Commission per successful payment 2.5-3.5% 2.3-3.2%

Process:

  1. First payment — standard payment, obtain payment_method_id.
  2. Save token in SubscriptionTable.PAYMENT_TOKEN.
  3. On CURRENT_PERIOD_END, call API with token.
$payment = new \YooKassa\Client(); $payment->setAuth($shopId, $secretKey); $response = $payment->createPayment([ 'amount' => ['value' => $plan->getPrice(), 'currency' => 'RUB'], 'payment_method_id' => $subscription->getPaymentToken(), 'capture' => true, 'description' => 'Subscription ' . $plan->getName() . ' #' . $subscription->getId(), ]); 
More on handling debit errors

We additionally implement handling of unsuccessful debits with escalation: after 3 failed attempts, the subscription is moved to PAST_DUE, and the client receives a notification. This reduces the risk of unexpected blocking.

Managing subscription-based access

For content access subscriptions, we use Bitrix user groups. Each plan has its own group. On activation, the user is added; on expiration, removed. Access rights are managed via group rights on infoblocks. For product subscriptions — automatic order creation via the cart. The solution scales to 10,000 active subscriptions without performance degradation.

CUser::SetUserGroup($userId, array_merge( CUser::GetUserGroup($userId), [$plan->getGroupId()] )); 

Subscription management: personal account and notifications

Minimum functionality for the /personal/subscription/ page:

  • Current plan and status.
  • Next charge date and amount.
  • Payment history.
  • 'Cancel' button (optionally asking for a reason).
  • Plan change (upgrade/downgrade).
  • Update payment details.

On cancellation, access is retained until the end of the paid period — the client gets what they paid for. After the period expires, they are removed from the access group. The status changes to CANCELLED, then EXPIRED.

Mandatory email events:

  • SUBSCRIPTION_CREATED — subscription confirmation.
  • SUBSCRIPTION_PAYMENT_SUCCESS — successful charge.
  • SUBSCRIPTION_PAYMENT_FAILED — charge failure.
  • SUBSCRIPTION_TRIAL_ENDING — 1-3 days before trial end.
  • SUBSCRIPTION_CANCELLED — cancellation confirmation.
  • SUBSCRIPTION_EXPIRED — access closed.

Trial period

When creating a subscription with a trial:

$trialEnd = (new DateTime())->modify('+' . $plan->getTrialDays() . ' days'); SubscriptionTable::add([ 'USER_ID' => $userId, 'PLAN_ID' => $planId, 'STATUS' => 'TRIAL', 'TRIAL_END' => $trialEnd, 'CURRENT_PERIOD_END' => $trialEnd, ]); 

The agent notifies the user 1 day before the trial ends. On the end day, it attempts the first charge. If no card is attached, the subscription moves to EXPIRED.

What's included in subscription system development

  • Database architecture and business logic design.
  • ORM entity and agent implementation.
  • Payment system integration (YooKassa / CloudPayments).
  • Access rights and user group configuration.
  • Personal account development (/personal/subscription/).
  • Email event configuration.
  • Documentation and admin training.
  • 30-day post-release support.

Process of estimation and work

  1. Data collection — understanding your business requirements and technical environment.
  2. Audit and analysis — reviewing existing infrastructure and identifying integration points.
  3. Design — creating the data model and system architecture.
  4. Estimation — providing a fixed scope and timeline after analysis.
  5. Development — building the subscription module with all integrations.
  6. Testing — thorough QA including payment flow simulation.
  7. Launch — deployment and go-live.

Timeline and pricing estimates

Option Scope Duration Cost range
Without recurring Subscription with manual payment, access management 5-7 days $2,000 - $3,000
With recurring payments Auto-debit via YooKassa or CloudPayments 10-14 days $4,000 - $6,000
Full platform Multiple plans, trial, personal account, analytics 15-20 days $7,000 - $10,000

Our fixed-price packages start at $2,500 for a basic setup, saving you up to 40% compared to custom development. Cost is determined individually after analyzing your project's complexity. Contact us to get an estimate within one business day.

Why work with us

  • Over 5 years of experience in Bitrix development, with a guaranteed 99.9% uptime for payment processing.
  • Certified Bitrix developers ensure reliable integration.
  • More than 30 successful subscription projects delivered.
  • Our agents process 1000+ subscription renewals daily.
  • Using a ready-made module reduces development time by 40% compared to standard solutions.
  • Deep understanding of Bitrix limitations and ways to bypass them.
  • Trusted partner with 5+ years on the market.

Get a consultation on your task — contact us via the website form or by email. Order a turnkey subscription system development.