> ## Documentation Index
> Fetch the complete documentation index at: https://chatbotx.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Execute JavaScript Code

> Chạy JavaScript trong Flow ChatbotX để tính toán, kiểm tra, chuẩn hóa dữ liệu và lưu kết quả vào Custom Field.

**Execute JavaScript Code** cho phép bạn xử lý dữ liệu ngay trong Flow bằng JavaScript. Tính năng này phù hợp khi cần thực hiện phép tính, kiểm tra dữ liệu, phân loại khách hàng hoặc đọc một giá trị JSON mà không cần gửi dữ liệu sang hệ thống khác.

## Cách hoạt động

Trong mã JavaScript, bạn có thể sử dụng dữ liệu của khách hàng bằng cú pháp `{{field_name}}`. Thay `field_name` bằng tên của [Custom Field](/docs/vi/automation/custom-fields) hoặc [System Field](/docs/vi/automation/system-fields) cần dùng.

```javascript theme={null}
let age = {{user_age}};
let firstName = "{{first_name}}";
```

* Với số, bạn có thể đặt biến trực tiếp như `let age = {{user_age}};`.
* Với văn bản, hãy đặt biến trong dấu ngoặc kép như `let name = "{{first_name}}";`.
* Mã phải có `return` để trả kết quả về Flow.
* Chọn **Output Custom Field** nếu muốn lưu kết quả để dùng ở bước tiếp theo.

<Warning>
  Action này chỉ chạy JavaScript thuần. Bạn không thể truy cập mạng, tệp, API hoặc thư viện bên ngoài. Để gọi một API, hãy sử dụng [External API Request](/docs/vi/automation/external-api-request).
</Warning>

## Thêm Action vào Flow

<Steps>
  <Step title="Mở Flow cần xử lý dữ liệu">
    Vào **Flows**, mở Flow cần chỉnh sửa, sau đó tạo hoặc chọn node **Perform Action**.
  </Step>

  <Step title="Chọn Execute JavaScript Code">
    Trong menu Action, chọn **Tools** rồi chọn **Execute JavaScript Code**.

    <Frame>
      <img src="https://mintcdn.com/chatbotx/Wq4MztYRduMVonzp/images/select_execute_javascript_code_in_tools_menu.png?fit=max&auto=format&n=Wq4MztYRduMVonzp&q=85&s=1bc82dec8bccfed61491f69482a7edb1" alt="Select Execute Javascript Code In Tools Menu" width="3192" height="1826" data-path="images/select_execute_javascript_code_in_tools_menu.png" />
    </Frame>
  </Step>

  <Step title="Nhập mã JavaScript">
    Nhập mã vào ô **JavaScript code**. Đảm bảo đoạn mã kết thúc bằng `return`.
  </Step>

  <Step title="Lưu kết quả">
    Trong **Output Custom Field**, chọn trường sẽ nhận kết quả rồi nhấn **Save**.

    <Frame>
      <img src="https://mintcdn.com/chatbotx/Wq4MztYRduMVonzp/images/configure_execute_javascript_code_action.png?fit=max&auto=format&n=Wq4MztYRduMVonzp&q=85&s=0b66acbe91c6907132fc77a8fa651ef1" alt="Configure Execute Javascript Code Action" width="3191" height="1823" data-path="images/configure_execute_javascript_code_action.png" />
    </Frame>
  </Step>
</Steps>

## Ví dụ thực tế

### Tính số tiền sau giảm giá

Ví dụ đơn hàng có tổng tiền trong `order_total` và phần trăm giảm giá trong `discount_percent`:

```javascript theme={null}
let total = {{order_total}};
let discount = {{discount_percent}};

return Math.round(total - total * discount / 100);
```

Lưu kết quả vào Custom Field dạng số như `final_total`. Bạn có thể dùng `{{final_total}}` trong tin nhắn xác nhận đơn hàng.

### Tính phí giao hàng theo khu vực

Ví dụ miễn phí giao hàng cho đơn từ 500.000, thu 30.000 tại Hà Nội hoặc Thành phố Hồ Chí Minh và 45.000 cho khu vực khác:

```javascript theme={null}
let province = "{{province}}".trim().toLowerCase();
let total = {{order_total}};

if (total >= 500000) return 0;

let innerCity = ["hà nội", "ha noi", "hồ chí minh", "ho chi minh"];
return innerCity.includes(province) ? 30000 : 45000;
```

Lưu kết quả vào `shipping_fee`, sau đó cộng với giá trị đơn hàng hoặc hiển thị phí giao hàng cho khách.

### Phân loại khách hàng

Ví dụ phân khách có tổng giá trị mua hàng từ 1.000.000 vào nhóm `vip`:

```javascript theme={null}
let totalSpent = {{total_spent}};

return totalSpent >= 1000000 ? "vip" : "standard";
```

Lưu kết quả vào `customer_level`, sau đó dùng node **Condition** để chuyển khách VIP sang ưu đãi hoặc kịch bản chăm sóc riêng.

### Kiểm tra địa chỉ email

```javascript theme={null}
let email = "{{email}}".trim();
let isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);

return isValid ? "valid" : "invalid";
```

Lưu kết quả vào `email_status`. Nếu giá trị là `invalid`, dùng **Condition** để yêu cầu khách nhập lại email.

### Lấy tổng tiền từ dữ liệu JSON

Ví dụ Custom Field `order_json` đang lưu nội dung như `{"total":750000,"status":"paid"}`:

```javascript theme={null}
let jsonText = `{{order_json}}`;

try {
  let order = JSON.parse(jsonText);
  return Number(order.total || 0);
} catch (error) {
  return 0;
}
```

Lưu kết quả vào `order_total`. Giá trị `0` giúp Flow vẫn tiếp tục nếu dữ liệu JSON không hợp lệ hoặc không có thuộc tính `total`.

## Sử dụng kết quả trong Flow

Sau khi Action chạy, giá trị trả về được lưu vào **Output Custom Field** đã chọn. Bạn có thể:

* Chèn trường đó vào tin nhắn, ví dụ `Tổng thanh toán của bạn là {{final_total}}`.
* Dùng node **Condition** để chia nhánh dựa trên kết quả.
* Truyền kết quả sang một Action khác để tiếp tục tính toán hoặc cập nhật dữ liệu.

## Lưu ý khi viết mã

* Kiểm tra đúng tên trường được đặt trong `{{...}}`.
* Đặt giá trị văn bản trong dấu ngoặc kép, nhưng không đặt số trong dấu ngoặc kép nếu cần tính toán trực tiếp.
* Luôn có câu lệnh `return`.
* Với JSON hoặc dữ liệu có thể không hợp lệ, dùng `try...catch` và trả về một giá trị dự phòng.
* Chạy thử Flow với một liên hệ kiểm tra trước khi sử dụng cho khách hàng.
