---
title: "Use ThunderPhone with Zapier"
description: "Connect the ThunderPhone app on Zapier to your organization and build a Zap that runs every time a call ends."
---

[Zapier](https://zapier.com) connects apps with automated workflows called
Zaps. The ThunderPhone app on Zapier adds:

- **Triggers:** **Call Completed** fires when a phone, web, or test call ends.
  **Call Graded** fires when a completed call's grade is available.
- **Actions:** **Place Outbound Call**, **Add Contacts to Campaign**, and
  **Start Campaign**.
- **Search:** **Find Call** looks up a call by ID and returns it with its
  transcript and a signed recording URL when one is available.

Find it at [ThunderPhone on Zapier](https://zapier.com/apps/thunderphone/integrations).
For an overview of both ways to use Zapier with ThunderPhone, see the
[Zapier integration page](https://thunderphone.com/integrations/zapier).

## Connect your organization

The app connects through OAuth. You sign in to ThunderPhone and approve
access for one organization, and no API key is copied into Zapier.

<Steps>
  <Step title="Add a ThunderPhone step">
    In the Zap editor, search for **ThunderPhone** (shown with a Beta label)
    and pick a trigger or action. When Zapier asks for an account, connect a new one. Zapier opens
    a ThunderPhone sign-in window.
  </Step>
  <Step title="Sign in and choose the organization">
    Sign in, check the requested permissions, choose the organization, and
    select **Approve**. The app asks to read your agents and phone numbers,
    read and write calls and campaigns, manage integrations such as webhook
    endpoints, and see your account email.
  </Step>
  <Step title="Check the connection name">
    Zapier names the connection after the organization you approved, so you
    can tell connections apart when you belong to more than one.
  </Step>
</Steps>

Connect with an account that has the admin or owner role in that
organization. Turning a trigger Zap on or off, and every action, needs that
role. A trigger Zap that is already on keeps receiving call events after the
role changes or the connection is revoked. Turn it off to stop them. Find
Call works for any member.

The app has no ThunderPhone charge of its own. Calls it places or starts
bill at your normal ThunderPhone rates, and Zapier counts tasks on your
Zapier plan.

## Build a first Zap

This Zap adds a row to a Google Sheet every time a call ends.

<Steps>
  <Step title="Make a call to use as sample data">
    Open an agent in the builder, click **Talk**, and end the call. Builder
    test calls fire Call Completed, so this gives the trigger a recent call to
    load.
  </Step>
  <Step title="Add the trigger">
    Choose **ThunderPhone** as the trigger app, set the event to **Call
    Completed**, and select your ThunderPhone connection. Test the trigger.
    Zapier loads your most recent completed calls as samples, in the same
    shape as a live event.
  </Step>
  <Step title="Add Google Sheets">
    Add a Google Sheets action that creates a spreadsheet row. Pick a sheet
    with a header row, then map each column to a field from the trigger (see
    the table below).
  </Step>
  <Step title="Publish the Zap">
    Publish and turn the Zap on. Turning it on creates a webhook endpoint in
    your ThunderPhone organization named **Zapier: Call Completed**. Turning
    the Zap off deletes that endpoint.
  </Step>
  <Step title="Test it">
    Make another builder test call. When it ends, the Zap runs and a row
    appears.
  </Step>
</Steps>

Useful columns:

| Column | Call Completed field |
|---|---|
| Call ID | Call ID |
| Agent | Agent Name |
| Direction | Direction |
| From | From Number |
| To | To Number |
| Started | Started At |
| Ended | Ended At |
| Duration (s) | Duration in Seconds |
| Status | Status |
| End reason | End Reason |
| Call link | Type `https://app.thunderphone.com/dashboard/call-history/`, then insert Call ID |

The call link opens the call in the ThunderPhone dashboard for members of
your organization, with its transcript and recording, so the sheet does not
need to hold either.

The event can also carry the transcript, as a list of turns, and a Recording
URL, a signed link that expires. Add them only if the sheet needs them. Call
transcripts, summaries and recordings can contain personal or health
information. Send them only to apps your organization is allowed to use for
that data, under a BAA where health information is involved, and keep only
the fields you need. See
[`telephony.complete` / `web.complete`](/webhooks/call-complete) for every
field.

<Note>
  Every delivery is signed. The app checks the `X-ThunderPhone-Signature`
  HMAC against the endpoint's secret before the Zap runs and stops on anything
  unsigned or invalid. If Zapier does not accept a delivery, ThunderPhone
  retries it for up to 24 hours. See [Webhooks overview](/webhooks/overview).
</Note>

## Triggers, actions, and search

**Call Graded** gives the Call ID, Agent ID, Agent Name, and the grade: Grade
ID, Score, Call Outcome, Summary, Grader Model, and Graded At. Turning a Zap
on creates an endpoint named **Zapier: Call Graded**. A call can be graded
more than once, and each finished grading run fires the trigger. See
[`call.graded`](/webhooks/events).

**Find Call** takes a Call ID, with a dropdown of recent calls. It returns
the call's agent, direction, numbers, start and end times, status, end
reason, grade score and call outcome, the transcript, and a signed recording
URL when one is available. An unknown Call ID returns no result instead of an
error.

**Place Outbound Call** takes:

| Field | Meaning |
|---|---|
| Agent | A saved agent. The dropdown lists your agents. |
| To Number | Destination in E.164 format, such as `+14155550199`. |
| From Number | The dropdown lists only numbers enabled for outbound calls. |
| Variables | Optional JSON object of values for placeholders in the agent prompt. |
| Idempotency Key | A stable ID from the trigger or source record. Required. |

It returns the Call ID, Status, and Idempotent Replay.

**Add Contacts to Campaign** adds contacts to a draft campaign. For one
contact, fill **Phone Number** in E.164 format and optionally **Contact
Variables**, a JSON object whose properties become campaign variables. For a
batch, fill **Contacts JSON** with an array of up to 5,000 objects. Each needs
`phone_number`, and its other properties become variables. The step fails
when every contact is rejected, and sets **Partial Success** when only some
are.

**Start Campaign** starts or resumes a campaign that has at least one
contact. It requires **Consent to Charge**. See
[Outbound campaigns](/guides/outbound-campaigns).

## Before a Zap places calls

Place Outbound Call and Start Campaign dial real phone numbers and start
billable calls.

- If ThunderPhone asks your organization to confirm that its outbound calls
  follow the TCPA and other calling laws, an admin must record that
  confirmation in the dashboard before a Zap can start calls.
- The From Number must be enabled for outbound calls. Numbers you bring from
  your own carrier qualify once verified. ThunderPhone-provided numbers start
  inbound-only, and you can request outbound access for them in the
  dashboard. See [Get a phone number](/guides/get-a-phone-number).
- Place Outbound Call requires an **Idempotency Key**. Map a stable ID from
  the trigger or source record, such as the ThunderPhone event ID or a CRM
  record ID. If Zapier retries the step, ThunderPhone recognizes the key and
  returns the original call instead of placing a second one. Avoid
  timestamps, random values, or the Zap ID alone.
- Start Campaign requires **Consent to Charge**, which confirms the Zap may
  start billable outbound calls on your account.
- Your organization is responsible for having consent to call each number
  and for following the calling laws that apply. See
  [outbound calling laws](/guides/outbound-calling-laws).

An idempotency key is unique across your organization and can be at most 128
characters. Reusing a key with a different agent, number, or variables fails
with a conflict, so if two Zaps can call about the same record, give each Zap
its own fixed prefix before the record ID.
[Place outbound calls](/guides/place-outbound-calls) covers the API behind
this action.

## Example Zaps

- **Call Completed to a CRM.** Log an activity for each finished call with
  its status, end reason, and transcript.
- **Call Graded to follow-up.** Filter on the call outcome or score and route
  the call into the right follow-up workflow.
- **New lead to a campaign.** Add the lead to a draft campaign with Add
  Contacts to Campaign, then run Start Campaign once someone approves the
  list.

Call transcripts, summaries and recordings can contain personal or health
information. Send them only to apps your organization is allowed to use for
that data, under a BAA where health information is involved, and keep only
the fields you need.

## Troubleshooting

**A step fails with an authorization error.** Reconnect the ThunderPhone
connection in Zapier and approve again. A connection stops working when the
person who connected revokes it in ThunderPhone under **Organization → Keys →
Authorized apps**, when that person leaves the organization, or when it goes
30 days without a successful token refresh. See
[Connect with OAuth](/guides/oauth).

**Turning a Zap on or off fails, or an action is refused.** The person who
connected needs the admin or owner role in the organization. Reconnect with
an account that has it. A trigger Zap that is already on keeps receiving call
events after the role changes or the connection is revoked. Turn it off to
stop them.

**You want to disconnect the app.** Turn off your ThunderPhone Zaps before
you revoke the connection, since turning a Zap off deletes its endpoint and
needs a working connection. If you revoked first, delete the leftover
**Zapier: …** endpoint with `DELETE /v1/developer/webhook-endpoints/{id}`
using an admin API key. See [Webhook endpoints](/webhooks/endpoints).

**The Zap should use a different organization.** Each connection covers one
organization. Turn the Zap off first, so its webhook endpoint is deleted from
the current organization. Then connect a new ThunderPhone account in Zapier,
choose the other organization when you approve, and select that connection
on each ThunderPhone step. Agents, numbers and campaigns differ between
organizations, so pick **Agent**, **From Number** and **Campaign** again on
each step that has them. Then turn the Zap back on.

**The trigger stopped firing.** Each Zap with a ThunderPhone trigger owns one
webhook endpoint in your organization, named **Zapier: Call Completed** or
**Zapier: Call Graded**. It is created when the Zap turns on and deleted when
it turns off. Leave it as it is. If it was edited or deleted in ThunderPhone,
turn the Zap off and on again to create a fresh one.
With an admin API key,
[`GET /v1/developer/webhook-deliveries`](/api-reference/webhook-deliveries)
shows recent delivery attempts.

<Note>
  Want the agent to use Zapier actions during a call instead of after it?
  Connect a Zapier MCP endpoint under **Connections → MCP**. See
  [MCP servers](/guides/mcp-servers). To send the same call events to your
  own server, see [Webhook endpoints](/webhooks/endpoints).
</Note>
