---
title: "Sử dụng ThunderPhone với n8n"
description: "Cài đặt node ThunderPhone cho n8n, kết nối khóa API máy chủ và xây dựng workflow chạy mỗi khi cuộc gọi kết thúc."
---

[n8n](https://n8n.io) là công cụ tự động hóa quy trình làm việc. Gói ThunderPhone
dành cho n8n bổ sung hai node:

- **ThunderPhone Trigger** khởi chạy quy trình làm việc khi cuộc gọi kết thúc (**Cuộc gọi hoàn tất**) hoặc khi lượt chấm điểm cuộc gọi hoàn tất (**Cuộc gọi đã được chấm điểm**).
- **ThunderPhone** thực hiện cuộc gọi đi, thêm liên hệ vào chiến dịch và khởi động chiến dịch, lấy cuộc gọi kèm bản chép lời và bản ghi âm, đồng thời liệt kê tác nhân AI và số điện thoại của bạn.

Đây là node cộng đồng đã được xác minh, được liệt kê tại
[ThunderPhone trên n8n](https://n8n.io/integrations/thunderphone/).

## Cài đặt node

Trong trình chỉnh sửa n8n, nhấp **+** để mở bảng node và tìm kiếm
**ThunderPhone**. Chủ sở hữu phiên bản có thể cần thiết lập các node đã được xác minh trước khi người dùng khác có thể thêm chúng.

Trên n8n tự lưu trữ, bạn cũng có thể cài đặt theo tên gói: mở
**Cài đặt > Node cộng đồng** và cài đặt `n8n-nodes-thunderphone`. Kiểm tra rủi ro của node cộng đồng và chính sách phiên bản của bạn
trước khi cài đặt.

## Tạo khóa API máy chủ

<Steps>
  <Step title="Mở tab Khóa">
    Trong ThunderPhone, đi tới **Tổ chức → Khóa** và nhấp **Tạo khóa**.
  </Step>
  <Step title="Đặt tên">
    Dùng tên cho biết khóa được dùng ở đâu, chẳng hạn như "n8n".
  </Step>
  <Step title="Sao chép ngay">
    Bí mật `sk_live_...` đầy đủ chỉ hiển thị một lần. Sao chép trước khi bạn đóng
    hộp thoại.
  </Step>
</Steps>

Chỉ quản trị viên hoặc chủ sở hữu mới có thể tạo khóa, và ThunderPhone coi các yêu cầu
được thực hiện bằng khóa này là đến từ người đó. Trigger và các thao tác chiến dịch
yêu cầu người đó duy trì vai trò quản trị viên hoặc chủ sở hữu.
[Tạo khóa API máy chủ](/vi/guides/api-keys) hướng dẫn về xoay vòng và thu hồi khóa.

## Thêm thông tin xác thực trong n8n

1. Trong n8n, tạo thông tin xác thực thuộc loại **ThunderPhone API**.
2. Dán khóa vào **Khóa API**.
3. Lưu và chạy kiểm tra thông tin xác thực. Bài kiểm tra sẽ đọc một cuộc gọi từ
   tổ chức của bạn bằng `GET /v1/calls?limit=1`.

## Xây dựng workflow đầu tiên

Workflow này thêm một hàng vào Google Sheet mỗi khi cuộc gọi kết thúc.

<Steps>
  <Step title="Thêm trigger">
    Thêm **ThunderPhone Trigger**, chọn thông tin xác thực API ThunderPhone của bạn,
    rồi đặt **Sự kiện** thành **Cuộc gọi hoàn tất**.
  </Step>
  <Step title="Lấy cuộc gọi">
    Thêm một node **ThunderPhone**. Đặt **Tài nguyên** thành **Cuộc gọi**, **Thao tác**
    thành **Lấy**, và **ID cuộc gọi** thành biểu thức `{{ $json.data.call_id }}`.
    Đầu ra là [bản ghi cuộc gọi](/api-reference/calls) cùng với `transcripts`
    và `recording_url`, một liên kết có thời hạn ngắn sẽ là `null` khi cuộc gọi
    không có bản ghi âm.
  </Step>
  <Step title="Thêm một hàng">
    Thêm một node Google Sheets để thêm một hàng, rồi ánh xạ các cột bạn muốn
    từ đầu ra Lấy cuộc gọi (xem bảng bên dưới).
  </Step>
  <Step title="Kích hoạt workflow">
    Lưu và kích hoạt. Trigger đăng ký URL Production của nó làm endpoint webhook
    trong tổ chức ThunderPhone của bạn. Việc hủy kích hoạt workflow sẽ xóa
    endpoint đó.
  </Step>
  <Step title="Kiểm tra">
    Mở một tác nhân AI trong builder, nhấp **Trò chuyện**, rồi kết thúc cuộc gọi. Các
    cuộc gọi kiểm tra trong builder được gửi dưới dạng `web.complete`, một trong hai sự kiện
    thuộc Cuộc gọi hoàn tất, nên workflow chạy và một hàng xuất hiện.
  </Step>
</Steps>

Các cột hữu ích:

| Cột | Biểu thức |
|---|---|
| ID cuộc gọi | `{{ $json.call_id }}` |
| Hướng | `{{ $json.direction }}` |
| Từ | `{{ $json.from_number }}` |
| Đến | `{{ $json.to_number }}` |
| Bắt đầu | `{{ $json.start_time }}` |
| Thời lượng (giây) | `{{ $json.duration_seconds }}` |
| Trạng thái | `{{ $json.status }}` |
| Lý do kết thúc | `{{ $json.end_reason }}` |
| Liên kết cuộc gọi | `https://app.thunderphone.com/dashboard/call-history/{{ $json.call_id }}` |

Liên kết cuộc gọi mở cuộc gọi trong bảng điều khiển ThunderPhone cho các thành viên
trong tổ chức của bạn, kèm bản chép lời và bản ghi âm, nên bảng tính không cần
lưu cả hai.

Để vẫn thêm bản chép lời, hãy ánh xạ
`{{ $json.transcripts.filter(t => typeof t.content === 'string').map(t => t.role + ': ' + t.content).join('\n') }}`.
URL bản ghi âm sẽ hết hạn, vì vậy hãy lưu ID cuộc gọi và chạy lại Lấy cuộc gọi khi
bạn cần liên kết mới. Bản chép lời, bản tóm tắt và bản ghi âm cuộc gọi có thể chứa
thông tin cá nhân hoặc thông tin sức khỏe. Chỉ gửi chúng đến các ứng dụng mà tổ chức
của bạn được phép sử dụng cho dữ liệu đó, theo BAA khi có liên quan đến thông tin
sức khỏe, và chỉ lưu các trường bạn cần.

<Note>
  ThunderPhone gửi sự kiện bằng `POST` đến **URL Production** của trigger, vì vậy
  phiên bản n8n của bạn phải có thể truy cập qua HTTPS từ internet và workflow
  phải đang hoạt động. Trigger xác minh HMAC `X-ThunderPhone-Signature` trên mọi
  yêu cầu và trả lời `401` cho mọi yêu cầu không có chữ ký hoặc không hợp lệ.
</Note>

Trigger xuất toàn bộ sự kiện: `type`, `event_id` và `data`. Xem
[`telephony.complete` / `web.complete`](/vi/webhooks/call-complete) và
[`call.graded`](/vi/webhooks/events) để biết mọi trường. Việc gửi được đảm bảo ít nhất một lần,
và `event_id` giữ nguyên qua các lần thử lại của một sự kiện, vì vậy hãy kiểm tra
nó trước bước không được phép lặp lại.

## Thực hiện cuộc gọi đi an toàn

**Thực hiện cuộc gọi đi** (Tài nguyên **Cuộc gọi đi**, Hoạt động **Thực hiện**)
nhận:

| Trường | Ý nghĩa |
|---|---|
| Tên hoặc ID tác nhân AI | Một tác nhân AI đã lưu. Danh sách thả xuống liệt kê các tác nhân AI của bạn. |
| Tên hoặc ID số điện thoại | Số gọi đi. Danh sách thả xuống chỉ liệt kê các số đã bật cuộc gọi đi. |
| Số nhận | Số đích ở định dạng E.164, ví dụ: `+14155552671`. |
| Biến | Đối tượng JSON gồm các giá trị cho chỗ giữ chỗ trong prompt của tác nhân AI. |
| Khóa Idempotency | ID ổn định từ bản ghi hoặc sự kiện ở nguồn trên. Bắt buộc. |

Ánh xạ **Khóa Idempotency** tới một ID từ bất kỳ yếu tố nào đã gây ra lần chạy, chẳng hạn như
ID bản ghi CRM hoặc `event_id` của trình kích hoạt. Nút gửi
`n8n:<node ID>:<your value>`, do đó:

- Lần thử lại tự động hoặc **Thử lại lần thực thi** gửi cùng một khóa, và
  ThunderPhone trả về cuộc gọi ban đầu với `idempotent_replay: true`
  thay vì quay số lại.
- Hai nút ThunderPhone nhận cùng một bản ghi sẽ gửi các khóa khác nhau.
- Giá trị trống sẽ thất bại trước khi bất kỳ yêu cầu nào được gửi.

Tránh dùng dấu thời gian, giá trị ngẫu nhiên và ID lần thực thi hoặc workflow của n8n. Giá trị mới
khi thử lại sẽ thực hiện cuộc gọi thực thứ hai. Toàn bộ khóa có thể dài tối đa 128
ký tự. Dùng lại một khóa với tác nhân AI, số điện thoại hoặc biến khác sẽ thất bại
do xung đột.

**Chiến dịch.** **Thêm liên hệ** (Tài nguyên **Chiến dịch**) thêm liên hệ vào
một chiến dịch nháp. Tác vụ này nhận ID chiến dịch và một mảng JSON các liên hệ. Mỗi liên hệ cần `phone_number`; các khóa khác
trở thành biến cuộc gọi. Nút sẽ thất bại khi mọi liên hệ đều bị từ chối và đặt
`partial_success: true` khi chỉ một số liên hệ bị từ chối. **Bắt đầu** yêu cầu chọn hộp kiểm
xác nhận rằng chiến dịch thực hiện cuộc gọi thực và sử dụng credit ThunderPhone.
Xem [Chiến dịch gọi đi](/vi/guides/outbound-campaigns).

Trước khi một workflow bắt đầu thực hiện cuộc gọi:

- Nếu ThunderPhone yêu cầu tổ chức của bạn xác nhận rằng các cuộc gọi đi
  tuân thủ TCPA và các luật gọi điện khác, quản trị viên phải ghi nhận
  xác nhận đó trong bảng điều khiển trước.
- Số gọi đi phải được bật cho cuộc gọi đi. Các số bạn mang từ
  nhà mạng của mình đủ điều kiện sau khi được xác minh. Số ThunderPhone ban đầu
  chỉ nhận cuộc gọi đến và có thể được phê duyệt để dùng cho cuộc gọi đi: quản trị viên yêu cầu việc này
  từ trang Số điện thoại. Xem
  [Lấy số điện thoại](/vi/guides/get-a-phone-number).
- Tổ chức của bạn chịu trách nhiệm bảo đảm có sự đồng ý để gọi đến từng số
  và tuân thủ các luật gọi điện áp dụng. Xem
  [Luật gọi điện đi](/vi/guides/outbound-calling-laws).

## Workflow mẫu

- **Liên hệ CRM vào chiến dịch.** Thêm liên hệ CRM vào một chiến dịch ThunderPhone
  nháp, sau đó bắt đầu chiến dịch khi có người phê duyệt danh sách.
- **Cuộc gọi hoàn tất vào bản ghi khách hàng.** Khi Cuộc gọi hoàn tất, chạy Lấy cuộc gọi
  và lưu bản chép lời cùng liên kết bản ghi âm vào bản ghi khách hàng tương ứng.
- **Điểm thấp để xem xét.** Khi Cuộc gọi được chấm điểm, lọc theo
  `{{ $json.data.grade.score }}` và chuyển các cuộc gọi có điểm thấp đến hàng đợi xem xét
  kèm ID cuộc gọi và chi tiết điểm đánh giá. Một cuộc gọi có thể được chấm điểm nhiều lần,
  và mỗi lần chạy chấm điểm hoàn tất sẽ kích hoạt trình kích hoạt, vì vậy chỉ giữ lại
  `graded_at` mới nhất cho mỗi ID cuộc gọi.

Bản chép lời, bản tóm tắt và bản ghi âm cuộc gọi có thể chứa thông tin cá nhân hoặc
thông tin sức khỏe. Chỉ gửi chúng đến các ứng dụng mà tổ chức của bạn được phép sử dụng
cho dữ liệu đó, theo BAA khi có liên quan đến thông tin sức khỏe, và chỉ giữ lại
các trường bạn cần.

<Note>
  Gửi cùng các sự kiện cuộc gọi đến máy chủ của riêng bạn thay vào đó? Xem
  [Điểm cuối webhook](/vi/webhooks/endpoints).
  [Thực hiện cuộc gọi đi](/vi/guides/place-outbound-calls) trình bày API phía sau
  Thực hiện cuộc gọi đi.
</Note>
