> For the complete documentation index, see [llms.txt](https://docs.dapta.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.dapta.ai/ai-voice-agents/agent-actions/schedule-appointments-with-dapta-calendars.md).

# Schedule Appointments with dCal

Let your Voice Agent offer your real open times and book the appointment during the call. Add the Dapta Calendars Scheduling action, pick the meeting, and every booking lands in your dCal account.

Your Voice Agent can book meetings for you during the call. It reads your real availability in **dCal**, offers the times that are actually free, and books the one the caller picks. No transfer, and no booking link sent after the call.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCy5rSNtQmtqYCGzJlNEB%2Fuploads%2Fgit-blob-b26ccda80cd0a9e4f7de623d227ac24db46d5444%2Fvoice-agents-calendars.mp4?alt=media>" %}

{% file src="/files/ec1WyEGdAnPfydsO5MWh" %}

It takes one action, **Dapta Calendars Scheduling**, which both checks availability and books. There is no API key to paste and no event type ID to copy: Dapta connects the agent to your workspace's dCal account for you.

{% hint style="info" %}
**New to dCal?** dCal is Dapta's free booking product at [app.dcal.ai](https://app.dcal.ai), where your meetings (called *events* there), working hours and bookings live. See [Start here](/dcal/dcal.md), and [Let your Dapta agent book](/dcal/dapta-agents.md) for how to get your event ready and what you see in dCal when the agent books.
{% endhint %}

***

## Before you start

| You need                                                       | Why                                                                                                                                                            |
| -------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A Voice Agent on **Dapta's current voice infrastructure**      | The action only appears there. If you don't see it, contact support.                                                                                           |
| **Admin** or **owner** access to your workspace's dCal account | Only they can connect an agent to it. If you are a member, the action tells you so, and a teammate who is an admin can add it for you.                         |
| A **meeting** in dCal                                          | A meeting is what the agent books: a name and a duration, like *Discovery call · 30 min*. If you don't have one yet, the action creates it with you in Step 2. |

{% hint style="info" %}
**Dapta Calendars Scheduling** replaces the two [Cal.com](/ai-voice-agents/agent-actions/cal.com.md) actions, *Check Calendar Availability* and *Book on the Calendar*, with one action that does both. You don't need to add them, and you don't need a Cal.com account.
{% endhint %}

***

## Set it up

**Step 1:** Open your Voice Agent and go to the **Settings** tab. Open **Agent Actions**, click **+ Add** and choose **Dapta Calendars Scheduling**.

<figure><img src="https://3835013762-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCy5rSNtQmtqYCGzJlNEB%2Fuploads%2Fgit-blob-81d6a2008c930f4c70ed1148e1fb1291a41193da%2Fvoice-agents-calendars-01-add-action.png?alt=media" alt="The Add menu of a Voice Agent&#x27;s Agent Actions, with Dapta Calendars Scheduling in the list"><figcaption></figcaption></figure>

***

**Step 2:** Choose the **Meeting** the agent will book.

{% tabs %}
{% tab title="You already have meetings" %}
Pick one from the **Meeting** list. The list is read live from your dCal account. If you already use dCal with a Text Agent, the same meetings appear here: one dCal account serves every agent in the workspace.
{% endtab %}

{% tab title="Your first meeting" %}
If your dCal account has no meetings yet, the action creates the first one with you before it shows the form:

1. Type a **Meeting name**, for example `Discovery call`.
2. Pick a **Duration**.
3. Click **Next**.

Dapta creates the meeting, plus working hours of Monday to Friday, 9:00 to 17:00, in your time zone. You only do this once. Later you can add more meetings and change your hours in dCal.
{% endtab %}
{% endtabs %}

***

**Step 3:** Check the **Default time zone**. It is the zone the agent says times in, filled from your browser the first time you open the action.

If it is different from your calendar's time zone, your working hours stay as they are and the agent converts them for the caller. A 9:00 slot on a Bogotá calendar is offered as 8:00 by an agent set to Mexico City.

{% hint style="success" %}
**Want times in each caller's own time zone?** Add to the agent's **Important Instructions** that it must ask where the caller is before offering times. When the caller says where they are, the agent uses that zone for the times it offers and for the confirmation it reads back.
{% endhint %}

***

**Step 4 (optional):** In **Additional instructions**, write *when* the agent may offer times and book. It already knows *how*: check the calendar first, never invent a time, and only book a time the caller confirmed. What it can't know is your business rule:

> Offer times only after the caller confirms which service they need. Ask for their full name before booking.

<figure><img src="https://3835013762-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCy5rSNtQmtqYCGzJlNEB%2Fuploads%2Fgit-blob-e8815fa3d226be797822134fba1836219f651b0e%2Fvoice-agents-calendars-02-action-form.png?alt=media" alt="The Schedule appointments form with a meeting selected, the default time zone and additional instructions filled in"><figcaption></figcaption></figure>

What you write here is **added** to the agent's built-in scheduling rules and never replaces them. Even with instructions, the agent only offers times it found in your calendar.

***

**Step 5:** Click **Save**. Dapta saves the action to the agent right away and shows *Actions updated*. It appears in **Agent Actions** under the name of its availability function, `check_dapta_calendar_availability`. That one row is the whole action, checking and booking together. Use the **pencil icon** to change the meeting, the time zone or the instructions, and the **bin icon** to remove scheduling from the agent.

<figure><img src="https://3835013762-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCy5rSNtQmtqYCGzJlNEB%2Fuploads%2Fgit-blob-cec5aeb403ea057a7ce3d010ed1edfb6389e1867%2Fvoice-agents-calendars-03-action-saved.png?alt=media" alt="The Agent Actions list with end_call and check_dapta_calendar_availability"><figcaption></figcaption></figure>

{% hint style="warning" %}
An agent books **one** meeting, but **Dapta Calendars Scheduling** stays in the **+ Add** menu after you add it. Choosing it again opens a blank form, and saving that form **replaces** the scheduling the agent already had. To change the meeting, the time zone or the instructions, use the **pencil icon** on the existing row.
{% endhint %}

***

## Test it

Open the **Test Agent** tab and start a **web call**. Ask for an appointment the way a caller would, for example *"Can I book a meeting for Tuesday morning?"*. Pick one of the times the agent offers and give it your name and email. The agent books it and reads the confirmation back.

{% hint style="warning" %}
Test calls book **real appointments** in your dCal account, and the confirmation goes to the email you say. Cancel your test bookings in dCal when you're done.
{% endhint %}

***

## What the agent does during the call

The action gives your agent two abilities, and it decides which one to use from the conversation:

| The agent…                | What happens                                                                                                |
| ------------------------- | ----------------------------------------------------------------------------------------------------------- |
| **Checks availability**   | Reads the free slots of your meeting in dCal and says them out loud. It always checks before naming a time. |
| **Books the appointment** | Once the caller confirms a time, it books exactly that slot and reads the confirmation back.                |

A normal call goes: the caller asks, the agent checks and offers, the caller picks, the agent books. If the caller asks about another day, the agent checks again.

To book, the agent needs the caller's **full name** and **email address**. If the email already comes with the call, for example as a contact variable on an outbound sequence, the agent uses it. Otherwise it asks the caller to say it, and it won't book without one.

When the booking is created, dCal sends a **confirmation email with a calendar invite** to the caller and to you, and the appointment shows up in your dCal account.

{% hint style="info" %}
**If someone takes the slot first**, the agent tells the caller, checks again and offers fresh times. It never offers the slot that was just taken.
{% endhint %}

***

## What lives where

Scheduling spans two products. Knowing which one owns what tells you where to change something.

| Product                  | Owns                                                                                                                                          |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| **dCal** (`app.dcal.ai`) | Your scheduling account: meetings, working hours, calendar sync and every booking made. One account per workspace, shared by all your agents. |
| **Your Voice Agent**     | Which meeting this agent books, the time zone it says times in, and your rule for when it may offer times or book.                            |

The action connects the two: it reads your meetings while you set it up, and reads your availability and creates bookings while a call runs. You never paste or manage a credential.

{% hint style="info" %}
**Text Agents** schedule the same way, with the same account, meetings and availability. See [Schedule Appointments with dCal](/ai-text-agents/setting-up-your-text-agent/schedule-appointments-with-dapta-calendars.md) for Text Agents.
{% endhint %}

***

## Requirements and limits

|                                 | Detail                                                                                                                                |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| **Availability**                | Voice Agents on Dapta's current voice infrastructure. If **Dapta Calendars Scheduling** isn't in the **+ Add** menu, contact support. |
| **Permission**                  | An admin or owner of your workspace's dCal account sets the action up. Once it's saved, the agent works for everyone.                 |
| **Actions per agent**           | One, bound to one meeting. To book different meetings, use different agents.                                                          |
| **Working hours**               | Come from your dCal account: Monday to Friday, 9:00 to 17:00 unless you change them.                                                  |
| **Minimum notice**              | **2 hours** by default, so the agent won't offer a slot sooner than that. You can change it per meeting in dCal.                      |
| **How far ahead**               | A few days by default, and up to **15 days** when the caller asks about a later date.                                                 |
| **To book**                     | The caller's full name and email. The agent asks for the email when the call doesn't carry one.                                       |
| **Rescheduling and cancelling** | From the confirmation email or in dCal, not through the agent.                                                                        |

***

## Troubleshooting

<details>

<summary>I don't see Dapta Calendars Scheduling in the + Add menu</summary>

The action is available to Voice Agents on Dapta's current voice infrastructure. If your workspace hasn't moved to it yet, the option doesn't appear: contact support and we'll tell you where you stand.

</details>

<details>

<summary>The agent says it has no times available</summary>

Check in dCal that the meeting has working hours on the days the caller is asking about. Remember the 2-hour minimum notice too: on a same-day call, the next two hours are left out on purpose.

</details>

<details>

<summary>The agent offered times in the wrong time zone</summary>

Times use the action's **Default time zone** unless the caller says where they are during the call. A city written in the agent's prompt or in your company description is not used. To always work in the caller's zone, add to the **Important Instructions** that the agent must ask where the caller is before offering times.

</details>

<details>

<summary>My scheduling settings disappeared after I added the action again</summary>

Choosing **Dapta Calendars Scheduling** again and saving replaces the action the agent had. Open the row with the **pencil icon**, set the meeting, time zone and instructions again, and click **Save**.

</details>

<details>

<summary>The meeting list is empty, or the meeting I picked disappeared</summary>

The list is read live from dCal. If the meeting was deleted there, the action clears it and asks you to pick again, so the agent never points at a meeting that no longer exists. Pick another one, or create one in dCal, then click **Save**.

</details>

<details>

<summary>"Admin access required"</summary>

You are a member, not an admin or owner, of your workspace's dCal account. Ask an admin or owner to add the action. Once it's saved, the agent works for everyone.

</details>

***

## Related pages

{% content-ref url="/pages/ep52rgmRRdUR5nGya2Zh" %}
[Agent actions](/ai-voice-agents/agent-actions.md)
{% endcontent-ref %}

{% content-ref url="/pages/EGxycIJov1VqFsw4RUdY" %}
[Schedule Appointments with dCal](/ai-text-agents/setting-up-your-text-agent/schedule-appointments-with-dapta-calendars.md)
{% endcontent-ref %}

{% content-ref url="/pages/CQwA8aDjqGOkO3GbYeDT" %}
[Let your Dapta agent book](/dcal/dapta-agents.md)
{% endcontent-ref %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.dapta.ai/ai-voice-agents/agent-actions/schedule-appointments-with-dapta-calendars.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
