---
title: "Gebruik ThunderPhone met n8n"
description: "Installeer de ThunderPhone-node voor n8n, verbind een server-API-sleutel en bouw een workflow die wordt uitgevoerd telkens wanneer een oproep eindigt."
---

[n8n](https://n8n.io) is een tool voor workflowautomatisering. Het ThunderPhone-pakket
voor n8n voegt twee nodes toe:

- **ThunderPhone Trigger** start een workflow wanneer een oproep eindigt (**Oproep
  voltooid**) of een uitvoering van oproepbeoordeling is voltooid (**Oproep
  beoordeeld**).
- **ThunderPhone** plaatst uitgaande oproepen, voegt contacten toe aan campagnes en
  start deze, haalt oproepen op met hun transcript en opname, en geeft een lijst van je
  agenten en telefoonnummers.

Het is een geverifieerde community-node, vermeld op
[ThunderPhone op n8n](https://n8n.io/integrations/thunderphone/).

## Installeer de node

Klik in de n8n-editor op **+** om het nodepaneel te openen en zoek naar
**ThunderPhone**. Mogelijk moet een instantie-eigenaar geverifieerde nodes instellen
voordat andere gebruikers ze kunnen toevoegen.

Op zelfgehoste n8n kun je ook installeren via de pakketnaam: open
**Instellingen > Community Nodes** en installeer `n8n-nodes-thunderphone`. Controleer de risico's van community-nodes en het beleid van je instantie
voordat je installeert.

## Maak een server-API-sleutel

<Steps>
  <Step title="Open het tabblad Sleutels">
    Ga in ThunderPhone naar **Organisatie → Sleutels** en klik op **Sleutel maken**.
  </Step>
  <Step title="Geef de sleutel een naam">
    Gebruik een naam die aangeeft waar de sleutel wordt gebruikt, zoals "n8n".
  </Step>
  <Step title="Kopieer de sleutel nu">
    Het volledige geheim `sk_live_...` wordt één keer weergegeven. Kopieer het voordat je het
    dialoogvenster sluit.
  </Step>
</Steps>

Alleen een beheerder of eigenaar kan de sleutel maken, en ThunderPhone behandelt verzoeken
die ermee worden gedaan alsof ze van die persoon afkomstig zijn. De trigger en de campagne-
bewerkingen vereisen dat die persoon de rol van beheerder of eigenaar behoudt.
[Een server-API-sleutel maken](/nl/guides/api-keys) behandelt rotatie en intrekking.

## Voeg de inloggegevens toe in n8n

1. Maak in n8n inloggegevens van het type **ThunderPhone API**.
2. Plak de sleutel in **API-sleutel**.
3. Sla deze op en voer de test voor de inloggegevens uit. De test leest één oproep uit je
   organisatie met `GET /v1/calls?limit=1`.

## Een eerste workflow bouwen

Deze workflow voegt elke keer dat een oproep eindigt een rij toe aan een Google-spreadsheet.

<Steps>
  <Step title="De trigger toevoegen">
    Voeg **ThunderPhone Trigger** toe, selecteer je ThunderPhone API-inloggegevens en
    stel **Gebeurtenis** in op **Oproep voltooid**.
  </Step>
  <Step title="De oproep ophalen">
    Voeg een **ThunderPhone**-node toe. Stel **Bron** in op **Oproep**, **Bewerking**
    op **Ophalen** en **Oproep-ID** op de expressie `{{ $json.data.call_id }}`.
    De uitvoer is het [oproeprecord](/api-reference/calls), plus `transcripts`
    en `recording_url`, een link met een korte geldigheidsduur die `null` is wanneer de oproep
    geen opname heeft.
  </Step>
  <Step title="Een rij toevoegen">
    Voeg een Google Sheets-node toe die een rij toevoegt en koppel de gewenste
    kolommen vanuit de uitvoer van Oproep ophalen (zie de onderstaande tabel).
  </Step>
  <Step title="De workflow activeren">
    Sla op en activeer. De trigger registreert de productie-URL als webhook-eindpunt
    in je ThunderPhone-organisatie. Als je de workflow deactiveert, wordt dat eindpunt verwijderd.
  </Step>
  <Step title="Testen">
    Open een agent in de builder, klik op **Praten** en beëindig de oproep. Testoproepen
    in de builder worden afgeleverd als `web.complete`, een van de twee gebeurtenissen achter
    Oproep voltooid, zodat de workflow wordt uitgevoerd en er een rij verschijnt.
  </Step>
</Steps>

Handige kolommen:

| Kolom | Expressie |
|---|---|
| Oproep-ID | `{{ $json.call_id }}` |
| Richting | `{{ $json.direction }}` |
| Van | `{{ $json.from_number }}` |
| Naar | `{{ $json.to_number }}` |
| Gestart | `{{ $json.start_time }}` |
| Duur (s) | `{{ $json.duration_seconds }}` |
| Status | `{{ $json.status }}` |
| Eindreden | `{{ $json.end_reason }}` |
| Oproeplink | `https://app.thunderphone.com/dashboard/call-history/{{ $json.call_id }}` |

De oproeplink opent de oproep in het ThunderPhone-dashboard voor leden van
je organisatie, inclusief transcript en opname, zodat de spreadsheet geen van beide
hoeft te bevatten.

Als je het transcript toch wilt toevoegen, koppel je
`{{ $json.transcripts.filter(t => typeof t.content === 'string').map(t => t.role + ': ' + t.content).join('\n') }}`.
De opname-URL verloopt, dus sla de oproep-ID op en voer Oproep ophalen opnieuw uit wanneer
je een nieuwe link nodig hebt. Oproeptranscripten, samenvattingen en opnamen kunnen
persoons- of gezondheidsinformatie bevatten. Stuur ze alleen naar apps die je organisatie
voor die gegevens mag gebruiken, onder een BAA wanneer het om gezondheidsinformatie
gaat, en bewaar alleen de velden die je nodig hebt.

<Note>
  ThunderPhone levert gebeurtenissen met `POST` aan de **productie-URL** van de trigger, dus je
  n8n-instantie moet via HTTPS bereikbaar zijn vanaf het internet en de workflow
  moet actief zijn. De trigger verifieert de `X-ThunderPhone-Signature` HMAC bij elk verzoek
  en antwoordt met `401` op alles zonder handtekening of met een ongeldige handtekening.
</Note>

De trigger geeft de volledige gebeurtenis uit: `type`, `event_id` en `data`. Zie
[`telephony.complete` / `web.complete`](/nl/webhooks/call-complete) en
[`call.graded`](/nl/webhooks/events) voor elk veld. Aflevering gebeurt minstens één keer,
en `event_id` blijft hetzelfde bij nieuwe pogingen voor één gebeurtenis, dus controleer
dit vóór een stap die niet mag worden herhaald.

## Plaats uitgaande oproepen veilig

**Uitgaande oproep plaatsen** (Resource **Uitgaande oproep**, Operation **Plaatsen**)
vereist:

| Veld | Betekenis |
|---|---|
| Naam of ID van agent | Een opgeslagen agent. De vervolgkeuzelijst bevat je agents. |
| Naam of ID van telefoonnummer | Het afzendernummer. De vervolgkeuzelijst bevat alleen nummers die zijn ingeschakeld voor uitgaande oproepen. |
| Nummer van ontvanger | Bestemmingsnummer in E.164-indeling, bijvoorbeeld `+14155552671`. |
| Variabelen | JSON-object met waarden voor placeholders in de agentprompt. |
| Idempotentiesleutel | Een stabiele ID uit het upstreamrecord of de gebeurtenis. Verplicht. |

Koppel de **Idempotentiesleutel** aan een ID van wat de uitvoering heeft veroorzaakt, zoals een
CRM-record-ID of de `event_id` van de trigger. De node verzendt
`n8n:<node ID>:<your value>`, dus:

- Een automatische nieuwe poging of **Uitvoering opnieuw proberen** verzendt dezelfde sleutel, en
  ThunderPhone retourneert de oorspronkelijke oproep met `idempotent_replay: true`
  in plaats van opnieuw te bellen.
- Twee ThunderPhone-nodes die hetzelfde record ontvangen, verzenden verschillende sleutels.
- Een lege waarde mislukt voordat een verzoek wordt verzonden.

Vermijd tijdstempels, willekeurige waarden en n8n-uitvoerings- of workflow-ID's. Een nieuwe
waarde bij een nieuwe poging plaatst een tweede echte oproep. De volledige sleutel mag maximaal 128
tekens bevatten. Het hergebruiken van een sleutel met een andere agent, nummer of variabelen mislukt
met een conflict.

**Campagnes.** **Contacten toevoegen** (Resource **Campagne**) voegt contacten toe aan een
conceptcampagne. Hiervoor zijn een campagne-ID en een JSON-array met contacten nodig. Elk contact heeft `phone_number` nodig; andere sleutels
worden oproepvariabelen. De node mislukt wanneer elk contact wordt afgewezen en stelt
`partial_success: true` in wanneer slechts enkele contacten worden afgewezen. **Starten** vereist het selectievakje
waarmee je bevestigt dat de campagne echte oproepen plaatst en ThunderPhone-
credits uitgeeft. Zie [Uitgaande campagnes](/nl/guides/outbound-campaigns).

Voordat een workflow oproepen start:

- Als ThunderPhone je organisatie vraagt te bevestigen dat uitgaande oproepen
  voldoen aan de TCPA en andere belwetten, moet een beheerder die
  bevestiging eerst in het dashboard vastleggen.
- Het afzendernummer moet zijn ingeschakeld voor uitgaande oproepen. Nummers die je van
  je eigen provider meebrengt, komen in aanmerking zodra ze zijn geverifieerd. ThunderPhone-nummers zijn aanvankelijk
  alleen inkomend en kunnen worden goedgekeurd voor uitgaand gebruik: een beheerder vraagt dit aan
  via de pagina Telefoonnummers. Zie
  [Een telefoonnummer aanvragen](/nl/guides/get-a-phone-number).
- Je organisatie is verantwoordelijk voor het hebben van toestemming om elk nummer
  te bellen en voor het naleven van de toepasselijke belwetten. Zie
  [Wetten voor uitgaand bellen](/nl/guides/outbound-calling-laws).

## Voorbeeldworkflows

- **CRM-contacten naar een campagne.** Voeg CRM-contacten toe aan een concept-ThunderPhone-
  campagne en start de campagne zodra iemand de lijst goedkeurt.
- **Voltooide oproep naar het klantrecord.** Voer bij Oproep voltooid Oproep ophalen
  uit en sla het transcript en de opnamelink op in het bijbehorende klantrecord.
- **Lage beoordelingen ter controle.** Filter bij Oproep beoordeeld op
  `{{ $json.data.grade.score }}` en stuur oproepen met een lage score naar een controlewachtrij
  met de oproep-ID en beoordelingsdetails. Een oproep kan meer dan één keer worden
  beoordeeld en elke voltooide beoordelingsuitvoering activeert de trigger, dus bewaar alleen de meest recente
  `graded_at` voor elke oproep-ID.

Oproeptranscripten, samenvattingen en opnamen kunnen persoonlijke of medische
informatie bevatten. Verstuur deze alleen naar apps die je organisatie voor die
gegevens mag gebruiken, onder een BAA wanneer medische informatie betrokken is, en bewaar alleen
de velden die je nodig hebt.

<Note>
  Verstuur je dezelfde oproepgebeurtenissen liever naar je eigen server? Zie
  [Webhook-eindpunten](/nl/webhooks/endpoints).
  [Uitgaande oproepen plaatsen](/nl/guides/place-outbound-calls) behandelt de API achter
  Uitgaande oproep plaatsen.
</Note>
