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

# Connect apps (Google, Slack, HubSpot & more)

> Give your agents real abilities — check calendars, update your CRM, post to Slack — in a few clicks, no code.

App connections let a voice agent act inside the tools your team already
uses, mid-conversation: check availability on a calendar, look up a caller
in your CRM, append a lead to a spreadsheet, post a summary to Slack. You
connect an account once under **Connections → Apps**
(`/dashboard/app-connections`), choose what the agent is allowed to do, and
attach the connection to any agent in its builder.

Six applications are available today:

| Application         | What your agent can do with it                            |
| ------------------- | --------------------------------------------------------- |
| **Google Calendar** | View availability and manage calendar events.             |
| **Google Sheets**   | Append lead details and call outcomes to a sheet.         |
| **Slack**           | Find channels, search messages, and post with permission. |
| **HubSpot**         | Find contacts, update records, and add notes.             |
| **Salesforce**      | Search records, update leads, and log activity.           |
| **Cal.com**         | Check availability and manage bookings.                   |

For anything not on this list, build a custom
[API connection](/guides/api-connections) or add an
[MCP server](/guides/mcp-servers).

## Connect an account

<Steps>
  <Step title="Open Connections → Apps and click Add application">
    A picker shows the six applications. You can connect multiple accounts
    of the same app — each shows a "connected" count once you have one.
  </Step>

  <Step title="Authorize the account">
    Most apps use OAuth: a popup opens, you sign in to the provider and
    approve access, and the connection appears on the page. **Cal.com is
    the exception** — it connects with an API key instead. Paste the key
    and click **Validate and connect**; the key is checked against Cal.com
    before it is encrypted and saved.
  </Step>

  <Step title="Google Sheets only: pick the spreadsheet">
    A Sheets connection needs to know which spreadsheet and tab to write
    to. Right after connecting, a configuration panel opens — paste the
    spreadsheet's URL (or its ID), click **Inspect spreadsheet**, and
    choose the tab. The panel confirms the columns it found. Until this is
    done the connection tile shows **Needs configuration**.
  </Step>
</Steps>

<Note>
  ThunderPhone's Google OAuth verification is currently in review, so
  Google shows an "unverified app" warning during consent for Google
  Calendar and Google Sheets. The **Add application** dialog walks you
  through the two clicks to continue (**Advanced → Go to ThunderPhone**).
</Note>

Connecting and managing app connections requires an **admin** or **owner**
role in the organization.

## Control what the agent may do

Every connection has per-operation permission toggles — open a connection
tile to manage them. Read-style operations start enabled; operations that
write to or change your data start **off** until you enable them:

| Application     | Enabled by default                                     | Off by default                            |
| --------------- | ------------------------------------------------------ | ----------------------------------------- |
| Google Calendar | View events & availability, Create events              | Update events, Cancel events              |
| Google Sheets   | Add rows                                               | —                                         |
| Slack           | View channels & recent messages, Search messages       | Post messages                             |
| HubSpot         | Search & read contacts and companies                   | Create or update contacts and add notes   |
| Salesforce      | Search & read leads, contacts, and opportunities       | Create or update records and log activity |
| Cal.com         | List event types & check availability, Create bookings | Reschedule or cancel bookings             |

An operation you disable is simply not available to the agent — the
corresponding tools are never offered to it on calls.

## The tools your agent gets

Once a connection is attached to an agent, the enabled operations surface
as callable tools during conversations:

* **Google Calendar** — `calendar_list_events`, `calendar_check_availability`,
  `calendar_create_event`, `calendar_update_event`, `calendar_cancel_event`
* **Google Sheets** — `sheets_append_row` (writes to the spreadsheet and tab
  you configured)
* **Slack** — `slack_list_channels`, `slack_search_messages`,
  `slack_post_message`
* **HubSpot** — `hubspot_search_contacts`, `hubspot_get_contact`,
  `hubspot_upsert_contact`, `hubspot_add_note`
* **Salesforce** — `salesforce_search_records`, `salesforce_get_record`,
  `salesforce_upsert_lead`, `salesforce_log_activity`
* **Cal.com** — `calcom_list_event_types`, `calcom_check_availability`,
  `calcom_create_booking`, `calcom_cancel_booking`

You don't write schemas for any of these — ThunderPhone defines the tools
and routes the calls through the connected account.

## Attach the connection to an agent

Connections do nothing until an agent uses them. Open the agent in the
builder ([Build an agent](/guides/build-an-agent)) and add the connection
in its **Connected apps** section. A connection's tile on the Apps page
shows how many operations are enabled and how many agents use it.

## Disconnect

Open a connection tile and disconnect it from there. Agents that were
using it lose those tools on their next call.

## Next steps

<CardGroup cols={2}>
  <Card title="Turn any API into an agent action" icon="plug" href="/guides/api-connections">
    The paste-a-cURL wizard for services without a native connection.
  </Card>

  <Card title="Add an MCP server" icon="server" href="/guides/mcp-servers">
    Bring your own tool server over Streamable HTTP.
  </Card>
</CardGroup>
