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:
- List your available services with prices and durations
- Check open time slots for a specific date
- 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:
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": "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" }
}
}
}
}
}
}
}
}
}
}
}
}jsonReplace 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
- Click Preview in the top-right corner of the GPT editor.
- Ask: "What services do you offer?" — the GPT should call
list_servicesand display your services. - Ask: "Do you have anything available this Friday?" — the GPT should call
check_availability. - Pick a time and provide your name and email — the GPT should confirm the details and then call
book_appointment. - Check your Reservly dashboard — the booking should appear on the Bookingspage with the source "chatgpt".
Example 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
- REST API Reference— full endpoint documentation
- Webhooks— get notified when bookings are created
- All Integration Guides— connect with other platforms