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:
- First payment — standard payment, obtain payment_method_id.
- Save token in SubscriptionTable.PAYMENT_TOKEN.
- 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
- Data collection — understanding your business requirements and technical environment.
- Audit and analysis — reviewing existing infrastructure and identifying integration points.
- Design — creating the data model and system architecture.
- Estimation — providing a fixed scope and timeline after analysis.
- Development — building the subscription module with all integrations.
- Testing — thorough QA including payment flow simulation.
- 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.







