Skip to main content

ChatGPT Custom GPT Integration

Create a Custom GPT that your customers can chat with to browse services, check availability, and book appointments — all inside ChatGPT.

What You'll Build

A ChatGPT-powered booking assistant that handles three things for your customers:

  1. List your available services with prices and durations
  2. Check open time slots for a specific date
  3. Book an appointment and confirm the details

Prerequisites

  • A ChatGPT Plus, Teams, or Enterprise subscription (Custom GPTs require a paid plan).
  • A Reservly account with an API key (write scope). Go to Settings → Integrations to generate one.

Step 1: Create a Custom GPT

In ChatGPT, click your name in the bottom-left corner and select My GPTs → Create a GPT. Switch to the Configuretab where you'll set up the name, instructions, and actions.

Give your GPT a name like "Luxe Salon Booking Assistant" and optionally upload a profile image.

Step 2: Set Instructions

In the Instructions field, paste a system prompt that tells the GPT how to behave:

System prompt
You are a booking assistant for Luxe Salon & Spa. Help customers browse services, check available times, and book appointments. Always confirm the booking details before making the appointment.

Follow this flow:
1. Greet the customer and ask what service they're interested in.
2. Use the list_services action to show available services with prices.
3. Once they pick a service, ask what date works for them.
4. Use the check_availability action to find open slots.
5. Present the available times and let them choose.
6. Collect their name and email address.
7. Confirm all details (service, date, time, name, email) before booking.
8. Use the book_appointment action to create the booking.
9. Let them know they'll receive a confirmation email.
text

Step 3: Add Actions (OpenAPI Schema)

Scroll down to the Actions section and click Create new action. You can either import from a URL or paste the schema directly. Paste the following OpenAPI 3.0 schema that defines three endpoints:

OpenAPI schema
{
  "openapi": "3.0.0",
  "info": {
    "title": "Reservly Booking API",
    "version": "1.0.0",
    "description": "API for browsing services, checking availability, and booking appointments."
  },
  "servers": [
    {
      "url": "https://reservly.io/api/public/luxe-salon"
    }
  ],
  "paths": {
    "/services": {
      "get": {
        "operationId": "list_services",
        "summary": "List available services",
        "description": "Returns all bookable services with names, durations, and prices.",
        "responses": {
          "200": {
            "description": "A list of services",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "services": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": { "type": "string" },
                          "name": { "type": "string" },
                          "duration_minutes": { "type": "integer" },
                          "price": { "type": "number" },
                          "description": { "type": "string" }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/slots": {
      "get": {
        "operationId": "check_availability",
        "summary": "Check available time slots",
        "description": "Returns available time slots for a specific date and service.",
        "parameters": [
          {
            "name": "date",
            "in": "query",
            "required": true,
            "schema": { "type": "string", "format": "date" },
            "description": "Date to check in YYYY-MM-DD format."
          },
          {
            "name": "service_id",
            "in": "query",
            "required": true,
            "schema": { "type": "string" },
            "description": "The service ID to check slots for."
          }
        ],
        "responses": {
          "200": {
            "description": "Available time slots",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "slots": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "time": { "type": "string" },
                          "available": { "type": "boolean" }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/book": {
      "post": {
        "operationId": "book_appointment",
        "summary": "Book an appointment",
        "description": "Creates a new booking for the given service, date, time, and customer.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["service_ids", "date", "time", "customer_name", "customer_email"],
                "properties": {
                  "service_ids": {
                    "type": "array",
                    "items": { "type": "string" },
                    "description": "Array containing the service ID to book."
                  },
                  "date": {
                    "type": "string",
                    "format": "date",
                    "description": "Booking date in YYYY-MM-DD format."
                  },
                  "time": {
                    "type": "string",
                    "description": "Booking time in HH:MM format (24-hour)."
                  },
                  "customer_name": {
                    "type": "string",
                    "description": "Customer's full name."
                  },
                  "customer_email": {
                    "type": "string",
                    "format": "email",
                    "description": "Customer's email address."
                  },
                  "source": {
                    "type": "string",
                    "description": "Booking source for attribution.",
                    "default": "chatgpt"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Booking confirmation",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "booking": {
                      "type": "object",
                      "properties": {
                        "id": { "type": "string" },
                        "status": { "type": "string" },
                        "date": { "type": "string" },
                        "time": { "type": "string" }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
json

Replace luxe-salon in the server URL with your own business slug.

Step 4: Set Authentication

Still in the Actions section, click the Authentication gear icon and configure:

  • Authentication type: API Key
  • API Key: Bearer rsvly_YOUR_KEY (paste your full key including the Bearer prefix)
  • Auth Type: Custom
  • Custom Header Name: Authorization

This ensures every request the GPT makes includes your API key. The read endpoints (services, slots) work without a key, but the booking endpoint requires one.

Step 5: Test Your GPT

  1. Click Preview in the top-right corner of the GPT editor.
  2. Ask: "What services do you offer?" — the GPT should call list_services and display your services.
  3. Ask: "Do you have anything available this Friday?" — the GPT should call check_availability.
  4. Pick a time and provide your name and email — the GPT should confirm the details and then call book_appointment.
  5. Check your Reservly dashboard — the booking should appear on the Bookingspage with the source "chatgpt".

Example Conversation

Sample conversation
Customer: Hi! I'd like to book a haircut.

GPT: Welcome to Luxe Salon & Spa! Let me check our available services for you.

[Calls list_services]

GPT: Here are our services:
  - Women's Haircut — $65 (45 min)
  - Men's Haircut — $40 (30 min)
  - Blowout — $50 (40 min)
  - Color Treatment — $120 (90 min)

Which service would you like? And what date works for you?

Customer: Men's haircut, this Saturday please.

GPT: Let me check availability for Saturday...

[Calls check_availability with date=2026-04-04, service_id=abc123]

GPT: Here are the open slots for Saturday:
  - 9:00 AM
  - 10:30 AM
  - 1:00 PM
  - 3:30 PM

Which time would you prefer?

Customer: 10:30 works.

GPT: Great choice! To complete the booking I'll need:
  - Your full name
  - Your email address

Customer: John Smith, john@example.com

GPT: Let me confirm:
  - Service: Men's Haircut ($40)
  - Date: Saturday, April 4
  - Time: 10:30 AM
  - Name: John Smith
  - Email: john@example.com

Shall I go ahead and book this?

Customer: Yes please!

[Calls book_appointment]

GPT: You're all set! Your appointment has been booked. You'll receive a confirmation email at john@example.com shortly.
text

Example Use Case

Luxe Salon & Spashares their Custom GPT link on their Instagram bio and website. Customers who prefer text-based interaction can open the GPT, browse services, and book appointments through a natural conversation. The salon owner sees all GPT-booked appointments in their dashboard with the source "chatgpt" for tracking.

Next Steps