DaData и n8n: нормализация телефонов, адресов и реквизитов перед CRM ¶
Обновлено: 2026-05-30
Импортируйте JSON в n8n, замените credentials, URL API, поля CRM/БД и лимиты под вашу инфраструктуру.
Проблема: формы, CRM и таблицы часто получают телефоны в разных форматах, адреса без индекса, email с пробелами и реквизиты без проверки. В итоге менеджеры вручную исправляют карточки, доставка ошибается, а аналитика не может нормально группировать лиды.
Решение: ставим DaData как слой качества данных в n8n: сохраняем raw-поля, отправляем их в clean/suggest API, проверяем quality codes, нормализуем телефон/email/адрес/ИНН и только после этого обновляем CRM или таблицу.
Проблема: почему CRM без нормализации DaData быстро загрязняется ¶
Главная ошибка — перезаписывать исходные данные очищенными без контроля качества. DaData может вернуть нормализованное значение, но вместе с ним нужно учитывать qc, qc_geo, полноту адреса и уверенность в распознавании. Иначе workflow красиво заполнит CRM, но фактически закрепит ошибку.
Вторая проблема — смешивать enrichment с дедупликацией. Нормализованный телефон помогает искать дубль, но решение о создании или обновлении карточки должно быть отдельным бизнес-правилом. Поэтому интеграция DaData и n8n должна возвращать не просто “красивый адрес”, а понятный объект качества данных.
Архитектура workflow DaData → n8n → CRM ¶
| Блок | Задача | Production-проверка |
|---|---|---|
| Webhook / CRM trigger | получает сырой лид из формы, CRM или таблицы | raw-поля сохраняются отдельно |
| Prepare DaData request | собирает phone/email/address/inn | пустые поля не отправляются в API |
| DaData clean/suggest | нормализует данные и возвращает quality codes | таймаут, токен, лимиты, статус 4xx/5xx |
| Quality gate | решает auto-update или manual review | qc/qc_geo, confidence, обязательные поля |
| Update CRM | пишет normalized-поля и raw-поля | отдельные custom fields, история изменений |
| Audit and retry | логирует исход, ошибки и attempts | alert при 401/429/5xx |
Для B2B-лидов отдельно храните ИНН/КПП и название организации из DaData. Для B2C важнее нормализованный телефон, email и адрес доставки.
Контракт входных данных для обогащения лида ¶
{
"lead_id": "crm-10492",
"name": "ООО Ромашка",
"phone": "8 (916) 123-45-67",
"email": " SALES@EXAMPLE.RU ",
"address": "москва тверская 7",
"inn": "7707083893",
"source": "tilda"
}
Не удаляйте raw-поля. Если клиент указал “корпус 2, вход со двора”, эта информация может быть важнее идеальной формальной строки адреса.
Code Node: подготовка запроса в DaData и проверка качества ¶
const src = $json.body ?? $json;
const rawPhone = String(src.phone ?? '').trim();
const rawEmail = String(src.email ?? '').trim();
const rawAddress = String(src.address ?? '').trim();
const inn = String(src.inn ?? '').replace(/\D/g, '');
const phoneDigits = rawPhone.replace(/\D/g, '');
if (!phoneDigits && !rawEmail && !rawAddress && !inn) {
throw new Error('No fields for DaData enrichment');
}
return [{ json: {
lead_id: String(src.lead_id ?? ''),
raw: { phone: rawPhone, email: rawEmail, address: rawAddress, inn, name: src.name ?? '' },
dadata: {
phone: phoneDigits ? [rawPhone] : [],
email: rawEmail ? [rawEmail.toLowerCase()] : [],
address: rawAddress ? [rawAddress] : [],
party_query: inn || String(src.name ?? '').trim()
},
quality_policy: { auto_update_qc_max: 1, require_phone: true, manual_review_on_qc_geo: [3,4,5] },
dedupe_key: phoneDigits ? `phone:${phoneDigits}` : `email:${rawEmail.toLowerCase()}`
}}];
Почему raw и normalized нужно хранить рядом
Raw помогает расследовать спорные случаи и восстановить контекст заявки. Normalized нужен для поиска дублей, аналитики, доставки и автоматических правил. Перезапись без raw-поля делает ошибку необратимой.
Готовый workflow JSON: скачать и импортировать ¶
Скачать готовый workflow JSON Скачать тестовый payload
{
"name": "Nodbot - DaData enrichment before CRM update",
"nodes": [
{
"name": "Webhook lead input",
"type": "n8n-nodes-base.webhook",
"purpose": "Принять сырой лид"
},
{
"name": "Prepare DaData request",
"type": "n8n-nodes-base.code",
"purpose": "Собрать clean/suggest request"
},
{
"name": "Call DaData API",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Получить нормализованные данные"
},
{
"name": "Quality gate",
"type": "n8n-nodes-base.if",
"purpose": "Проверить qc и полноту"
},
{
"name": "Update CRM fields",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Записать normalized и raw"
},
{
"name": "Respond",
"type": "n8n-nodes-base.respondToWebhook",
"purpose": "Вернуть итог"
}
],
"connections": "Webhook lead input → Prepare DaData request → Call DaData API → Quality gate → Update CRM fields → Respond"
}
Пошаговая настройка DaData API, n8n и CRM-полей ¶
- Создайте DaData API token и храните его в credentials или ENV.
- Определите, какие поля CRM будут raw, а какие normalized.
- Импортируйте workflow JSON и настройте endpoint DaData под clean или suggest API.
- Настройте quality gate: что обновлять автоматически, а что отдавать на ручную проверку.
- Проверьте лимиты API и alert на 401, 429 и 5xx.
Тесты перед production ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/integration-dadata-n8n" \
-H "Content-Type: application/json" \
--data @integration-dadata-n8n-payload.json
- Телефон в формате 8, +7, пробелы и скобки.
- Email с пробелами и верхним регистром.
- Адрес без индекса и с опечаткой.
- ИНН организации и название без ИНН.
- DaData вернул низкий quality code или пустой результат.
Production-риски ¶
- Перезаписали raw-адрес. Курьерский комментарий или уточнение клиента потерялись.
- Не проверили quality codes. CRM получила красивое, но неверное значение.
- DaData используется для дедупликации без бизнес-правил. Похожие записи могут быть ошибочно объединены.
- Токен в Code Node. API token должен быть в credentials/ENV.
- Нет backoff. При лимитах API workflow начинает падать пачками.
Полезные ссылки и смежные материалы ¶
- DaData Clean API
- DaData Suggest API
- Workflow: обогащение лида через DaData
- Интеграция amoCRM и n8n
- Интеграция Битрикс24 и n8n
Критерии готовности ¶
- Raw и normalized-поля разделены.
- Quality gate не пропускает сомнительные значения автоматически.
- Ошибки DaData логируются и отправляются в alert.
- CRM-дедупликация использует нормализованный телефон/email, но не объединяет записи без правила.
- У workflow есть тестовый payload и владелец полей.
Nodbot настроит DaData + n8n: clean/suggest API, quality gate, raw/normalized-поля, дедупликацию и alert-ы по ошибкам.
Обсудить очистку данных