Migrating data from AmoCRM to Bitrix24

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

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.