Data Migration from amoCRM to Bitrix24
amoCRM and Bitrix24 are close competitors, but their data models differ significantly. amoCRM is built around deals (a pipeline-centric model), while Bitrix24 is a more comprehensive system with separate entities for leads, deals, contacts, and companies. This difference defines the entire migration strategy.
Fundamental Model Differences
| Aspect | amoCRM | Bitrix24 |
|---|---|---|
| Central entity | Deal (lead) | Lead → Contact + Deal |
| Contacts | Attached to deals | Independent entity |
| Companies | Attached to deals | Independent entity |
| Tags | On deals and contacts | UF fields or categories |
| Pipelines | Multiple, with stages | Funnels (directions) with statuses |
| Custom fields | Simple configuration | UF fields with typed definitions |
In amoCRM a "deal" (lead) is both a lead and a deal simultaneously. During migration you must decide: transfer everything to Bitrix24 deals, or split them into leads + converted deals.
Extracting Data from amoCRM
amoCRM provides REST API v4. Authentication via OAuth 2.0. API rate limits: no more than 7 requests per second — rate-limiting between requests is mandatory when exporting large datasets.
Client for paginated contact extraction (250 records per request):
class AmoCrmClient {
public function getContacts(int $page = 1): array {
$url = "https://{$this->domain}.amocrm.ru/api/v4/contacts"
. "?page={$page}&limit=250&with=leads,companies";
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('Authorization', 'Bearer ' . $this->accessToken);
return json_decode($http->get($url)->getResult(), true);
}
}
Pipeline and Status Mapping
amoCRM pipelines → Bitrix24 directions (funnels). These are created in advance via crm.category.add, then statuses for each funnel via crm.status.add.
The mapping is saved to a file or table for use during deal transfer:
$pipelineMapping[$pipeline['id']] = $b24CategoryId;
$statusMapping[$status['id']] = 'STAGE_' . $status['id'];
Custom Fields: Creating Them in Bitrix24
In amoCRM, custom fields are created freely. Before migrating, create the corresponding UF fields in Bitrix24 via crm.contact.userfield.add. The field type is determined by the field_type from the amoCRM API:
-
text→ string -
numeric→ integer -
date→ date -
select→ list (enumeration)
Transferring Contacts
Each amoCRM contact becomes a contact in Bitrix24. Phones and emails are stored in PHONE / EMAIL arrays with value types WORK and MOBILE. The creation date is transferred via the DATE_CREATE field.
After creating each contact, save the mapping amo_id → b24_id for linking deals.
Transferring Deals with Notes
Deals are the core of the migration. Each amoCRM deal is transferred to Bitrix24 via crm.deal.add with links to contacts and companies based on the mapping. The source ID is preserved in a custom field UF_CRM_AMO_ID — for reconciliation and debugging.
Notes from amoCRM are transferred as timeline comments via crm.timeline.comment.add. This preserves the negotiation history visible to managers in the deal card.
Tasks and Calls
Tasks from amoCRM are transferred via tasks.task.add. Call records (if telephony is connected) are transferred via crm.activity.add with type CALL. This is valuable historical information for resuming client engagement.
Preventing Duplicates on Re-runs
When the migration script is restarted after errors, a check is needed: do not create a record if UF_CRM_AMO_ID already exists in Bitrix24.
$existing = $b24->call('crm.deal.list', [
'filter' => ['UF_CRM_AMO_ID' => $amoLead['id']],
'select' => ['ID'],
]);
if (!empty($existing['result'])) {
continue; // Already migrated
}
Results Validation
| Metric | Verification Method |
|---|---|
| Contact count | amoCRM count vs B24 crm.contact.list |
| Deal count | Comparison by pipeline/funnel |
| Custom fields | Spot-check 50 records |
| Notes | Timeline for 10–15 deals |
Timelines
| Data Volume | Timeline |
|---|---|
| Up to 3,000 contacts and deals | 1–2 weeks |
| 3,000–20,000 records + custom fields | 3–5 weeks |
| 20,000+ records + call and task history | 2–3 months |
Switching from amoCRM to Bitrix24 is a paradigm shift for the team. In parallel with data migration, training on new business processes is required — a task no less important than the technical transfer.

