ezCloud CRM · API nhận lead từ website

Tài liệu cho lập trình viên website gửi form đăng ký vào CRM.

Tổng quan

Không đặt khoá trong HTML/JavaScript gửi xuống trình duyệt. Ai có khoá đều tạo được lead.

Endpoint

POSThttps://form.crm.ezcloud.vn/api/v1/public/lead-forms/{mã form}/submissions

HeaderGiá trị
AuthorizationBearer <khoá form>
Content-Typeapplication/json

Nội dung gửi

{
  "name": "Nguyễn Văn An",
  "email": "an@example.com",
  "phone": "0912345678",
  "message": "Khách sạn 20 phòng ở Đà Nẵng",
  "pageUrl": "https://ezcloud.vn/dang-ky-dung-thu?utm_source=google",
  "utm": { "source": "google", "medium": "cpc", "campaign": "brand", "content": "", "term": "" },
  "fields": { "Số phòng": "20" },
  "submissionId": "wp-6721f0c3a1b2"
}
TrườngKiểuMô tả
namechuỗi ≤ 200Họ tên khách. Tiêu đề lead = tiền tố của form + họ tên.
emailchuỗi ≤ 200Bắt buộc có ít nhất một trong hai.
phonechuỗi ≤ 50
messagechuỗi ≤ 5000Lời nhắn / ghi chú của khách.
pageUrlchuỗi ≤ 2000Trang khách điền form (kèm tham số quảng cáo nếu có).
utmobjectsource, medium, campaign, content, term — đều tuỳ chọn.
fieldsobject chuỗi → chuỗiCác trường khác của form; hiện nguyên văn trên lead.
submissionIdchuỗi ≤ 100Mã lượt gửi do website tự sinh. Gửi lại cùng mã (khi retry) không tạo lead thứ hai.

Phản hồi

HTTPNội dungÝ nghĩa
201{"status":"created","submissionId":123}Đã tạo lead.
201{"status":"duplicate","submissionId":123}submissionId này đã được nhận trước đó.
401INVALID_FORM_KEYSai mã form hoặc khoá.
403FORM_INACTIVEForm đang tắt trên CRM.
422VALIDATION_FAILEDDữ liệu không hợp lệ (thiếu email/SĐT, quá dài …). Không retry.
429Gửi quá nhanh; thử lại sau ít giây.

Giới hạn: 64 KB mỗi request, khoảng 60 lượt/phút mỗi form. Nên đặt timeout ~8 giây và retry 1 lần khi lỗi mạng / 5xx / 429, dùng cùng submissionId.

Thử bằng curl

curl -sS https://form.crm.ezcloud.vn/api/v1/public/lead-forms/bitrix-21/submissions \
  -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
  -d '{"name":"Test CRM","email":"test@ezcloud.vn","pageUrl":"https://ezcloud.vn/test"}'

WordPress + Elementor Pro

1. Thêm cấu hình vào wp-config.php:

define('EZCRM_FORM_URL', 'https://form.crm.ezcloud.vn/api/v1/public/lead-forms');
// giá trị trường ẩn bitrix_form => [mã form CRM, khoá]
// giữ nguyên ID form và mã sec đang dùng với Bitrix: mã CRM = 'bitrix-<ID>', khoá = sec
define('EZCRM_FORMS', [
  'form_dang_ky_dung_thu'  => ['bitrix-21', '<sec form Bitrix 21>'],
  'popup_dang_ky_dung_thu' => ['bitrix-15', '<sec form Bitrix 15>'],
]);

2. Tạo file wp-content/mu-plugins/ezcrm-lead-form.php. Đoạn mã đọc các trường Elementor đang có (form_name, popup_header_phone, bitrix_form, current_url, utm_* …), không cần sửa form:

<?php
/** Gửi lead từ form Elementor sang ezCloud CRM (https://form.crm.ezcloud.vn/). */
add_action('elementor_pro/forms/new_record', function ($record, $handler) {
  if (!defined('EZCRM_FORMS') || !defined('EZCRM_FORM_URL')) return;
  $raw = $record->get('fields');
  $f = [];
  foreach ($raw as $id => $field) $f[$id] = trim((string) ($field['value'] ?? ''));

  $target = EZCRM_FORMS[$f['bitrix_form'] ?? ''] ?? null;
  if (!$target) return; // form không gửi CRM
  [$code, $key] = $target;

  // Lấy giá trị đầu tiên khác rỗng theo hậu tố id trường: form_name, popup_header_name, popup_name, name …
  $pick = function (string $suffix) use ($f) {
    foreach ($f as $id => $v) if ($v !== '' && ($id === $suffix || str_ends_with($id, '_' . $suffix))) return $v;
    return null;
  };
  $known = ['bitrix_form', 'current_url', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'];
  $extra = [];
  foreach ($raw as $id => $field) {
    $v = $f[$id];
    if ($v === '' || in_array($id, $known, true) || preg_match('/(^|_)(name|email|phone)$/', $id)) continue;
    $extra[$field['title'] ?: $id] = $v;
  }

  $body = [
    'name'         => $pick('name'),
    'email'        => $pick('email'),
    'phone'        => $pick('phone'),
    'pageUrl'      => $f['current_url'] ?? null,
    'utm'          => [
      'source'   => $f['utm_source'] ?? null,   'medium' => $f['utm_medium'] ?? null,
      'campaign' => $f['utm_campaign'] ?? null, 'content' => $f['utm_content'] ?? null,
      'term'     => $f['utm_term'] ?? null,
    ],
    'fields'       => (object) $extra,
    'submissionId' => 'wp-' . wp_generate_uuid4(),
  ];
  $args = [
    'timeout' => 8,
    'headers' => ['Authorization' => 'Bearer ' . $key, 'Content-Type' => 'application/json'],
    'body'    => wp_json_encode($body),
  ];
  $url = EZCRM_FORM_URL . '/' . rawurlencode($code) . '/submissions';
  for ($try = 1; $try <= 2; $try++) {   // retry an toàn nhờ submissionId
    $res = wp_remote_post($url, $args);
    $status = is_wp_error($res) ? 0 : wp_remote_retrieve_response_code($res);
    if ($status >= 200 && $status < 300) return;
    if ($status >= 400 && $status < 500 && $status !== 429) break; // lỗi dữ liệu/khoá: không retry
  }
  error_log('[ezcrm] gửi lead lỗi ' . $code . ': ' . (is_wp_error($res) ? $res->get_error_message() : $status . ' ' . wp_remote_retrieve_body($res)));
}, 10, 2);

Khi bật đoạn mã này, tắt đoạn mã đang gửi sang Bitrix24 (crm.site.form.fill) để không tạo lead trùng. Để EZCRM_FORMS rỗng ([]) là tạm ngừng gửi.