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

# Agent actions

> How to configure Lead Form, Human Handoff, WooCommerce, Zendesk and Freshdesk Tickets, Cal.com, Calendly and Google Calendar, HubSpot, LeadConnector, Payment (SumUp/Mercado Pago/Flow/Wompi), and other actions your agent can run during a conversation.

# Agent actions

Actions give your agent extra capabilities during a conversation: capturing contact details, transferring to a human, or looking up information in external systems such as your online store. Each action is configured independently and can be turned on or off without affecting the rest.

![TODO: screenshot of an agent's actions list, with Lead Form and Human Handoff turned on](https://mintcdn.com/chatnorris/_RNPg7jBCB9AE-Bf/images/PLACEHOLDER-acciones-lista.png?fit=max\&auto=format\&n=_RNPg7jBCB9AE-Bf\&q=85\&s=cf7677e1419e8c461148a3dce99996d9)

## Where to find them

Open an agent's detail and click the **Actions** tab (`My agents → [your agent] → Actions`).

The list groups actions into **Active** and **Inactive** and shows, for each one, the integration it uses, the channels where it works, and its activity over the last 7 days compared with the previous week. You can filter the list, and each row's menu has **Edit**, **Duplicate**, **Test in Playground**, and **Delete**.

## Available actions

> [card] Lead Form
>
> Shows a form to capture the visitor's contact details during the conversation.

> [card] Human Handoff
>
> Transfers the conversation to a human agent when the bot considers it necessary.

> [card] WooCommerce
>
> Lets the agent look up verified orders, inventory by SKU, and customer data from your WooCommerce store.

> [card] [Jumpseller](https://docs.chatnorris.ai/en/guias/jumpseller.md)
>
> Live price and stock, verified order lookups, building a purchase with cart links, and payment confirmation, from your Jumpseller store. From the Standard plan.

> [card] Zendesk Tickets
>
> Creates and looks up verified support tickets in your Zendesk account without leaving the chat. Available only to organizations with the pilot enabled — see details below.

> [card] Freshdesk Tickets
>
> Creates tickets in Freshdesk with the visitor's confirmation and looks up their status in a verified way. Before opening a ticket, it tries to resolve the issue with the knowledge base.

> [card] Encuadrado — Scheduling
>
> Checks real availability and creates verified bookings in your Encuadrado clinic calendar.

> [card] Send Email
>
> The agent sends an email during the conversation (to your internal team or to the visitor).

> [card] Cal.com — Scheduling
>
> The visitor books a meeting from the chat, with a calendar embedded in the web widget. Included in all plans.

> [card] Calendly — Scheduling
>
> Same as Cal.com, with the public link of a Calendly event type. Works even with free Calendly.

> [card] Google Calendar — Scheduling
>
> Checks your real Google Calendar availability, offers times, and creates the appointment with an invitation to the visitor, only after they confirm. Available from the Standard plan.

> [card] Odoo
>
> Syncs leads with your Odoo CRM and, if you have Helpdesk, creates and looks up support tickets. Exclusive to the Premium plan.

> [card] HubSpot
>
> Syncs confirmed leads as Contacts in your HubSpot CRM, with optional company and Lead object.

> [card] LeadConnector (GoHighLevel)
>
> Creates or updates confirmed contacts in your sub-account, with a tag to trigger workflows and a note with the link to the conversation.

> [card] [Google Sheets](https://docs.chatnorris.ai/en/guias/google-sheets.md)
>
> Adds a row to a Google spreadsheet for each confirmed contact or each Lead Form submission. Included in all plans.

> [card] Payment
>
> Builds a cart with items from a closed catalog that you configure and generates the payment link (SumUp, Mercado Pago, Flow, or Wompi) in the chat.

> [!NOTE]
>
> You'll also see **Custom Form, Buttons, and HTTP Request** listed as "Coming soon" — they're planned but don't have working logic yet. When they become available, this guide will be updated with their steps.

> [!NOTE]
>
> **Zendesk Tickets** is still in the pilot stage: it appears locked with "Coming soon" in the selector unless ChatNorris has enabled the pilot for your organization. If you need it, write to us at [**hola@chatnorris.ai**](mailto:hola@chatnorris.ai). **Odoo** is available to all organizations, but requires the Premium plan.

## Turn on an action

**1. Go to Actions and click New action**

The action catalog opens, sorted by category. Each action shows a preview, what it can do, and what it needs (for example, a connected integration or a specific plan). The ones marked "Coming soon" are disabled.

**2. Choose the action type**

A new instance of that type is created and you're taken straight to its configuration screen.

**3. Give it a name and configure the details**

The **General** section has the action's name (useful for telling apart several instances of the same type, see below) and the **Enabled** toggle, which controls whether the agent can use it right now. The remaining sections depend on the action type; the side index lets you jump between them.

**4. Save the changes**

The save bar saves everything together (name, status, and configuration). Changes apply immediately to new conversations.

> [!TIP]
>
> To create an action similar to one you already have, use **Duplicate** in its row's menu. The copy is created turned off, so you can review it before turning it on.

### Several instances of the same action type

You can create more than one **Lead Form** on the same agent (for example, two different Lead Forms for two purposes: one to request a demo and another for support). **Human Handoff** is unique per agent — it's always present and can't be duplicated or deleted. **Freshdesk Tickets** and **Google Calendar — Scheduling** also allow only one per agent, and there can be only one active store (WooCommerce or Odoo) looking up orders and stock.

To delete an instance you no longer use, open its configuration and click **Delete** (it asks for confirmation, since it can't be undone).

### Action limit per plan

The number of actions you can have active per agent depends on your plan:

| Plan | Actions per agent |
| - | - |
| **Free** | 2 |
| **Standard** | 5 |
| **Premium** | 8 |

When you're about to create an action and have already reached the limit, the **New action** selector shows a notice ("You've reached your current plan's action limit") with a direct link to see the plans, instead of letting you continue. The **used/limit** counter appears next to the **New action** button in the Actions list.

## Lead Form

A form to capture name, email, phone, or other details you define, without taking the visitor out of the conversation.

| Field | What it controls |
| - | - |
| **Mandatory** | If on, the visitor must complete the form to keep chatting. If off, they can skip it. There can be only one mandatory, enabled Lead Form per agent. |
| **Detect contact info shared in chat** | Passive capture, see the note below. |
| **Fields** | List of fields to ask for. With **Add field** you choose from the **Standard fields** (for example name, email, phone, company, or postal code, which are saved to the lead's profile and synced with integrations such as HubSpot), the **Custom columns** that already exist in your [Leads](https://docs.chatnorris.ai/en/guias/leads.md), or a **Custom…** field with any name you want. Each field can be marked as **Required** or removed from the list. |
| **When to Use** | Free text that tells the agent at what point in the conversation it should show the form (e.g. "when the visitor shows interest in booking a demo"). You can go back to the original text with **Restore default text**. |
| **Customize Text** | Text of the **Submit button** and an optional **Success message** shown after submitting (it's shown exactly as you write it, without being translated into the visitor's language). |

> [!TIP]
>
> A visitor who already completed the form (in this conversation or a previous one) won't see it again.

> [!NOTE]
>
> Even if the Lead Form is turned off (or the visitor closes it without completing it), the agent can still recognize contact details the visitor mentions naturally during the chat ("my email is...", "call me at..."), confirm them with a single question if they're ambiguous, and save them as a lead — without showing any form. This is called **passive capture**: it's on by default and you control it with the action's **Detect contact info shared in chat** toggle. It works even if the form is disabled. It doesn't replace the Lead Form: they're two independent ways of capturing the same data.

### Lead Form on WhatsApp, Instagram, Messenger, Telegram, and Email

Messaging channels don't have on-screen forms, so the agent completes the Lead Form through conversation:

* It asks for **one required field per message**, in the form's order, and skips the details it already knows. It never says there's a form on screen.
* It doesn't ask for optional fields, but if the visitor mentions them, they're saved.
* It takes the visitor's answer without asking again. If the visitor doesn't want to give their details, the form is discarded. The offer stays open for up to 24 hours.
* When it has all the required fields, it submits the form and, if there's another Lead Form, starts on that one.
* Custom fields are saved to their column by name (for example, "Peugeot" goes to **Brand**), and a one-word answer to the field that was asked is saved in that field.

In the web widget, if the visitor already gave some details in the chat, the agent saves them and shows the form with those details prefilled; in the channels, it only asks for what's missing.

> [!WARNING]
>
> If a form field points to a custom column that was deleted from Leads, the editor flags it with a notice: what the visitor answers won't appear on the lead. Delete the field and add it again from **Choose a field…**, or use the option the notice offers to point it to the active column.

To turn off the form without losing its configuration, turn off the **Action enabled** toggle in the **General** section and save.

## Human Handoff

Controls when and how the bot transfers the conversation to a human agent. It replaces the previous behavior of automatic detection by a fixed phrase — now it's configurable.

| Field | What it controls |
| - | - |
| **When to Use** | Describes when the agent should escalate the conversation (e.g. topics that should trigger escalation, or whether it should try to solve the problem before transferring). |
| **Information to Gather** | Details the agent asks the visitor for before transferring them, in a single message and only the missing ones. Name, email, and phone are checked against the contact details already saved. If the visitor doesn't give them and insists on talking to a person, the transfer happens anyway. |
| **Team that receives the handoff** | Optional. Routes this agent's handoffs to a [team](https://docs.chatnorris.ai/en/guias/equipo.md#teams-per-agent): only its members (and Owners/Admins) get the notice and can take the conversation. Without a team, anyone can take it. |
| **First reply target** | Time (in seconds) within which you expect someone on the team to answer a handoff. It's used as a reference in **Analytics → Human support** and for the [unattended handoff](https://docs.chatnorris.ai/en/guias/notificaciones.md#unattended-handoff) alert. If you don't set it, 3 minutes is used. |
| **Business hours** | Optional. See below. |

> [!NOTE]
>
> **Auto-assign priority** (assigning an automatic priority level to the transferred conversation) appears on the screen with the **Coming soon** label: it's not available yet. When it launches, it will be exclusive to the Premium plan.

### Business hours

Turn on **Hand off only during business hours** so the agent only hands off to a person on the days and hours your team is available:

* Choose the **time zone** and, for each day, the **From / To** hours, or mark it as **Closed**. If the closing time is earlier than the opening time, the slot ends the next day (useful for night shifts).
* Outside those hours, the agent **doesn't transfer**: it explains the business hours, tries to resolve the question, and asks for contact details so the team can reply as soon as it's back.
* In **After-hours instructions** (optional) you can add what else the agent should say or do, for example "For emergencies, call +56 2 1234 5678".

> [!TIP]
>
> If the visitor asks to open a ticket or a support case and the agent has an active ticket action (Zendesk, Freshdesk, or Odoo Helpdesk), the agent uses that action instead of transferring to a person.

> [!TIP]
>
> The same goes for meetings: if the agent has a scheduling action ready (Cal.com, Calendly, Google Calendar, or Encuadrado), asking for a meeting or a call isn't a handoff, even if the visitor names an account executive or advisor. The agent offers them times. It only transfers if the visitor wants to talk to a person in this chat right now, or if they declined to book and keep asking for a human.

See also [Live chat and handoff](https://docs.chatnorris.ai/en/guias/chat-en-vivo-handoff.md) for how a conversation is handled once it's transferred.

## WooCommerce

Connects the agent to a WooCommerce store to answer questions about orders and inventory without leaving the chat.

**1. Connect your store from Integrations**

WooCommerce credentials (Store URL, Consumer key, and Consumer secret) are no longer entered inside this Action — they're connected once from **Integrations** (`My agents → [your agent] → Integrations → WooCommerce`). If you haven't connected it yet, this screen takes you straight there. See the full details in [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md).

**2. Choose what data the agent can look up**

In **Data access**:

* **Orders** — status, total, and items of an order, only after verifying the buyer's identity.
* **Inventory** — product availability by SKU.
* **Customer data** — reserved for future use; we recommend keeping it off for now.

**3. Configure order verification**

With **Order verification** on, the agent requires the order number plus at least one of these details before showing information: **Billing email**, **Billing phone**, or **Billing postal code**.

**4. Test the connection and enable the action**

The connection is tested from **Integrations**, with **Test connection**. Once it works, turn on **Action enabled** in the **General** section and save.

> [!WARNING]
>
> **We recommend Claude Sonnet or higher** as the agent's main model (**Settings → AI**). The action reveals an order's data only after verifying it, and in tests Haiku sometimes replies as if the data were already confirmed even when it isn't. The action's form shows this notice with a link to the AI settings.

> [!NOTE]
>
> **One store per agent.** An agent can have only one active store for looking up orders and stock (WooCommerce or Odoo). If you try to enable a second one, ChatNorris asks you to first turn off order and stock lookups on the other. Odoo can stay active for leads and tickets alongside a WooCommerce store.

### How the visitor looks up an order

In the **web widget**, when the agent detects that the visitor wants an order's status, it doesn't ask for the details by text: it shows an **embedded form** inside the chat with two fields — **Order number** and **Email or phone used for the purchase**. The form and the reply are shown in the widget's language (Spanish, English, or Portuguese), and it's the same for WooCommerce and Odoo. While the form is pending, the visitor can't write another message until they complete or cancel it.

* If the details match a real order, the agent replies with the status, total, and items.
* If they don't match, the agent says it couldn't verify the order and asks them to check the number and the contact detail — it never shows unverified information.

On **WhatsApp** and **Instagram** (where there are no embedded forms), the agent asks for these same details conversationally, inside the text chat.

### Sync your product catalog to the Knowledge Base

Besides looking up orders and inventory in real time, you can bring your product catalog into the knowledge base so the agent answers general questions about products (not just specific availability). From the same WooCommerce configuration screen, or from **Knowledge Base → Add source → WooCommerce**, click **Sync catalog**.

See the details in [Knowledge Base → WooCommerce source](https://docs.chatnorris.ai/en/guias/knowledge-base.md#woocommerce).

## Zendesk Tickets

> [!WARNING]
>
> This action is in the pilot stage: it appears locked as "Coming soon" in the selector unless ChatNorris has enabled the Zendesk Tickets pilot for your organization. If you need it, write to us at **[hola@chatnorris.ai](mailto:hola@chatnorris.ai)**.

Connects the agent to your Zendesk account to create support tickets and look up their status without leaving the chat.

**1. Connect your Zendesk account from Integrations**

The connection is made via OAuth (login with your Zendesk account) from **Integrations** (`My agents → [your agent] → Integrations → Zendesk`), not with manual credentials inside this Action. It's the same connection used by the Zendesk knowledge source — see [Knowledge Base → Zendesk](https://docs.chatnorris.ai/en/guias/knowledge-base.md#zendesk) and [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md).

**2. Define when it should create a ticket**

Like the other actions, you have a free-text field **When to use this action** to tell the agent in which situations it should offer to create a ticket.

**3. Configure verification**

In **Verification to check tickets**, the agent asks for and validates the necessary contact details: email is mandatory, and optionally phone too if you turn it on. The agent can only create a ticket after the visitor explicitly confirms they want to — it never creates one automatically in the middle of the chat.

> [!WARNING]
>
> **We recommend Claude Sonnet or higher** as the agent's main model (**Settings → AI**). In tests, Haiku sometimes ignores the confirmation and replies as if the ticket already existed, even though it wasn't created. The action's form shows this notice with a link to the AI settings.

> [!NOTE]
>
> For security, the agent can only look up the status of tickets it created itself (not any ticket in your Zendesk account), and always after validating the ticket number together with the verified contact details. These controls are applied on the server side and can't be relaxed by editing the "when to use" text. If you disconnect and reconnect the same Zendesk account, tickets created earlier can still be looked up.

### Resolve first, then the ticket

Ticket actions (Zendesk, Freshdesk, and Odoo Helpdesk) follow a fixed rule, above whatever you write in "When to use":

* If the visitor describes a problem or asks a question **without asking for a ticket**, the agent answers with the knowledge base. If it can't resolve it, or the visitor says the answer didn't help, it offers to create the ticket.
* If the visitor **asks for a ticket directly**, the agent first offers help (with the answer, if it has one, or by asking what's going on) and asks whether they'd still prefer the ticket.
* The ticket is started if the visitor insists, if the agent already tried and didn't have the information, or if the answer didn't help.

Looking up the status of an existing ticket doesn't go through this step. During a ticket flow, the agent also doesn't offer the Lead Form or a transfer to a person, so as not to confuse the visitor.

## Freshdesk Tickets

Connects the agent to your **Freshdesk** account to create support tickets and look up their status without leaving the chat. Available from the Standard plan.

**1. Connect Freshdesk from Integrations**

Go to **Integrations** (`My agents → [your agent] → Integrations → Freshdesk`) and enter your account's subdomain and a Freshdesk agent's API key. It's the same connection used by the [Freshdesk knowledge source](https://docs.chatnorris.ai/en/guias/knowledge-base.md#freshdesk). See [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md).

**2. Choose what it can do**

* **Create tickets** — creates a ticket after collecting subject, description, name, and email, and after receiving explicit confirmation from the visitor.
* **Check status** — shows only the subject and status of tickets created by this agent, after verifying the number and the email.

**3. Configure verification**

The ticket number and the email are always required to look up a ticket. If you turn on **Phone**, the agent also asks for it when creating the ticket and it must match when looking it up. Email and phone are stored only as a hash, never in plain text.

**4. Set the ticket defaults**

Choose the **Priority** (Low, Medium, High, or Urgent) and the **Tags** (comma-separated) that tickets are created with in Freshdesk.

> [!NOTE]
>
> The agent only creates the ticket with the name and email the visitor wrote in the conversation, and only after showing a summary and receiving an explicit "yes". There can be only one Freshdesk Tickets action per agent. We recommend Claude Sonnet or higher as the main model: in tests, Haiku sometimes replies as if the ticket already existed without having created it.

## Encuadrado — Scheduling

Connects the agent to your **Encuadrado** clinic calendar so it checks real availability and creates verified bookings without leaving the chat.

**1. Connect your Encuadrado account from Integrations**

Go to **Integrations** (`My agents → [your agent] → Integrations → Encuadrado`) and enter your Encuadrado API key. See [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md).

**2. Configure services and hours**

Define which services in your calendar the agent should be able to offer.

**3. The agent checks availability and books**

When a visitor wants to book, the agent checks the real available times and, only after the visitor **explicitly confirms**, creates the booking. It never books automatically in the middle of the chat.

> [!WARNING]
>
> **We recommend Claude Sonnet or higher** as the agent's main model (**Settings → AI**) when you turn on **Create bookings**. In tests, Haiku sometimes ignores the confirmation and replies as if the booking were already made. The action's form shows this notice with a link to the AI settings.

> [!NOTE]
>
> For services that issue a receipt (boleta), the agent validates the patient's comuna against the official list. Bookings follow Chile's time zone (`America/Santiago`).

## Send Email

Lets the agent send an email during the conversation — for example, to alert your internal team about a specific inquiry, or to send the visitor a copy of something they asked for.

**1. Define the recipient**

It can be a fixed address (for example, your sales team) or a visitor variable (for example, the email they left in the conversation).

**2. Define when it should be sent**

With the **When to use** field, tell the agent in which situations it should send the email. In **Frequency** you choose **Whenever applicable** or **Once per conversation**.

**3. Choose whether the visitor must confirm before sending**

Optionally, you can require the visitor to explicitly confirm before the agent sends the email.

> [!TIP]
>
> You can create several Send Email actions on the same agent — for example, one to alert sales and another to confirm something to the visitor.

> [!NOTE]
>
> Each successfully sent email uses 1 credit from the **email credits** balance, separate from AI credits. See [AI models and credits](https://docs.chatnorris.ai/en/guias/modelos-ia-creditos.md#email-credits). Available in the web widget and in messaging channels; not yet available for integrations via the public API.

## Cal.com — Scheduling

Connects the agent to a **Cal.com** event type so the visitor can book a meeting without leaving the chat.

> [!NOTE]
>
> Cal.com — Scheduling is included in **all plans**, Free included.

**1. Paste your Cal.com event's public link**

You only need the public URL of your Cal.com event type (`cal.com/...` or `www.cal.com/...`) — no account connection or credentials required.

**2. Customize the appearance and messages**

You can adjust the layout and theme of the embedded calendar, as well as the success and error messages the visitor sees.

In the **web widget** and in the **Playground**, the Cal.com calendar opens embedded inside the conversation. In messaging channels (WhatsApp, Instagram, Telegram, Messenger), the agent shares the event's direct link.

> [!TIP]
>
> If the visitor already left their contact details earlier (for example, in a Lead Form or during the chat), the Cal.com booking form is prefilled automatically with those details.

## Calendly — Scheduling

Connects the agent to a **Calendly** event type so the visitor books a meeting without leaving the chat. Available from the Standard plan.

**1. Paste your event type's public link**

You only need the event type's public link (`calendly.com/user/event`). There's no account to connect or API key to paste, so it **works with any Calendly plan, including the free one**.

**2. Define when to offer the calendar**

In **When to use**, describe in which situations the agent should offer the calendar (for example, "when they ask for a demo"). The calendar is offered whenever applicable, unless the visitor has already booked in that conversation.

**3. Adjust how the calendar looks**

* **Use the widget color** — applies your widget's main color to the calendar buttons.
* **Hide event details** — recommended in the chat: leaves only days and times.
* **Hide Calendly cookie banner** — keeps it from taking up space inside the chat.

**4. Customize the post-booking messages**

The **success message** is shown when the visitor finishes booking, and the **error message** if the calendar doesn't load.

In the **web widget** and in the **Playground**, the Calendly calendar opens embedded inside the conversation, with the visitor's name and email prefilled if they already confirmed them. On WhatsApp, Instagram, Telegram, Messenger, and Email, the agent shares the event type's link.

> [!NOTE]
>
> The booking happens in Calendly: ChatNorris doesn't store the booking data or charge extra credits for scheduling (only the conversation's AI turn). Calendly keeps sending its usual confirmations and reminders.

> [!TIP]
>
> If an agent has more than one scheduling action (for example, Cal.com, Calendly, and Google Calendar), it shows **a single calendar per reply**: the one that best fits what the visitor asked for. Describe clearly in "When to use" what type of meeting each one covers so it picks the right one.

## Google Calendar — Scheduling

Connects the agent to your **Google Calendar** so it checks your real availability, offers times to the visitor, and creates the appointment in your calendar without leaving the chat. Unlike Cal.com and Calendly, there's no external booking page here: ChatNorris calculates the free times with the rules you define and creates the event directly in your calendar.

> [!NOTE]
>
> Google Calendar — Scheduling is available from the **Standard** plan (not on Free). There can be only one action of this type per agent.

**1. Connect your Google account from Integrations**

Go to **Integrations** (`My agents → [your agent] → Integrations → Google Calendar`) and click **Connect with Google**. The account's **primary calendar** is used. See [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md#connect-a-provider).

**2. Create the action and define when to use it**

In **Actions → New action**, choose Google Calendar — Scheduling. In **When to use**, describe when the agent should offer times (for example, "when they want to book an assessment"). The safety rules (don't make up times, don't confirm on its own) always apply, even if you edit the text; you can go back to the original text with **Restore default text**.

**3. Configure the hours**

In the **Availability** section you define when appointments can be booked. ChatNorris crosses these hours with what's already busy in your calendar.

**4. Check the preview and enable the action**

In **Preview**, click **Show upcoming times** to see the times the agent would offer right now with the current configuration (even if you haven't saved it yet). To enable the action you need the connected account and at least one day with hours.

### Configuration options

| Option | What it does |
| - | - |
| **Time zone** | By default, **the calendar's** time zone. You can choose another one. |
| **Hours per day** (Monday to Sunday) | For each day, **from** and **to**, or **No appointments**. By default: Monday to Friday from 09:00 to 18:00. |
| **Appointment length** | How long each appointment lasts (30 min by default). Hidden if you add services. |
| **Buffer between appointments** | Free time before and after each appointment and your other events (0 to 60 min). |
| **Minimum notice** | How far in advance an appointment can be booked (from **No notice** up to 48 h; 2 h by default). |
| **Days ahead** | Up to how many days from today an appointment can be booked (1 to 60; 14 by default). |
| **Start times every** | How often a possible time starts: 15, 30, or 60 min (09:00, 09:30…). |
| **Slots offered** | How many times the agent shows at once (3 to 8), spread across days. |
| **Ask for phone** | Besides the name and email (always asked, because that's where the invitation goes), the agent asks for a contact phone number. |

### Services with different lengths

The **Services** section is optional. If you offer appointments of different lengths (for example, a 30-minute massage and a 60-minute one), add each service with its length (up to 20 services):

* **No services**: all appointments last what's set in **Appointment length**.
* **With a single service**: all appointments use its length and the agent doesn't ask which one they want.
* **With two or more services**: the agent asks the visitor which service they want and looks for times of that length.

### Holidays and closed days

* **Do not offer times on holidays** (on by default): public holidays of the **Country** are skipped; by default, the country is inferred from the time zone. You can choose another country and a **Region** (or **Whole country**). The section shows the **upcoming holidays**.
* **Closed days**: specific days you're not open (vacation, inventory, or a new holiday that doesn't appear on the list yet). Up to 100 days.

If the visitor asks for a closed day or a holiday, the agent tells them that day isn't available and offers the closest option.

### The event in your calendar

In the **Event** section you define how the appointment is created:

* **Event title** — by default "Appointment with \{\{name}}". Variables: `{{name}}` (visitor), `{{email}}`, `{{service}}` (chosen service), and `{{agent}}` (agent name).
* **Add a Google Meet link** — the invitation includes a Meet video call.
* **Confirmation message (optional)** — the agent adds it when the appointment is booked; for example, how to get there or what to bring.

The appointment is created in the connected account's primary calendar, **only after the visitor confirms**, and Google sends the invitation to their email.

### How the visitor books

1. When the conversation matches **When to use**, the agent checks your real availability and offers free times (always stating the time zone).
2. The agent asks for the name and email (and the phone, if you turned it on), shows a summary, and waits for an **explicit yes** from the visitor.
3. Before creating the appointment, ChatNorris checks again that the time is still free. If someone took it in the meantime, the agent offers new times.

In the **web widget**, instead of a text list, the visitor sees a **day and time picker**: they choose a day and a time, fill in their details (prefilled if they already left them in the conversation), and click **Book appointment**; that button is the confirmation. On **WhatsApp, Instagram, Telegram, Messenger, Email**, and the API, the agent offers the times as a text list and the visitor confirms in writing.

> [!NOTE]
>
> In the **Playground** you can test the whole flow, but **a real appointment is never created** in your calendar.

> [!NOTE]
>
> The details the visitor enters in the widget's picker are saved as their contact: the **lead** is created or updated, as with a Lead Form. Appointments booked by the agent appear in **Leads**, in the **Appointment** column and in the **Appointments** section of the lead's detail, and you can filter leads by **Upcoming appointment**. If you delete the event in Google Calendar, the appointment shows as canceled when you open the lead.

> [!WARNING]
>
> **We recommend Claude Sonnet or higher** as the agent's main model (**Settings → AI**). The agent must offer only the real times the system provides; smaller models sometimes make up times or treat an appointment as booked when the visitor only seems to agree.

> [!TIP]
>
> Google Calendar — Scheduling shares the scheduling classifier with Cal.com and Calendly: if an agent has more than one scheduling action, **only one per reply** is offered, the one that best fits what the visitor asked for. Make their **When to use** texts clearly distinct so it picks the right one; the form warns you if the agent has several.

> [!NOTE]
>
> If Google revokes access or you disconnect the account, the agent stops offering times and tells the visitor that scheduling isn't available. Reconnect the account in Integrations to resume it.

## Odoo

> [!WARNING]
>
> This action is **exclusive to the Premium plan**: on Free or Standard it appears locked as "Coming soon" in the selector. If you need Odoo, check the [plans](https://docs.chatnorris.ai/en/guias/modelos-ia-creditos.md) or write to us at [**hola@chatnorris.ai**](mailto:hola@chatnorris.ai).

Connects the agent to your **Odoo** ERP (self-hosted, Odoo.sh, or Online) to sync leads with your CRM and, if you have the Helpdesk module, create and look up support tickets.

**1. Connect your Odoo instance from Integrations**

Go to **Integrations** (`My agents → [your agent] → Integrations → Odoo`) and enter your instance's URL, the database (auto-detected if your server has only one), your username, and your API key. See [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md).

**2. Turn on the available capabilities**

The capabilities you can enable depend on which Odoo modules your instance has installed (detected automatically when you connect):

| Capability | What it does | Requires in Odoo |
| - | - | - |
| **Sync leads to Odoo CRM** | Every time a visitor confirms their contact details for the first time, a contact and an opportunity are created automatically in your Odoo CRM. | CRM module |
| **Check order status** | The visitor looks up the status of a sales order by giving the order number and the email or phone used for the purchase. In the web widget they do it with the same embedded form as WooCommerce. | Sales module |
| **Create support ticket** | The agent can create a support ticket in your Odoo Helpdesk, only after the visitor explicitly confirms. | Helpdesk module (Enterprise or the community version, `helpdesk_mgmt`) |
| **Check ticket status** | The agent can report the status of a ticket it created itself, after verifying the requester's identity. | Helpdesk module |
| **Check stock and price** | The agent searches products and variants in your Odoo and replies with the current sale price and stock, never with knowledge base data. | Sales module (`sale`) |
| **Build a purchase** | The agent builds a list of products from your store with the visitor and, when they want to buy, sends them each product's link. It doesn't create orders or charge: the final total, shipping, and payment are handled by your store. Requires turning on **Check stock and price** first. | Online store module (`website_sale`) |

If your instance doesn't have the corresponding module installed, that capability appears disabled. For tickets you can choose the Helpdesk's **Assigned team** and edit **When to create a ticket**.

> [!WARNING]
>
> **We recommend Claude Sonnet or higher** as the agent's main model (**Settings → AI**) if you turn on order lookups or tickets. In tests, Haiku sometimes ignores the confirmation and replies as if the ticket had already been created. The action's form shows this notice with a link to the AI settings.

### Shopping list with links to your store

With **Build a purchase** on, when the visitor wants to buy they receive a 🛒 block with each line (quantity × product = amount), a 🔗 link to each product's page in your store, and a reference **Total ≈**, without shipping. Before sending it, the agent reviews the list: it removes products that are no longer sold, updates prices, and flags those that are out of stock. If a product has no page in your store, the agent tells the visitor to search for it by name.

With **Check stock and price** on (in Odoo, WooCommerce, or another connected store), if the visitor asks for a recommendation without naming a product ("what do you recommend for 5 people?"), the agent checks the live catalog and suggests one or two specific options with their price, avoiding those that are sold out.

Cart and payment changes are logged as [internal notes](https://docs.chatnorris.ai/en/guias/conversaciones.md#internal-cart-notes) in the conversation.

> [!NOTE]
>
> Lead sync happens only once, at the moment the visitor confirms their details for the first time — if they later fill in additional details (for example, add their phone), that data isn't synced again automatically.

## HubSpot

Syncs the leads the agent confirms with your **HubSpot** CRM, without leaving the chat or exporting anything manually.

**1. Connect your HubSpot account from Integrations**

Go to **Integrations** (`My agents → [your agent] → Integrations → HubSpot`) and paste a HubSpot service key (Development → Keys → Service keys; an existing Private App token also works). See [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md).

**2. Turn on the capabilities you need**

The three capabilities are independent but hierarchical — turning on company or Lead requires **Sync contact** to be on:

| Capability | What it does | HubSpot scopes |
| - | - | - |
| **Sync contact** | Creates or updates a Contact in HubSpot every time a visitor's email is confirmed. New contacts come in with Lead status **New**; existing ones are never overwritten. | `crm.objects.contacts.read` and `.write` |
| **Sync company** | Finds or creates the visitor's company in HubSpot and associates it with the contact, using the lead's Company property or the "Empresa"/"Company" custom field. | `crm.objects.companies.read` and `.write` |
| **Create Lead object** | Creates a Lead record in HubSpot associated with the contact, only once per lead. Requires your HubSpot account to have the Leads tool available. | `crm.objects.leads.read` and `.write` |

> [!NOTE]
>
> The sync repeats every time the agent has the visitor's email confirmed: HubSpot creates the contact or updates the existing one (looking it up by email), so a phone or name the visitor fills in later also reaches HubSpot. Only the Lead object is created just once per lead. ChatNorris never reads or modifies any other data in your HubSpot account.

## LeadConnector (GoHighLevel)

Creates or updates the contacts the agent confirms in your **LeadConnector / GoHighLevel** sub-account. Available from the Standard plan.

**1. Connect your sub-account from Integrations**

Go to **Integrations** (`My agents → [your agent] → Integrations → LeadConnector`) and paste the sub-account's Private Integration Token and Location ID. See the steps to create the token in [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md#connect-a-provider).

**2. Choose the capabilities**

| Capability | What it does |
| - | - |
| **Sync contact** | Creates or updates the contact when the visitor confirms their email or phone. LeadConnector checks for duplicates according to your sub-account's settings. Name and company are only filled in if they're empty: they're never overwritten. |
| **Add tag** | Adds a tag to the contact (`chatnorris` by default, editable, up to 50 characters) without removing the ones it already has. Useful for triggering your workflows in LeadConnector. |
| **Conversation note** | Adds a note to the contact with the link to the conversation in ChatNorris, only once per lead. |

**Add tag** and **Conversation note** require **Sync contact** to be on.

> [!NOTE]
>
> ChatNorris never reads or modifies anything else in your LeadConnector account. Deleting the action doesn't remove the hub connection.

## Payment

Generates a payment link inside the chat for a closed catalog of items that you configure — the agent never makes up an amount.

**1. Connect SumUp, Mercado Pago, Flow, or Wompi from Integrations**

Go to **Integrations** (`My agents → [your agent] → Integrations`) and connect at least one of the providers: **SumUp** (Merchant code + API key), **Mercado Pago** (Public Key + Access Token), **Flow** (API Key + Secret Key, for businesses in Chile), or **Wompi** (four keys, for businesses in Colombia). See [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md).

**2. Choose the payment gateway**

In the Action, the **Payment gateway** field decides which connected provider generates the link. Changing it doesn't delete the item catalog or the connections — it only decides which one is used.

**3. Configure the item catalog**

Add each billable item with **Add item**: name, description (optional), amount, and currency. Currency is per item; the Action's **Currency** field only sets the default currency for new items. The agent can **only** charge the exact amounts configured here.

**4. Customize the success message and the return page**

The **post-payment message** is sent in the chat when the provider confirms the charge. The **return page** (optional) is where the visitor goes after paying; if left empty, they see the provider's own success screen.

### Import items from a CSV

If you have many items, use **Import CSV** in the catalog. The file's first row must have the headers; columns are recognized in any order:

| Column | Alias | Required? |
| - | - | - |
| `name` | `nombre` | Yes |
| `amount` | `monto`, `precio` | Yes (number greater than 0) |
| `description` | `descripcion` | No |
| `currency` | `moneda` | No (if missing, uses the Action's default currency) |
| `enabled` | `habilitado` | No (if missing, the item is enabled) |

Before importing, you see how many items were detected and how many rows were skipped: a row without a name or without a valid amount is discarded; a price is never made up. Imported items are added to the ones you already had.

> [!WARNING]
>
> We recommend using Claude Sonnet or a higher model as the main model on agents with this action. In tests, cheaper models (e.g. Haiku) sometimes confirm a payment or make up a receipt number without having generated any checkout, even with explicit instructions not to.

> [!NOTE]
>
> The agent always asks for explicit confirmation from the visitor before generating the payment link — this can't be turned off. Charges are processed in your own SumUp, Mercado Pago, Flow, or Wompi account: ChatNorris never receives the money or sees card data; it only generates the link and learns about the confirmation (which it always verifies with the provider before telling the visitor).

### Cart: several items in one charge

The visitor can build a cart with several catalog items in the same conversation: add, change quantities, and remove items, even several changes in a single message ("add one 60 and remove one 45"). The agent shows them the cart with the total and, when the visitor explicitly confirms they want to pay, generates **a single payment link for the total**.

* Prices always come from the Action's catalog and are revalidated on every turn. If a price changed, the agent asks again for confirmation of the new total.
* A cart never mixes currencies.
* If the visitor changes the cart in the same message in which they ask to pay, the agent doesn't generate the link: it first asks them to confirm the new total.
* When the payment is confirmed, the cart closes. If the visitor asks again for the link to the same cart, the agent reuses the one that's still valid.
* In the Playground a real payment link is never created.

**How the visitor sees it by channel:**

* **Web widget:** the cart appears as a **Your cart** card with each line (quantity × item and subtotal), the **Total**, and a **Pay** button with the amount that opens the payment page. If the cart changes, only the most recent card keeps the button.
* **Telegram and WhatsApp:** the payment link arrives as a **Pay** button below the message, instead of the URL pasted at the end of the text. If sending with the button fails, the agent sends the same message with the link in the text.
* **Other channels:** the link goes in the message text.

### After the payment

* **Resolved conversation:** if a conversation with a confirmed payment is closed due to inactivity and the visitor didn't write again after paying, it moves to **Resolved**. The change is applied once a day, so it may show as closed for a few hours.
* **Where to see payments:** in the conversation's Details, the **Payments** section appears (only if the conversation has confirmed payments). In Leads you have the **Payment** column, the **Paid** filter, and the **Payments** section in each lead's panel. See [Conversations](https://docs.chatnorris.ai/en/guias/conversaciones.md) and [Leads](https://docs.chatnorris.ai/en/guias/leads.md).

### Payments with Flow (Chile)

If you choose **Flow** as the gateway:

* Items must be in **Chilean pesos (CLP)**, with whole amounts of at least **350 CLP** (Flow's minimum). If any enabled item doesn't meet these rules, the Action asks you to fix or disable it before turning it on.
* Before generating the link, the agent asks for the visitor's **email** if it doesn't have it yet: Flow requires it to send them the receipt. If Flow rejects that email, the agent asks for another one.
* The visitor pays on Flow's page with **Webpay** (credit, debit, and prepaid), **Khipu** (transfer), or the other methods you have enabled in your Flow account.
* The link expires after 30 minutes; if it expires, the visitor can ask for a new one.

### Payments with Wompi (Colombia)

If you choose **Wompi** as the gateway:

* Items must be in **Colombian pesos (COP)**, with whole amounts of at least **1,500 COP**. The multi-item cart works the same as with the other providers.
* The visitor pays on Wompi's page with a card, **Nequi**, **Daviplata**, **PSE**, **Transferencia Bancolombia**, or **SU+ Pay**, depending on the methods you have enabled in your Wompi account.
* The link expires after 30 minutes; if it expires, the visitor can ask for a new one.
* For the payment to be confirmed even if the visitor closes the tab, paste the **Events URL** that ChatNorris shows you when connecting into Wompi (see [Integrations → Connect a provider](https://docs.chatnorris.ai/en/guias/integraciones.md#connect-a-provider)).

## Visitor confirmations

Actions that ask for confirmation before doing something real (creating a ticket, a booking, or a charge, or sending an email) accept a clear affirmation at the start of the reply: "sí", "confirmo", "es correcto", "correcto", "exacto", "así es", "perfecto", "claro", "está bien", "listo", "adelante", "dale", among others. If the reply includes "no", "cancela", "espera", or "pero" (for example, "sí, pero cambia el correo" — "yes, but change the email"), it doesn't count as confirmation and the agent asks again.

## Frequently asked questions

> [accordion] Can I have more than one action active at the same time?
>
> Yes, in two ways: you can turn on Lead Form, Human Handoff, and WooCommerce together (they're independent of each other), and you can also create several Lead Form instances if you need different configurations. The exceptions: Human Handoff and Freshdesk Tickets are unique per agent, and an agent can have only one active store (WooCommerce or Odoo) for looking up orders. The total number of instances you can have is limited by your plan.

> [accordion] What happens to the widget's previous 'lead capture' configuration?
>
> It was migrated automatically to the **Lead Form** action. If your widget already had lead capture turned on, you'll find it configured there.

> [accordion] Does Human Handoff keep working if I don't configure anything?
>
> The action comes turned on by default for existing agents, but we recommend filling in **When to Use** so the escalation criterion is more precise than the previous generic behavior.

> [accordion] Does WooCommerce work with any store?
>
> You need a WooCommerce store with the REST API enabled and credentials (consumer key/secret) generated from the WordPress dashboard. Use **Test connection** in Integrations to confirm everything is set up correctly.

> [accordion] Does the order lookup form appear on WhatsApp and Instagram too?
>
> No, the embedded form is exclusive to the web widget. On WhatsApp and Instagram the agent asks for the order number and the verification detail conversationally, inside the text chat.

> [accordion] Does the product catalog update on its own?
>
> No. Syncing the catalog to the Knowledge Base is manual — click **Sync catalog** every time you want to bring in price, stock, or new product changes.

> [accordion] Where are external accounts connected (WooCommerce, Zendesk, Freshdesk, Encuadrado, Google Calendar, Odoo, HubSpot, LeadConnector, SumUp, Mercado Pago, Flow, Wompi)?
>
> They're all connected from **Integrations**, a centralized hub per agent — not from each Action's screen. See [Integrations](https://docs.chatnorris.ai/en/guias/integraciones.md).

> [accordion] Why can't I create a Zendesk Tickets action?
>
> It's still in the pilot stage: your plan may include it, but ChatNorris has to enable it explicitly for your organization. Write to us at [hola@chatnorris.ai](mailto:hola@chatnorris.ai) if you need it.

> [accordion] Why can't I create an Odoo action?
>
> Odoo is exclusive to the Premium plan — if your organization is on Free or Standard, it doesn't appear as a creatable option. The rest of the actions with an external provider (Encuadrado, Freshdesk Tickets, Calendly, Google Calendar — Scheduling, HubSpot, LeadConnector, Payment) are available from the Standard plan, with no pilot needed. Cal.com — Scheduling and Send Email work on all plans, Free included (Send Email uses the plan's email credits).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.