---
title: "Gunakan ThunderPhone dengan n8n"
description: "Instal node ThunderPhone untuk n8n, hubungkan kunci API server, dan buat alur kerja yang berjalan setiap kali panggilan berakhir."
---

[n8n](https://n8n.io) adalah alat otomatisasi alur kerja. Paket ThunderPhone
untuk n8n menambahkan dua node:

- **ThunderPhone Trigger** memulai alur kerja saat panggilan berakhir (**Panggilan
  Selesai**) atau proses penilaian panggilan selesai (**Panggilan Dinilai**).
- **ThunderPhone** melakukan panggilan keluar, menambahkan kontak ke kampanye dan
  memulainya, mengambil panggilan beserta transkrip dan rekamannya, serta mencantumkan
  agen dan nomor telepon Anda.

Ini adalah node komunitas terverifikasi, yang tercantum di
[ThunderPhone di n8n](https://n8n.io/integrations/thunderphone/).

## Instal node

Di editor n8n, klik **+** untuk membuka panel node lalu cari
**ThunderPhone**. Pemilik instans mungkin perlu menyiapkan node terverifikasi
sebelum pengguna lain dapat menambahkannya.

Pada n8n yang dihosting sendiri, Anda juga dapat menginstal berdasarkan nama paket: buka
**Pengaturan > Node Komunitas** lalu instal `n8n-nodes-thunderphone`. Periksa risiko node komunitas dan kebijakan instans Anda
sebelum menginstal.

## Buat kunci API server

<Steps>
  <Step title="Buka tab Kunci">
    Di ThunderPhone, buka **Organisasi → Kunci** lalu klik **Buat kunci**.
  </Step>
  <Step title="Beri nama">
    Gunakan nama yang menunjukkan lokasi kunci, seperti "n8n".
  </Step>
  <Step title="Salin sekarang">
    Rahasia `sk_live_...` lengkap hanya ditampilkan sekali. Salin sebelum Anda menutup
    dialog.
  </Step>
</Steps>

Hanya admin atau pemilik yang dapat membuat kunci, dan ThunderPhone memperlakukan permintaan
yang dibuat dengan kunci tersebut sebagai berasal dari orang itu. Trigger dan operasi
kampanye mengharuskan orang tersebut tetap memiliki peran admin atau pemilik.
[Buat kunci API server](/id/guides/api-keys) membahas rotasi dan pencabutan.

## Tambahkan kredensial di n8n

1. Di n8n, buat kredensial bertipe **ThunderPhone API**.
2. Tempelkan kunci ke **Kunci API**.
3. Simpan lalu jalankan pengujian kredensial. Pengujian membaca satu panggilan dari
   organisasi Anda dengan `GET /v1/calls?limit=1`.

## Buat workflow pertama

Workflow ini menambahkan satu baris ke Google Sheet setiap kali panggilan berakhir.

<Steps>
  <Step title="Tambahkan pemicu">
    Tambahkan **ThunderPhone Trigger**, pilih kredensial API ThunderPhone Anda, dan
    tetapkan **Event** ke **Panggilan Selesai**.
  </Step>
  <Step title="Dapatkan panggilan">
    Tambahkan node **ThunderPhone**. Tetapkan **Sumber Daya** ke **Panggilan**, **Operasi**
    ke **Dapatkan**, dan **ID Panggilan** ke ekspresi `{{ $json.data.call_id }}`.
    Outputnya adalah [catatan panggilan](/api-reference/calls) beserta `transcripts`
    dan `recording_url`, tautan berumur singkat yang bernilai `null` saat panggilan
    tidak memiliki rekaman.
  </Step>
  <Step title="Tambahkan baris">
    Tambahkan node Google Sheets yang menambahkan satu baris, lalu petakan kolom yang Anda inginkan
    dari output Dapatkan Panggilan (lihat tabel di bawah).
  </Step>
  <Step title="Aktifkan workflow">
    Simpan dan aktifkan. Pemicu mendaftarkan URL Produksinya sebagai endpoint webhook
    di organisasi ThunderPhone Anda. Menonaktifkan workflow akan
    menghapus endpoint tersebut.
  </Step>
  <Step title="Uji">
    Buka agen di builder, klik **Bicara**, lalu akhiri panggilan. Panggilan
    pengujian builder dikirim sebagai `web.complete`, salah satu dari dua event di balik
    Panggilan Selesai, sehingga workflow berjalan dan satu baris muncul.
  </Step>
</Steps>

Kolom yang berguna:

| Kolom | Ekspresi |
|---|---|
| ID Panggilan | `{{ $json.call_id }}` |
| Arah | `{{ $json.direction }}` |
| Dari | `{{ $json.from_number }}` |
| Ke | `{{ $json.to_number }}` |
| Dimulai | `{{ $json.start_time }}` |
| Durasi (d) | `{{ $json.duration_seconds }}` |
| Status | `{{ $json.status }}` |
| Alasan berakhir | `{{ $json.end_reason }}` |
| Tautan panggilan | `https://app.thunderphone.com/dashboard/call-history/{{ $json.call_id }}` |

Tautan panggilan membuka panggilan di dasbor ThunderPhone bagi anggota
organisasi Anda, beserta transkrip dan rekamannya, sehingga sheet tidak
perlu menyimpan keduanya.

Untuk tetap menambahkan transkrip, petakan
`{{ $json.transcripts.filter(t => typeof t.content === 'string').map(t => t.role + ': ' + t.content).join('\n') }}`.
URL rekaman akan kedaluwarsa, jadi simpan ID panggilan dan jalankan Dapatkan Panggilan lagi saat
Anda memerlukan tautan baru. Transkrip, ringkasan, dan rekaman panggilan dapat berisi
informasi pribadi atau kesehatan. Kirimkan hanya ke aplikasi yang diizinkan
organisasi Anda untuk menggunakan data tersebut, berdasarkan BAA jika informasi kesehatan
terlibat, dan simpan hanya kolom yang Anda perlukan.

<Note>
  ThunderPhone mengirim event dengan `POST` ke **URL Produksi** pemicu,
  sehingga instance n8n Anda harus dapat dijangkau melalui HTTPS dari internet,
  dan workflow harus aktif. Pemicu memverifikasi HMAC
  `X-ThunderPhone-Signature` pada setiap permintaan dan membalas `401` untuk
  apa pun yang tidak ditandatangani atau tidak valid.
</Note>

Pemicu menghasilkan event lengkap: `type`, `event_id`, dan `data`. Lihat
[`telephony.complete` / `web.complete`](/id/webhooks/call-complete) dan
[`call.graded`](/id/webhooks/events) untuk setiap kolom. Pengiriman terjadi setidaknya sekali,
dan `event_id` tetap sama di seluruh percobaan ulang untuk satu event, jadi periksa nilainya sebelum
langkah yang tidak boleh diulang.

## Lakukan panggilan keluar dengan aman

**Lakukan Panggilan Keluar** (Resource **Panggilan Keluar**, Operation **Lakukan**)
menerima:

| Bidang | Arti |
|---|---|
| Nama atau ID Agen | Agen yang disimpan. Menu dropdown menampilkan agen Anda. |
| Nama atau ID Nomor Telepon | Nomor asal. Menu dropdown hanya menampilkan nomor yang diaktifkan untuk panggilan keluar. |
| Nomor Tujuan | Tujuan dalam format E.164, misalnya `+14155552671`. |
| Variabel | Objek JSON berisi nilai untuk placeholder dalam Prompt agen. |
| Kunci Idempotensi | ID stabil dari rekaman atau peristiwa upstream. Wajib diisi. |

Petakan **Kunci Idempotensi** ke ID dari apa pun yang menyebabkan eksekusi, seperti
ID rekaman CRM atau `event_id` pemicu. Node mengirimkan
`n8n:<node ID>:<your value>`, sehingga:

- Percobaan ulang otomatis atau **Coba ulang eksekusi** mengirim kunci yang sama, dan
  ThunderPhone mengembalikan panggilan asli dengan `idempotent_replay: true`
  alih-alih melakukan panggilan lagi.
- Dua node ThunderPhone yang menerima rekaman yang sama mengirim kunci yang berbeda.
- Nilai kosong gagal sebelum permintaan dikirim.

Hindari stempel waktu, nilai acak, serta ID eksekusi atau workflow n8n. Nilai baru
saat percobaan ulang akan melakukan panggilan nyata kedua. Seluruh kunci dapat
memiliki maksimum 128 karakter. Menggunakan kembali kunci dengan agen, nomor, atau
variabel yang berbeda akan gagal karena konflik.

**Kampanye.** **Tambahkan Kontak** (Resource **Kampanye**) menambahkan kontak ke
kampanye draf. Tindakan ini menerima ID Kampanye dan array JSON kontak. Setiap kontak memerlukan `phone_number`; kunci lainnya
menjadi variabel panggilan. Node gagal saat semua kontak ditolak dan menetapkan
`partial_success: true` saat hanya sebagian yang ditolak. **Mulai** memerlukan kotak centang
yang mengonfirmasi bahwa kampanye melakukan panggilan nyata dan menggunakan kredit
ThunderPhone. Lihat [Kampanye keluar](/id/guides/outbound-campaigns).

Sebelum workflow memulai panggilan:

- Jika ThunderPhone meminta organisasi Anda mengonfirmasi bahwa panggilan keluarnya
  mematuhi TCPA dan undang-undang panggilan lainnya, admin harus terlebih dahulu mencatat
  konfirmasi tersebut di dashboard.
- Nomor asal harus diaktifkan untuk panggilan keluar. Nomor yang Anda bawa dari
  operator sendiri memenuhi syarat setelah diverifikasi. Nomor ThunderPhone pada awalnya
  hanya untuk panggilan masuk dan dapat disetujui untuk penggunaan keluar: admin memintanya
  dari halaman Nomor Telepon. Lihat
  [Dapatkan nomor telepon](/id/guides/get-a-phone-number).
- Organisasi Anda bertanggung jawab untuk memiliki persetujuan untuk menghubungi setiap nomor
  dan mematuhi undang-undang panggilan yang berlaku. Lihat
  [Undang-undang panggilan keluar](/id/guides/outbound-calling-laws).

## Contoh workflow

- **Kontak CRM ke kampanye.** Tambahkan kontak CRM ke kampanye ThunderPhone
  draf, lalu mulai kampanye setelah seseorang menyetujui daftar tersebut.
- **Panggilan selesai ke rekaman pelanggan.** Saat Panggilan Selesai, jalankan Dapatkan Panggilan
  dan simpan transkrip serta tautan rekaman ke rekaman pelanggan yang sesuai.
- **Nilai rendah untuk ditinjau.** Saat Panggilan Dinilai, filter berdasarkan
  `{{ $json.data.grade.score }}` dan arahkan panggilan bernilai rendah ke antrean peninjauan
  dengan ID panggilan dan detail nilai. Panggilan dapat dinilai lebih dari sekali,
  dan setiap proses penilaian yang selesai memicu pemicu, jadi simpan hanya
  `graded_at` terbaru untuk setiap ID panggilan.

Transkrip, ringkasan, dan rekaman panggilan dapat berisi informasi pribadi atau kesehatan.
Kirimkan hanya ke aplikasi yang diizinkan digunakan oleh organisasi Anda untuk data
tersebut, berdasarkan BAA jika melibatkan informasi kesehatan, dan simpan hanya bidang
yang Anda perlukan.

<Note>
  Mengirim peristiwa panggilan yang sama ke server Anda sendiri? Lihat
  [Endpoint webhook](/id/webhooks/endpoints).
  [Lakukan panggilan keluar](/id/guides/place-outbound-calls) membahas API di balik
  Lakukan Panggilan Keluar.
</Note>
