---
name: "calendar_save_routing_form"
area: "calendar"
title: "Save a routing form"
price: "$0.001"
method: "POST"
url: "https://api.conecto.chat/v1/tools/calendar_save_routing_form"
mcp_server: "https://api.conecto.chat/mcp/calendar"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/calendar/calendar_save_routing_form"
---

# Save a routing form (`calendar_save_routing_form`)

Creates or changes a routing form that asks visitors a few questions and sends each to the right meeting type, host, site or message.

Create or change a routing form, like Cal.com's: questions a visitor answers before booking, and routes that send them to a meeting type (for a round-robin type, perhaps only some of its hosts), another site, or a message. The first route whose conditions all hold wins; everyone else takes the fallback. It lives at its calendar's address beside the meeting types: cncto.co/book/<calendar>/<slug>. A question keyed name (text) or email (email) fills in the booking form. Only the fields you pass change. Each answer set is kept (calendar_list_routing_responses) and the bot hears of it (calendar.routed).

Price: $0.001 a call. A call that fails costs nothing.

## Use it when

Different visitors should book different things or different people: fleets with the fleet manager, a single bike with the workshop.

- For one kind of meeting with its own booking page, use [calendar_save_meeting_type](https://conecto.chat/tools/calendar/calendar_save_meeting_type.md).

## Say this to your agent

> Before people book, ask how many bikes they need looked after, and have our fleet manager call anyone with more than 20 instead.

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `slug` | string | yes | Its address, e.g. "get-started". Matches ^[a-z0-9][a-z0-9-]{0,59}$. |  |  |
| `person` | string | no | Put it on this person's own calendar. Up to 254 characters. |  |  |
| `title` | string | no | 1 to 120 characters. |  |  |
| `description` | string | no | Up to 2,000 characters. |  |  |
| `questions` | array of objects | no | {key, label, type: text\|long_text\|select\|checkbox\|number\|email\|phone, required, options}. Up to 20 items. |  |  |
| `routes` | array of objects | no | [{"when": [{"question": "<a question's key>", "<is\|is_not\|any_of\|none_of\|contains\|at_least\|below>": <value>}, ...], "to": {"meeting_type": "demo", "hosts": ["ana@example.com"]} \| {"url": "https://..."} \| {"message": "..."}}], tried in order. Up to 30 items. |  |  |
| `fallback` | object | no | Where everyone else goes, as a route's "to". |  |  |
| `active` | boolean | no |  |  |  |

## Example

Written for Halverson Cycle & Repair, a bike shop with a repair workshop in Portland, Oregon.

MCP: call `calendar_save_routing_form` on the MCP server `https://api.conecto.chat/mcp/calendar` with these arguments:

```json
{
  "slug": "get-started",
  "title": "Book a fitting or a fleet service",
  "questions": [
    {
      "key": "name",
      "label": "Your name",
      "type": "text",
      "required": true
    },
    {
      "key": "email",
      "label": "Email",
      "type": "email",
      "required": true
    },
    {
      "key": "bikes",
      "label": "How many bikes need looking after?",
      "type": "select",
      "required": true,
      "options": [
        "1 or 2",
        "3 to 20",
        "More than 20"
      ]
    }
  ],
  "routes": [
    {
      "when": [
        {
          "question": "bikes",
          "is": "More than 20"
        }
      ],
      "to": {
        "message": "Thank you. Our fleet manager will call you within one working day."
      }
    }
  ],
  "fallback": {
    "meeting_type": "bike-fitting"
  }
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/calendar_save_routing_form \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"slug": "get-started", "title": "Book a fitting or a fleet service", "questions": [{"key": "name", "label": "Your name", "type": "text", "required": true}, {"key": "email", "label": "Email", "type": "email", "required": true}, {"key": "bikes", "label": "How many bikes need looking after?", "type": "select", "required": true, "options": ["1 or 2", "3 to 20", "More than 20"]}], "routes": [{"when": [{"question": "bikes", "is": "More than 20"}], "to": {"message": "Thank you. Our fleet manager will call you within one working day."}}], "fallback": {"meeting_type": "bike-fitting"}}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "calendar_save_routing_form",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.001",
  "balance_usd": "$19.75",
  "result": {
    "routing_form": {
      "slug": "get-started",
      "title": "Book a fitting or a fleet service",
      "description": null,
      "person": null,
      "url": "https://cncto.co/book/halverson-cycle/get-started",
      "questions": [
        {
          "key": "name",
          "label": "Your name",
          "type": "text",
          "required": true,
          "options": []
        },
        {
          "key": "email",
          "label": "Email",
          "type": "email",
          "required": true,
          "options": []
        }
      ],
      "routes": [
        {
          "when": [
            {
              "question": "bikes",
              "is": "More than 20"
            }
          ],
          "to": {
            "message": "Thank you. Our fleet manager will call you within one working day."
          }
        }
      ],
      "fallback": {
        "meeting_type": "bike-fitting"
      },
      "active": true,
      "responses": 0
    }
  }
}
```

`result`: The routing form: its address, questions, routes with where each goes, the fallback, whether it is active, and how many people answered it.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `not_set_up` | 404 | The business has no calendar yet. | Create it with calendar_setup, then call again. |
| `invalid_input` | 400 | A new form has no title, questions or fallback, a condition names a question the form doesn't ask, or a route goes nowhere it can. | Fix what the message names; each route goes to one meeting type, web address or message. |
| `slug_taken` | 409 | A meeting type on that calendar already has the slug. | Pick another slug. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [calendar_setup](https://conecto.chat/tools/calendar/calendar_setup.md): Sets the business's calendar or a person's own: name, booking address, time zone, weekly hours, closed days, reminder emails and confirmation calls. $0.001 a call.
- [calendar_get_setup](https://conecto.chat/tools/calendar/calendar_get_setup.md): The calendar's settings, booking page, iCal link, connected Google calendar, meeting types, and its people's own calendars. Free up to 1,000,000 reads a month.
- [calendar_connect](https://conecto.chat/tools/calendar/calendar_connect.md): A link that opens a page naming the business, where the owner, or a person for their own page, connects Google Calendar in one click. Free up to 1,000,000 reads a month.
- [calendar_save_meeting_type](https://conecto.chat/tools/calendar/calendar_save_meeting_type.md): Creates or changes a kind of meeting people can book, on the business's calendar or a person's, taken by one host, a round robin or everyone. $0.001 a call.
- [calendar_list_meeting_types](https://conecto.chat/tools/calendar/calendar_list_meeting_types.md): Every meeting type people can book, the business's and each person's own, with its hosts and booking page. Free up to 1,000,000 reads a month.
- [calendar_find_times](https://conecto.chat/tools/calendar/calendar_find_times.md): Free start times for a meeting type between two dates, in the time zone you ask for. Free up to 1,000,000 reads a month.
- [calendar_book](https://conecto.chat/tools/calendar/calendar_book.md): Books a free time for someone, who gets a confirmation email with an invite and a link to change it. $0.01 a call.
- [calendar_list_bookings](https://conecto.chat/tools/calendar/calendar_list_bookings.md): Bookings between two times (from now on by default), soonest first, with each one's hosts, guests and confirmation call. Free up to 1,000,000 reads a month.
- [calendar_move](https://conecto.chat/tools/calendar/calendar_move.md): Moves a booking to another free time and sends the attendee an updated invite. $0.01 a call.
- [calendar_cancel](https://conecto.chat/tools/calendar/calendar_cancel.md): Cancels a booking and tells the attendee by email, unless notify is false. $0.01 a call.
- [calendar_list_routing_forms](https://conecto.chat/tools/calendar/calendar_list_routing_forms.md): The routing forms with their addresses, questions, routes and how many people answered each. Free up to 1,000,000 reads a month.
- [calendar_list_routing_responses](https://conecto.chat/tools/calendar/calendar_list_routing_responses.md): What people answered on the routing forms, newest first, where each was sent, and the booking it led to. Free up to 1,000,000 reads a month.
