Fresha logo

Fresha automation

Book Fresha appointments from client messages with an AI agent

Plenty of booking requests never touch your Fresha booking link. A regular sends "Friday afternoon with Sam, cut and colour?" by email, Instagram DM or WhatsApp, and someone at the front desk has to stop, open the Fresha calendar, find a gap long enough for both services and type a reply.

Cotlet does it in your own Fresha account with list_clients, get_client, add_client, list_services, list_team_members, find_available_slots and create_appointment, called by your AI agent, an n8n workflow or a script.

Hosted · nothing to install or maintain

Official options

Can Fresha do this on its own?

Fresha has no public API for booking (checked 12 Oct 2026). Fresha offers its own online booking, Client Connect chat that clients open from their confirmed booking page in the Fresha app, and an AI Concierge add-on that answers incoming calls and messages. The gap: a request that reaches you by email, Instagram or WhatsApp still has to be booked by hand in the Fresha calendar, and Fresha gives your own agent no way to book.

By hand

How you do it in Fresha today

  1. Read the request in the app it arrived in (email, Instagram or WhatsApp) and work out the client, the services and the preferred team member and time.
  2. In Fresha, open Calendar, click Add in the toolbar and select Appointment, then pick the existing client or create a new client profile.
  3. Select the first service with Add service, add the second one the same way and set the requested team member on each service.
  4. Click Continue to see open slots for the day. When nothing fits, try Next available date, Check all professionals or Join the waitlist, then Continue and Save.
  5. Go back to the message app and type the confirmed time to the client. Every request means switching between two apps, and a misread service length or a second client with the same first name ends up as a wrong booking.

With an agent

How to book Fresha appointments from client messages with an AI agent

Prompt

Anna Smith just emailed asking for a cut and colour with Sam on Friday afternoon. Find her in Fresha, book the first slot that fits both services and draft my reply.
  1. 01

    Match the sender to one client profile

    The agent searches list_clients by the phone number or email the message came from, then by name. Two profiles with the same name mean it stops and asks which one. No match at all means a new profile with add_client, using only the details the client gave.

  2. 02

    Turn the wording into service IDs

    "Cut and colour" becomes two IDs from list_services, in the order the salon performs them. list_team_members confirms that Sam offers both at this location; if not, the agent says so instead of booking Sam for one service only.

  3. 03

    Search only the window the client named

    find_available_slots runs for Friday with Sam. The agent keeps the slots that start after noon and still end before closing. If Sam has nothing, it checks Saturday with Sam and Friday with anyone, and offers both instead of choosing for the client.

  4. 04

    Check the profile before booking

    get_client shows upcoming appointments, so a client who already holds a Friday booking is not booked twice. Team notes, such as a colour formula, go into the summary for the stylist.

  5. 05

    Book with a named team member, then draft the reply

    create_appointment waits for your OK and always passes team_member_id, because a booking made by staff in the calendar does not go through Fresha's automatic assignment rules. After the booking the agent writes a short reply with the date, time, stylist and services for you to send in the channel the request came from.

What you get back

Example data

Matched: Anna Smith (+44 7700 900123), last visit 20 Jun, Colour
Services: Haircut 45 min + Colour 90 min, 2 h 15 min with Sam
Friday 16 Oct with Sam: 14:30 to 16:45 free, 13:00 too short
Booked after your OK: Fri 16 Oct 14:30, Sam, status Booked
Note for Sam: "Prefers a warm toner, no fragrance."
Draft reply: "Hi Anna, you are booked with Sam on Friday 16 Oct at 2:30 pm for a cut and colour. See you then!"

Other ways to ask

  • Here are three booking requests from this morning's inbox. Book each one and give me a reply for each.
  • A new client, Maya Patel, +44 7700 900456, wants a gel manicure next Tuesday after 5 pm with anyone. Create her profile and book it.
  • Do not book yet. Tell me the two best Friday options for Anna with Sam so I can offer them.
  • Book Anna every four weeks for a root touch-up with Sam until December, same weekday and time if free.

Before you automate it

What Fresha allows, and what to know first

  • Fresha applies its New appointment assignment strategy (Fill open calendars, Take turns and the others) only to online bookings with no team member preference; appointments your team creates in the Calendar are not assigned automatically.
  • Fresha lets staff double book the same time slot from the Calendar, so a booking made by hand does not stop an overlap on its own.
  • Fresha sends the client a booking confirmation according to your notification settings, and with appointment protection switched on the client must pay upfront or add card details.
  • Fresha Client Connect messages start from the client's confirmed booking page in the Fresha app, and Fresha lists Meta and Instagram messaging as a planned expansion on its Connect page.

create_appointment asks for your OK by default. To run it on a schedule without you, switch confirmation off for that tool in your dashboard.

Sources: Fresha Help Center: Create appointments · Fresha Help Center: Set up new appointment assignment · Fresha: Connect (Client Connect and AI Concierge)

REST

Call create_appointment from a script

curl

curl https://cotlet.dev/api/v1/fresha/create_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"cl_48213977","start_at":"2026-10-16T14:30:00+01:00","service_ids":["sv_1203","sv_1288"],"team_member_id":"tm_5521"}'

Example response

{
  "appointment_id": "ap_90311245",
  "status": "Booked",
  "start_at": "2026-10-16T14:30:00+01:00",
  "end_at": "2026-10-16T15:15:00+01:00",
  "services": [
    {
      "service_id": "sv_1203",
      "name": "Haircut",
      "price": "45.00",
      "currency": "GBP"
    }
  ],
  "team_member": "Sam"
}

MCP: add https://cotlet.dev/mcp/v1 with the same key; the tool is fresha_create_appointment. Example data.

Schedule it in n8n, Make, Zapier or cron

Tools

Fresha tools this automation uses

Cotlet Fresha tools used to book Fresha appointments from client messages with an AI agent
Tool Parameters
list_clients search, last_appointment_before, location_id, limit, cursor
get_client client_id
add_client first_name, last_name, email, phone
list_services location_id
list_team_members location_id
find_available_slots service_ids, date, team_member_id, location_id
create_appointment client_id, start_at, service_ids, team_member_id, location_id, note
All 14 Fresha tools with descriptions

Frequently asked questions

Can the client pick a different team member for each service?

Yes. Fresha lets you set the team member on each service of an appointment, and its Allow splitting multi-service appointments across team members setting does the same for online bookings.

Give your agent access to Fresha.

Free 7-day trial with 5,000 credits, no card needed. Cotlet is independent and not affiliated with Fresha.